Jede positive ganze Zahl kann erhalten werden, indem mit 1 begonnen und eine Folge von Operationen angewendet wird , von denen jede entweder "mit 3 multiplizieren" oder "durch 2 dividieren und den Rest verwerfen" ist .
Beispiele (Schreiben von f für * 3 und g für / 2):
4 = 1 *3 *3 /2 = 1 ffg
6 = 1 ffggf = 1 fffgg
21 = 1 fffgfgfgggf
Schreiben Sie ein Programm mit folgendem Verhalten:
Eingabe : jede positive ganze Zahl, über stdin oder fest codiert. (Wenn fest codiert, wird die Eingabezahl von der Programmlänge ausgeschlossen.)
Ausgabe : Eine Zeichenfolge von fs und gs, so dass <input> = 1 <string>
(wie in den Beispielen). Eine solche Zeichenfolge in umgekehrter Reihenfolge ist ebenfalls akzeptabel. NB: Die Ausgabe enthält nur fs und gs oder ist leer.
Der Gewinner ist der Eintrag mit den wenigsten Bytes an Programm plus Ausgabe, wenn 41 die Eingabe ist.
quelle
x mod 3
: wennx=3y
y konstruieren und dann anwendenf
; wennx=3y+1
konstruieren2y+1
und anwendenf
danng
; wennx=3y+2
es dann kompliziert wird, aber im Wesentlichen rekursiv ist.Antworten:
GolfScript, Punktzahl 64 (43-2 + 23)
(41 ist fest codiert, daher -2 Zeichen für die Partitur). Die Ausgabe ist
Das sind 23 Zeichen (ohne Zeilenumbruch). Durch die Konstruktion garantiert der Code, dass er immer (eine) der kürzesten Darstellungen zurückgibt.
quelle
"1 "
nicht in die Ausgabe aufgenommen werden soll.Wir werden schmutzig, Freunde!
JAVA
210 207199 ZeichenNicht Golf:
Ausgabe: Abhängig vom Glauben der alten Götter war die kürzeste, die ich hatte, 30. Beachten Sie, dass die Ausgabe von rechts gelesen werden muss.
234
108
bearbeiten 45
Punkte:
318199 + 30 = 229edit1 (2 * i + 1)% 3 == 0 -> (2 * i)% 3 == 1
Nota Bene, wenn Sie beim Golfen Java 6 und nicht Java 7 verwenden, können Sie verwenden
Struktur mit 39 Zeichen anstelle einer Standardstruktur mit 53 Zeichen.
quelle
(2*i+1)%3==0
ist gleichbedeutend miti%3==1
if(X){A}else{if(Y){B}else{C}}
ist länger alsif(X){A}else if(Y){B}else{C}
. Sie können Ihre==
Bedingungen auch durch kürzere<
Bedingungen ersetzen .Python, Punktzahl 124 (90-2 + 36)
90 Zeichen Code (Zeilenumbrüche jeweils 1) - 2 für fest codierte Eingabezahlen + 36 Zeichen Ausgabe
Ausgabe:
quelle
m=f=0
, können Sie die äußere Schleife erstellenwhile(n!=x)*(m!=x)
und die Unterbrechungen entfernen. Bringt es auf 95 Zeichen Code.n
durch ersetzen3**f
.print'f'*f+'g'*g
, was eine Punktzahl von 90-2 + 36 = 124 ergeben würde.Python, Punktzahl 121 (87 - 2 + 36)
quelle
l,n,f=len(t),1,0
und'1',
aus der Druckanweisung entfernen , beträgt Ihre Punktzahl 87-2 + 36 = 121.1,
.l,n,f=len(t),1,0
gibt die gleiche Anzahl von Zeichen, richtig? (Für jede Variable wird eine=
und eine neue Zeile durch zwei,
s ersetzt.)Perl, Punktzahl 89 (63 - 2 + 28)
Vermutung: Wenn der in meiner ursprünglichen Lösung unten beschriebene naive Ansatz jemals einen Zyklus erreicht, wird dieser Zyklus [21, 7, 15, 5, 10, 21, ...] sein . Da es keine Gegenbeispiele für 1 ≤ n ≤ 10 6 gibt , scheint dies wahrscheinlich zu stimmen. Um dies zu beweisen, würde es genügen zu zeigen, dass dies der einzige Zyklus ist, derexistieren kann , was ich zu einem späteren Zeitpunkt tun kann oder nicht.
Die obige Lösung vermeidet den Zyklus sofort, anstatt (falsch) zu raten und ihn beim zweiten Mal zu vermeiden.
Ausgabe (28 Bytes):
Perl, Punktzahl 100 (69 - 2 + 33)
Verwenden eines Guess-and-Check-Ansatzes. Die Zeichenfolge wird mithilfe inverser Operationen erstellt (Konvertieren des Werts in 1 statt umgekehrt), und die Zeichenfolge wird entsprechend gespiegelt, was in der Problemspezifikation zulässig ist.
Immer wenn ein Nicht-Vielfaches von drei angetroffen wird, wird es mit zwei multipliziert und eins addiert, wenn das Ergebnis dann ein Vielfaches von drei wäre. Wenn ein Vielfaches von drei angetroffen wird, wird es durch drei geteilt ... es sei denn, dieser Wert wurde zuvor angetroffen, was auf einen Zyklus hinweist, also Vermutung und Überprüfung.
Ausgabe (33 Bytes):
quelle
J, Punktzahl 103 (82-2 + 23)
* Hinweis: Ich habe meine Verben benannt
f
undg
darf nicht mit Ausgabezeichenfolgenf
und verwechselt werdeng
.Fest codiert:
Allgemeine Funktionen:
Die Bearbeitung von Binärzahlblöcken wurde abgeschafft, was die wichtigste Änderung in Bezug auf die Komprimierung war
g
. Variablen umbenannt und zum Teufel einige Leerzeichen entfernt, aber funktionell ist immer noch alles gleich. (Verbrauch:g 41
)J, Punktzahl 197 (174 + 23)
Ausgabe:
ffffffffggggggggfgffggg
f
konvertiert eine Liste von Booleschen Werten in Zahlen, wobei 0s als*3
und 1s als/2
(undfloor
) verwendet werden.#:i.2^i
Erstellt ein Array mit Rang 2, das alle booleschen Arrays mit Rang 1 enthälti
.quelle