Ein professioneller Papierfalter.
ALGORITHMEN - Teil XXV: Das Fleisch ist willig, aber der Geist ist schwach...
-
p. specht -
21. Februar 2020 um 03:02 -
Geschlossen
-
-
-
Abt. FGS-71 ´Kalenderfalter´
===================
Neulich fand ich einen alten Kalender. Im Januar (Ö: Jänner)-Blatt fanden sich 4 Montage und 4 Freitage. Auf welchen Wochentag fiel da der 1.1. ? -
zu FGS-71
Spoiler anzeigen
Jedes Jahr wo der 1.Jänner auf einen Dienstag fällt
2019
2013
2008
2002
1991
1985
1980
1974
1963
1957
... -
Abt. FGS-72
========
Bei einer vierstelligen Zahl sind die letzten beiden Ziffern leider stark verwischt: 17?? ist noch zu sehen. Man weiß aber: Es war eine korrekte Lösung der Aufgabe 'Finde irgendeine vierstellige Zahl, die restlos duch 2, durch 3, 4, 6 und 9 teilbar ist!'. Wie lauten die beiden verwischten Ziffern? -
zu FGS-72
Spoiler anzeigen
Code
Alles anzeigencls Declare int i, Anzahl Declare string Ergebnis Print "\nLösungen: "; For i, 1700, 1799 ' Locate 1,20 ' Print str$(i); If (i mod 2) == 0 If (i mod 3) == 0 If (i mod 4) == 0 If (i mod 6) == 0 If (i mod 9) == 0 CaseNot Anzahl = 0 : Ergebnis = Ergebnis $ ", " Inc Anzahl Locate 1,1 Ergebnis = Ergebnis $ str$(i) Print str$(Anzahl); EndIf EndIf EndIf EndIf EndIf EndFor 'WaitInput Locate 4,1 Print Ergebnis WaitEnd ' Mist. Ich hatte gedacht, das es etwas länger dauert. ' 1728, 1764
-
@Michael Wodrich hat FSR 71 und FSR 72 korrekt gelöst.
Bei FSR-72 wollte ich erst gar nicht glauben, daß tatsächlich ZWEI Lösungen existieren, im japanischen Internet ist nämlich nur eine Lösung zu finden. Ich habe daher sein Lösungsprogramm für XProfan-11.2a umgeschrieben und mit einer Probe versehen. Ergebnis: Michael Wodrich hat recht!
GrussCode
Alles anzeigenWindowTitle "FGS-71-Solver für XPr11.2a (Brute Force)":cls:font 2 Declare i&,Anzahl&,Ergebnis$' Eine Zahl die durch 9 teilbar ist, ist es auch durch 3 Whileloop 1700,1799:i&=&Loop' Eine Zahl die durch 4 teilbar ist, ist es auch durch 2 Ifnot i& mod 9:Ifnot i& mod 6:Ifnot i& mod 4 Case Anzahl&:Ergebnis$=Ergebnis$+", " Ergebnis$ = Ergebnis$ + str$(i&):Inc Anzahl& EndIf:EndIf:EndIf EndWhile Print "\n Lösungen:\n\n "+Ergebnis$ Print "\n Anzahl Lösungen:",str$(Anzahl&) ' 1728, 1764 print "\n\n Probe:" declare tmp$[]:tmp$[]=explode(Ergebnis$,",") declare tmp&[sizeof(tmp$[])-1] tmp&[]=val(tmp$[&index]):clear tmp$[]:set("decimals",0) Whileloop 0,sizeof(tmp&[])-1 print "\n "+str$(tmp&[&Loop])+":",tmp&[&Loop] mod 2,tmp&[&Loop] mod 3, print tmp&[&Loop] mod 4,tmp&[&Loop] mod 6,tmp&[&Loop] mod 9 endwhile waitinput
P.S.: Interessantes Link zu 'genialen' Rechentricks
-
Abt. FGS-73
========
Zwei von Form und Größe her deckungsgleiche Quadrate aus Papier, beide mit Seitenlänge 8 cm, werden so hingelegt, daß eine Ecke des einen Quadrates genau im Mittelpunkt (Kreuzungspunkt der Diagonalen) des anderen Quadrates zu liegen kommt. Wie groß ist die Überdeckungsfläche der beiden Quadrate, wenn das eine gegen das andere Quadrat (Frage 1) um 30° verdreht liegt; (Frage 2) um 45 ° verdreht liegt? -
Zu FGS-73:
Bei 45° ist es ein Viertel der Gesamtfläche.
-> 8 * 8 /4 = 16 cm²Bei 30° lasse ich den Experten den Vortritt.
Tschau
-
Ergänzend: (Frage 3) bei 0 ° ?
-
Egal wie es gedreht wird, die Überdeckungsfläche ist immer gleich groß, nämlich genau 1/4 …
Rabe
-
Erstaunlich, was? Ein Bravo an @Oldi-40 und ravenheart!
Abt. FGS-74 'Sommeridylle'
==================
Albin, Bernd, Christian sowie Ulli und Vicky spielen am Strand Wasserball. Die beiden Mädchen werfen den Ball entweder dem anderen Mädchen oder einem der Jungs (Ö: Buben) zu. Die Jungs sind wild und schießen den Ball stets auf einen anderen Knaben - nur nie auf den, von dem sie den Ball gerade erhalten haben. Vicky hatte begonnen und warf den Ball etwas ungeschickt zu Albin. Frage: Wer machte den fünften Wurf? -
Abt. FGS-75 ´Summsumm´
=================
Die Summe der letzten drei von sieben aufsteigend aufeinanderfolgenden natürlichen Zahlen ist 91. Wie groß ist die Summe der ersten drei dieser sieben Zahlen? -
Zu FGS-75
Da musste ich erst einmal Nachschlagen, ob ich vergessen habe was "natürliche Zahlen" sind.
Ich komme da zu keinem Ergebnis.Spoiler anzeigen
Code
Alles anzeigen' vX4 cls declare int a[], i var int start = 1 var int erg = 1 var int summe = 0 Repeat for i, 0, 6 a[i] = start + i endfor for i, 0, 6 print if(i != 0, ", ", ""); a[i]; endfor summe = a[4] + a[5] + a[6] print " --> "; summe if summe >= 91 erg = start break endif inc start Until start >= 30 print "\nDie Zahlenfolge ist: "; for i, 0, 6 print if(i != 0, ", ", ""); a[i]; endfor print "\nDie ersten 3 Zahlen ergeben: "; str$(a[0] + a[1] + a[2]) print "\nDie letzten 3 Zahlen ergeben: "; str$(a[4] + a[5] + a[6]) waitend rem Startwert 26 ergibt vorne 81 und hinten 93
Startwert 26 ergibt vorne 81 und hinten 93
-
Und das war auch schon die richtige Antwort, lieber @Michael Wodrich!
Erklärung: Die 91 waren ein blöder Schreibfehler, gemeint war tatsächlich 93! - Sonderlob! -
Abt. FGS-76 ´Ausser Konkurrenz´
======================
Geg: x * int( x * int( x * int( x ))) = 2020
Ges: x, d.h. ein (oder mehrere?) positive oder negative Float-Werte!
Hinweis: Manuelle Lösung in diesem Youtube-Video (falls man die englische, etwas gequetschte Stimme verträgt): LINKFrage: Wie könnte man ein Lösungsprogramm schreiben, das diese und ähnliche Aufgaben bewältigt?
-
zu FGS-76:
Spoiler anzeigen
Das Programm bestätigt nur - es gibt keine LösungCode
Alles anzeigendeclare i1%,i2%,i3%,i4%, prod&, counter& set("logfile","c:\Temp\FGS-76a.txt") cls Whileloop -7,7 i1% = &loop locate 1,1 : print i1%;" " : locate 1,9 : print i2%;" " locate 1,18 : print i3%;" " : locate 1,27 : print i4%;" " Whileloop -7,7 i2% = &loop locate 1,1 : print i1%;" " : locate 1,9 : print i2%;" " locate 1,18 : print i3%;" " : locate 1,27 : print i4%;" " if Between((i1% * i2%),-2020,2020) Whileloop -7,7 i3% = &loop locate 1,1 : print i1%;" " : locate 1,9 : print i2%;" " locate 1,18 : print i3%;" " : locate 1,27 : print i4%;" " if Between((i1% * i2% * i3%),-2020,2020) Whileloop -7,7 i4% = &loop locate 1,1 : print i1%;" " : locate 1,9 : print i2%;" " locate 1,18 : print i3%;" " : locate 1,27 : print i4%;" " prod& = i1% * i2% * i3% * i4% if Between(prod&,-2020,2020) if (prod& = 2020) or (prod& = -2020) inc counter& locate 4,1 : print "Treffer:",str$(counter&) logout str$(i1%) + " * " + str$(i2%) + " * " + \ str$(i3%) + " * " + str$(i4%) + " = " + \ str$(prod&) endif endif EndWhile endif EndWhile endif EndWhile EndWhile
Ich habe mit der 4. Wurzel den Rahmen abgesteckt und mit Brute Force geprüft, ob es da doch eine Lösung gibt.
Wenn ich in der Formel mit Int() arbeite, dann brauche ich Real-Zahlen nicht zu untersuchen. Sie werden ja auf Ganzzahlen korrigiert.
Aber meiner bescheidenen Meinung nach werden auch floor() und ceiling() auf Ganzzahlen korrigiert.
Deshalb verstehe ich nicht, das mir die Mathematik hier weismachen will, das es da ein Ergebnis für gibt. Denn die dort im Video eingesetzten Variablen, egal ob Komma oder Fraktion, sind Real-Zahlen. -
Tja, der Typ dort bekommt aber eine Lösung raus, die man nachprüfen kann. Es gibt also eine, weil das "linkeste x" ja nicht in einer Floor-Funktion steckt, sondern Float bleibt. Die Schwierigkeit liegt in den durch floor gegebenen Unstetigkeiten. Floor durch Int zu ersetzen, das klappt übrigens auch nur im positiven Zahlenbereich. Manche Lösungen gibt´s aber offenbar nur im Negativen.
Mein eigener Lösungsversuch - mit der Strategie "Immer enger eingrenzen zwischen xu und xo" - hat jedenfalls bisher nicht hingehauen: Das Ding stoppt bei falschen Werten, bin am tüfteln wieso*). Ich geb´s also erst mal eine Nummer kleiner und möchte als "Vorwärtsstrategie" die Funktionskurve - "Funktionsgraph" trifft wohl eher zu - ermitteln.
Gruss
_____
*) Eventuell wird das x, das ja in der 4. Potenz steht, in den Kommastellen so empfindlich, daß die Rechenergebnisse stets weit neben 2020 bleiben? -
Nur negative Lösungen hört sich irgendwie nach Komplexen Zahlen an.
Floor und Ceiling habe ich so...
Code
Alles anzeigen' Return the ceiling of x as a float, the smallest integer value greater than or equal to x. Proc _ceil 'Höchstbetrag Parameters x! If x! = Abs(x!) If x! = Int(x!) return int(x!) Else return int(x!) + 1 EndIf Else If x! = Int(x!) return int(x!) Else return int(x!) EndIf EndIf EndProc ' Return the floor of x as a float, the largest integer value less than or equal to x. Proc _floor 'Boden Parameters x! If x! = Abs(x!) If x! = Int(x!) return int(x!) Else return int(x!) EndIf Else If x! = Int(x!) return int(x!) Else return int(x!) - 1 EndIf EndIf EndProc
von hier geholt.
-
Diese floor() und ceiling()-Definitionen in deinem Programm sind korrekt - danke für die Klarstellung! (Das Int dort arbeitet allerdings nur im +/-2^31-Bereich korrekt, aber daas sollte ja reichen).
Mein Fehler war, die Videoaufgabe x*floor(x*floor(x*floor(x)))=2020 mit int int int zu übersetzen, denn: Im positiven x-Bereich hat das Beispiel tatsächlich keine Lösung! Das korrekte Ergebnis ist ja x = -2020/305. Mit int statt floor kann das im Negativen nicht klappen!
Tschisas, manchmal steht man sowas von am Schlauch!
Gruss -
Hier - ohne jeden Anspruch auf Allgemeingütligkeit - mein Versuch, das Floor-Problem ausser Konkurrenz zu lösen.
(FGS-76 in der Int-Form hat keine Lösung - Michael Wodrich hatte wieder einmal recht!)Code
Alles anzeigenWindowTitle "Ausser Konkurrenz das Floor-Problem lösen, early Beta-Version" CLS:Appendmenubar 100," x*floor(x*floor(x*floor(x))=2020" proc Fun :parameters x! return x!*floor(x!*floor(x!*floor(x!))) endproc var y!=2020 '-------------- var flg& = 0 '>=1: Debug mode print "\n Debug mode? [0/1]: ";:input flg& '-------------- declare x!,xu!,xo!,mu&,mo&,m& proc floor :parameters x! return if((x!<0) and (x!<>int(x!)),int(int(x!)-1),int(x!)) endproc rep: if flg& locate 2,1 print " Floortestwert [0 für Ende] = ";:input x! print " Floor = ";floor(x!) Endif casenot x!=0:goto "rep" Cls case flg&:print " Positiver x-Bereich" x!=Sqrt(Sqrt(y!)) case flg&:print " Startwert x=";x! xu!=floor(x!) xo!=floor(xu!+1) case flg&:print " xu=";xu!," xo=";xo! 'xu < x < xo 'x*m=y ===> x=y/m , eingesetzt: 'xu < y/m < xo , invertiert: '1/xo < m/y < 1/xu 'y/xo < m < y/xu 'mu = floor(y/xo); mo = floor(y/xu + 1) mu& = floor(y!/xo!) : mo& = floor(y!/xu!) case flg&:print " mu=";mu&," mo=";mo& Whileloop mu&,mo&:m&=&Loop x! = y!/m& case flg&:print " Test für x = ";y!;"/";m&,"=",x!,"f =",fun(x!) if nearly(Fun(x!),y!,1):sound 1000,100 font 2:print "\n LÖSUNG x = ";y!;"/";m&,"=",x!,"f =",fun(x!):font 0 waitinput 100 endif if %csrlin>20:waitinput:cls:endif endwhile case flg&:print "\n Negativbereich:" x!=-1*Sqrt(Sqrt(y!)) case flg&:print " Startwert x=";x! xu!=floor(x!) xo!=floor(xu!+1) case flg&:print " xu=";xu!," xo=";xo! mu& = floor(y!/xo!-1) : mo& = floor(y!/xu!) case flg&:print " mu=";mu&," mo=";mo& Whileloop mu&,mo&:m&=&Loop x! = y!/m& case flg&:print " Test für x = ";y!;"/";m&,"=",x!,"f =",fun(x!) if nearly(Fun(x!),y!,1):sound 1000,100 font 2:print "\n LÖSUNG x = ";y!;"/";m&,"=",x!,"f =",fun(x!):font 0 waitinput 100 endif if %csrlin>22:waitinput:cls:endif endwhile Font 2:print " ---\n Tests komplett." sound 200,330 waitinput end
P.S.: FGS-74 ist noch offen!
-
Jetzt mitmachen!
Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!