Sie erhalten die Funktionen: h1 (f, * args) und h2 (f, * args)
Beides sind für Sie bereits definierte Methoden (hier kennzeichnet der Stern eine variable Anzahl von Argumenten)
f ist eine Funktion, * args ist eine Liste von Parametern, die an diese Funktion übergeben werden sollen
h1 gibt einen booleschen Wert zurück: True, wenn die Funktion f beim Aufruf von * args immer anhält, und False, wenn dies nicht der Fall ist (vorausgesetzt, der Computer hat unendlich viel Zeit und Speicher und der Interpreter / Compiler für die Sprache, in der Sie schreiben) weiß, wie man mit unendlicher Zeit und unendlichem Gedächtnis umgeht).
Wenn f (* args) jemals h1 oder h2 aufrufen würde, löst h1 eine Ausnahme aus
h2 verhält sich genauso wie h1, außer dass h2 keine Ausnahme auslöst, wenn f h1 aufruft
Schreiben Sie in möglichst wenigen Zeichen ein Programm, das keine Eingabe benötigt und ausgeben soll:
The Collatz Conjecture is {True/False}
Goldbach's Conjecture is {True/False}
The Twin Primes Conjecture is {True/False}
basierend auf der Gültigkeit jeder dieser Vermutungen.
Hier sind Wikipedia-Links, die jede der Vermutungen erklären:
http://en.wikipedia.org/wiki/Collatz_conjecture
http://en.wikipedia.org/wiki/Goldbach%27s_conjecture
http://en.wikipedia.org/wiki/Twin_prime
Sie können davon ausgehen, dass jede Bibliothek mit großen Ganzzahlen in der von Ihnen gewählten Sprache beliebige große Ganzzahlen darstellen kann. Mit anderen Worten, wir gehen davon aus, dass jede Sprache / Bibliothek, die in der Lage ist, sich auszudrücken, 3**(3**10)
sich auch 3**(3**(3**10))
auf einer ausreichend leistungsfähigen Maschine ausdrücken kann.
Da es unmöglich ist, Ihr Programm auszuführen, erläutern Sie bitte, wie es zusammen mit dem Code funktioniert
Antworten:
J, 207
Ich entschied mich für
f
undg
anstelle vonh1
undh2
, wie es der Gabe entsprach. Zum Umschalten genügen zwei zusätzliche Zeilen mit insgesamt 10 Zeichen vor:f=:h1
,g=:h2
.Und die eigentliche Logik:
Collatz
((-:`>:@*&3)^:(~:&1))^:_
ist das Fleisch davon; Es ist im Wesentlichen eine Schleife, die tutwhile (x != 1) x = collatz(x)
. Wenn wir diesen Satz nennenreduce
:reduce&f
soll ein monadisches Verb sein (siehe Ende), woreduce&f n
es wahr ist, wenn esreduce(n)
anhält. Die anderen Schleifen-y-Bits>:^:()^:_
sind im Wesentlichen eine Endlosschleife (>:
ist Inkrement,^:
kann als Bedingung und als Iterator verwendet werden), die beim Auftreten einer Collatz-Reduktion unterbrochen wird, die nicht stoppt. Schließlichg
wird aufgerufen, um zu sehen, ob die Endlosschleife jemals endet.Goldbach
Die gleiche Logik zum größten Teil, der offensichtliche Unterschied, der die Kernberechnung ist, ist jetzt
+./@1&p:@(-p:@_1&p:)
.-p:@_1&p:
berechnet die Differenz zwischen einer Zahl und allen Primzahlen, die kleiner als diese Zahl sind,1&p:
ist eineisPrime
Funktion und+./
ist ein logisches ODER. Wenn also die Differenz zwischen einer Zahl und einer Primzahl, die kleiner als diese Zahl ist, ebenfalls eine Primzahl ist, ist die Goldbach-Vermutung erfüllt und die Endlosschleife wird fortgesetzt. Auchf
hier wird in einem abschließenden Test geprüft, ob die Endlosschleife wirklich unendlich ist.Twin Primes
Wie oben, außer
(4&p:)^:(2&~:@(-~4&p:))
.4&p:
Gibt die nächstgrößere Primzahl nach einer bestimmten Zahl zurück.-~4&p:
Gibt die Differenz zwischen einer Zahl und der nächstgrößeren Primzahl danach zurück.2&~:
ist!= 2
. Die innerste Schleife ist also analog zuwhile (nextPrimeAfter(p) - p != 2) p = nextPrimeAfter(p)
.Anmerkungen
Es kann syntaktische Fehler sein, da ich nicht mit Dummy getestet haben
f
undg
noch. Außerdem nahm ich an, dassf
undg
würde eine Form annehmen, die mit einem Verb auf der linken Seite und einem Substantiv auf der rechten Seite zusammengesetzt werden kann, wobei ich nicht sicher bin, ob die J-Grammatik in irgendeiner Weise eingehalten wird. Sie sind von Natur aus Funktionen höherer Ordnung, und ich bin zu müde, um im Moment eine richtige Konstruktion als Adverbien / Konjunktionen / Was-hast-du zu suchen, wenn es überhaupt eine solche geeignete Konstruktion gibt.Ich habe nicht wirklich die richtige Zeichenfolgenverkettung verwendet und mich stattdessen dafür entschieden, einzelne Zeichenfolgen in einem Kästchen zu belassen. Die Ausgabe (vorausgesetzt, alles andere ist korrekt) wäre daher eine Tabelle mit 3 Spalten, wobei die linke Spalte "The Collatz" usw., die mittlere Spalte "Conjecture is" und die rechte Spalte "True" / "False" ist. .
Ich bin mir auch ziemlich sicher, dass J Ganzzahlen standardmäßig nicht in willkürliche Genauigkeit konvertiert, und die Dienstprogrammfunktion für entscheidende Primzahlen
p:
hat keine willkürlich große Domäne. Auf der anderen Seite bin ich mir nicht sicher, wie viel Aufwand nötig ist, um diesen Code auf den gleichen Stand zu bringen, da J einen Standardtyp mit willkürlicher Genauigkeit unterstützt.quelle
Haskell, 242
da in Haskell Variablen nicht nur Werte enthalten können, sondern auch Berechnungen (dies wird Faulheit genannt) Ich lasse mich
h1, h2
ein einzelnes Argument nehmen und das Wetter zurückgeben oder nicht, es wird halt ausgewertet.etwas ungolfed code:
ein bisschen Erklärung:
Wenn
all
es auf eine unendliche Liste angewendet wird, wird es angehalten, wenn eines der Elemente der ListeFalse
aufgrund von Faulheit (Kurzschluss für alle Nicht-Haskell-Leute da draußen) ist. wir benutzen dies, um die Kollatz-Vermutung und die Zwillingsprimen-Vermutung zu berechnen.!
packt diesen Trick zusammen mit dem Drucken. Das Ergebnis ist,True
wennf
alle Nummern beendet sind4..
. (Dies spielt keine Rolle für die Collatz-Vermutung oder die Twin Primes-Vermutung, da wir bereits wissen, dass sie für so kleine Zahlen zutreffen).Der Code für die Collatz-Vermutung ist
"The Collatz"!c
. es gibt "The Collatz Conjecture is" aus und das Ergebnis ist, dass das Wetterc
bei allen Zahlen endet4..
.Der Code für die Goldbach-Vermutung ist
"Goldbach's"! \n->or[p$n-r|r<-[2..n-2],p r]
.\n->or[p$n-r|r<-[2..],p r,r<n+1]
ist eine Funktion, dien
, wenn es sich um eine Summe von zwei Primzahlen handelt, zurückgibtTrue
, andernfalls aber unbegrenzt schleift. also, wenn es für jeden4..
goldbach halt macht, ist die vermutung wahr.Der Code für die Vermutung der Doppelprimzahlen lautet
"The Twin Primes"! \n->or[p$r+2|r<-[n..],p r]
.\n->or[p$r+2|r<-[n..],p r]
ist eine Funktion, dien
, wenn es zwei Primzahlen gibt, die größer als sindn
, True zurückgibt, andernfalls aber unbegrenzt Schleifen durchläuft. Wenn es also für jeden anhält, ist4..
die Twin-Prime-Vermutung wahr.quelle
Python (965 Zeichen)
Da bekommt meine Frage keine Liebe. Ich poste meine (nicht mit Code versehene) Lösung in Python:
Es ist ziemlich einfach.
numCollatzSteps (n) gibt an, wie viele Schritte die Collatz-Sequenz für ein bestimmtes n dauert. Es läuft unendlich weiter, wenn die Collatz-Sequenz nicht beendet wird.
findNonHaltingN () zählt aufwärts und überprüft, ob numCollatzSteps für jedes n endet. findNonHaltingN wird genau dann beendet, wenn ein n existiert, für das numCollatzSteps nicht beendet wird.
Wir können also überprüfen, ob die Collatz-Vermutung wahr ist, indem wir überprüfen, dass findNonHaltingN () nicht anhält
isPrime (n) prüft, ob eine Zahl eine Primzahl ist, indem es sieht, dass keine positive ganze Zahl von 1 bis n-1 sie teilt
isSumOf2Primes (n) durchläuft alle positiven ganzen Zahlen zwischen 2 und n-2 und überprüft, ob mindestens eine Primzahl zusammen mit ihrem Komplement vorliegt
findNonSum () zählt gerade Zahlen von 4 aufwärts, bis es die erste Zahl erreicht, die keine Summe von 2 Primzahlen ist, und gibt sie dann zurück. Wenn keine solche Nummer existiert, wird sie unendlich fortgesetzt.
Wir können überprüfen, ob die Vermutung von Goldbach wahr ist, indem wir feststellen, dass findNonSum nicht anhält.
isSmallTwinPrime (n) gibt genau dann true zurück, wenn n und n + 2 beide Primzahlen sind
nextSmallTwinPrime (n) gibt die nächste Zahl> = n zurück, für die isSmallTwinPrime wahr ist
greatestTwinPrimes () zählt von 2 aufwärts und überprüft, ob nextSmallTwinPrime für alle n anhält. Wenn nextSmallTwinPrime jemals für einige n nicht anhält, dann folgt, dass die größten Doppelprimzahlen n-1 und n + 1 sind und wir dort anhalten
Dann können wir die Gültigkeit der Twin-Primes-Vermutung überprüfen, indem wir überprüfen, dass greatestTwinPrimes niemals anhält.
quelle
APL (234)
Es ist offensichtlich nicht getestet, aber die Logik scheint gut zu sein. Druckbefehle sind alle enthalten, die Ausgabe erfolgt in
104
Zeichen und die eigentliche Logik ist130
.Ungolfed:
quelle
3**(3**10)
(3*3*10
in APL) auszudrücken , was in tryapl.org einen DOMAIN-FEHLER ergibt.