Willkommen in der Mühle.
Ihre Aufgabe ist es, große Steine durch Schleifen in kleine Steine zu verwandeln.
Nehmen Sie eine Eingabe von einem großen Stein der Größe n > 3
und mahlen Sie es.
Mahlen Sie die Steine weiter, indem Sie sie in die Mühle schütten, bis alle Steine so groß sind 2
.
Steine werden immer zu gleichen, geraden Hälften geschliffen. Wenn das Ergebnis eines Schleifens ungerade ist, nimm das Ergebnis - 1.
Drucken Sie die Ausgabe jedes Schleifvorgangs aus, während Sie fortfahren.
Beispiele
Eingang: 5
Ausgabe: 22
Das Ergebnis sind zwei Steine der Größe 2
Eingang: 50
Ausgabe:
2424 //two rocks of size 24
12121212 //four rocks of size 12
66666666 //8 rocks of size 6
2222222222222222
Das Ergebnis sind 16 Steine der Größe 2
Eingang: 30
Ausgabe:
1414
6666
22222222
Das Ergebnis sind 8 Steine der Größe 2
Das ist Code-Golf, also gewinnt der kürzeste Code! Viel Spaß und viel Glück!
quelle
Antworten:
TSQL,
6159 BytesVersuch es
quelle
COW,
297291 BytesProbieren Sie es online!
Der Code gibt jede Zahl in einer eigenen Zeile aus und trennt die Iterationen durch eine zusätzliche neue Zeile. Es wird auch die erste Iteration selbst gedruckt, gefolgt von einer neuen Zeile. Eine Eingabe von 5 würde also eine Ausgabe ergeben, die
5 2 2
außer mit Zeilenumbrüchen anstelle von Leerzeichen aussieht . Die Beispielausgabe für50
ist unten angegeben.Erklärungsbaum:
Beispielausgabe für Eingabe 50:
quelle
05AB1E ,
1211 BytesProbieren Sie es online!
Erläuterung
quelle
Python 2,
5553 BytesTeilen Sie durch 4 und verschieben Sie nach links durch 1, um die Sonderteilung zu erhalten
quelle
Haskell,
75 71 60 5047 BytesProbieren Sie es online! Bearbeiten: Da die Ausgabe nun eine Liste einschließlich der Eingabe sein darf, können
1013 Bytes gespeichert werden.Verwendung:
Ursprüngliche 60-Byte-Version:
Probieren Sie es online! Vielen Dank an Christian Sievers für den Hinweis auf die kürzere Formel.
Verwendung:
quelle
z<-2*div n 4
.JavaScript (ES6)
645957 Bytesquelle
f=
aber nur für die DemoPython 2,
4847 Bytesquelle
s=s/4*2
funktioniert für 1 Byte speichern.Java, 85 Bytes
Testen und ungolfed
Hinweis: Ich weiß nicht warum, Ideone gibt weiterhin interne Fehler aus, daher ist das Testen ein Problem. Zum Testen einfach kopieren / einfügen und in Ihrer Standard-Java-IDE ausführen. (Es funktioniert dort, ich habe dafür gesorgt;))
quelle
n=n/4*2
Trick. :)C #,
888683 Bytes3 Bytes gespart dank Skorm
Ein weiteres Byte wurde gespeichert, indem
while
in einefor
Schleife gewechselt wurde , die Variablendeklarationen enthältDank Yodle 1 Byte gespeichert
Anonyme Funktion, die eine Zeichenfolge zurückgibt, die sich aus dem Ergebnis jedes Schleifvorgangs zusammensetzt.
Volles Programm mit ungolfed Methode und Testfällen [vor der letzten Bearbeitung!]:
quelle
for(i=0;i++<c;)
for (i = 0; i++ < c;)
n=>{var r="";for(int i,c=2;n>2;c*=2,r+="\n")for(i=0,n=n/4*2;i++<c;)r+=n;return r;}
CJam , 21 Bytes
Probieren Sie es online! (Als Testsuite.)
Erläuterung
quelle
Pyth,
181613 Bytes*
\n
ist eine neue ZeileErläuterung:
Versuch es hier
quelle
MATL , 13 Bytes
Probieren Sie es online!
quelle
PHP,
726764 BytesÜbernimmt das Argument von der Kommandozeile. Laufen Sie mit
-r
.quelle
Jelly ,
13 1211 BytesTryItOnline!
Hinweis: Das OP hat angegeben, dass der Eingang auch im Ausgang vorhanden sein kann.
Wie?
Version ohne die Eingabe für 12 Bytes angezeigt:
:4Ḥḟ0x2µÐĿḊG
quelle
Perl,
40,35,30 + 1 = 31 BytesLaufen Sie mit der
-n
Flagge-4 Bytes dank @Dada
Probieren Sie es online!
Perl liest die Eingabe automatisch in die Variable,
$_
wenn-n
festgelegt wird.$.
ist eine spezielle Variable,1
die der Interpreter zu Beginn des Programms setzt, damit ich sie als Grundlage für das Verdoppeln verwenden kann. Bei jeder Iteration derwhile
Schleife wird das Bit$_
heruntergeschoben und ein logisches UND gegen das Negative von sich selbst minus eins ausgeführt, um das Einsen-Bit zu löschen.quelle
perl -nE 'say$_ x($.*=2)while$_=$_>>1&~1'
(Vielleicht kann man das noch weiter spielen, ich habe nicht viel Zeit damit verbracht).PowerShell 3+,
5854 ByteDanke TimmyD , dass du mir 4 Bytes gespart hast!
Leicht ungolfed (Formatierung)
Erläuterung
Ich verwende die gleiche Division durch 4 multiplizieren mit 2 Tricks wie viele andere Antworten, aber ich bin auf ein Problem gestoßen. PowerShell wandelt Zahlen bei Bedarf während der Division in Gleitkommazahlen um, und beim Golfen ist das ärgerlich, weil
$v/4*2
erforderlich ist[int]($v/4)*2
. Ich bin damit umgegangen, indem ich Bitshifting für die Division mit verwendet habe-shr
.Um zu berechnen, wie oft eine Iteration gedruckt werden soll, nehme ich einfach
(2^$i)-1
was gut funktioniert und hat den zusätzlichen Effekt, dass der Eingabewert weggelassen wird. Der Versuch, nur mit 2 zu multiplizieren, war problematisch, da es schwierig ist, den Wert bei 0 zu erhöhen,$i*=2
und bei 1 zu beginnen, ist zu viel Korrektur erforderlich, um die richtige Zahl zu erhalten.Da PowerShell keinen Operator dafür hat und ich dies vermeiden wollte
[Math]::Pow()
, habe ich mich für meine Potenzen von 2 wieder auf die Bitverschiebung verlassen.quelle
Python 2, 47 Bytes
Da das OP sagte, dass ein 1D-Array, das die Eingabe enthielt, in Ordnung sei, habe ich mir diese rekursive Funktion ausgedacht, die leider nur mit dem aktuellen Python-Gewinner in Verbindung steht.
quelle
f=lambda r,n=1:[r]*n+(r>3and f(r/4*2,n*2)or[])
für 46Perl, 47 Bytes
Diesmal keine Befehlszeilenoptionen (ungewöhnlich für Perl). Die Grundidee ist, dass, da alle Steine in einem bestimmten Schritt die gleiche Größe haben, wir nur die Größe (in
$a
) und die Anzahl (in$_
) aufzeichnen, anstatt die gesamte Liste aufzuzeichnen. Ich konnte keinen Weg finden, den Raum (oder+
) danach loszuwerdensay
; Sie können die bewegen2*
aber es wird nicht korrekt analysiert, wenn es von einer öffnenden Klammer gefolgt wird.Ich kann nicht anders, als das Gefühl zu erschüttern, dass dies verbesserungsfähig ist, aber ich kann nicht sehen, wie.
quelle
die
fühlt sich eindeutig suboptimal an. Aber wir müssen noch eine Möglichkeit zu überprüfen , ob wir zu stoppen oder nicht brauchen -> eine Lösung ist eine Weile , statt das verwendenfor
:while$a>1
. Aber wir müssen einen Ersatz finden für$_
: jede unitialisierte Variable kann es tun: Ersetzen1<<$_
durch1<<++$x
. So, jetzt$_
ist es frei, verwendet zu werden, wir können dann-n
jeden$a
mit a verwenden und ersetzen$_
, und der erste Befehl wird$_>>=1
. Da wir haben-n
,$.
festgelegt ist, so können wir ersetzen1<<++$l
mit$.*=2
.perl -nE '$_>>=1;say 2*($_>>=1)x($.*=2)while$_>1'
(39 Byte). Beachten Sie dann, dass$_>>=1
dies zweimal gemacht wird, damit wir versuchen können, einen (den ersten) loszuwerden. Beim Versuch, es loszuwerden, bekam ichsay$_ x($.*=2)while($_>>=1)/2>1
(lege beide in denwhile
Zustand). Aber das Ergebnis ist falsch ($_
kann seltsam sein), und wenn ich versuche, sicherzustellen, dass es gerade ist, lande ich beiwhile$_=$_>>1&~1
. So ist der Code jetztsay$_ x($.*=2)while($_=$_>>1&~1)
.Vim
6154 BytesTryItOnline!
Unbedruckbares:
Zum Glück schneidet vim bei x / 2 automatisch ab.
quelle
JavaScript,
71635958 BytesNun, ich habe mir diese Javascript-Lösung ausgedacht. Völlig neu im Golfen, aber ich finde das eine lustige Herausforderung
4 Bytes dank Titus-Vorschlag mit einer for-Schleife eingespart.
ungolfed basis:
Golf Version
Ich bin offen für Verbesserungsvorschläge / Golf lernen
Eingabetester
Code-Snippet anzeigen
quelle
for
Schleife:for(o=i=30;i>2;console.log(...)){...}
. Wenn Sie die beiden Schleifaufgaben zu einer kombinieren, können Sie die Klammern entfernen:i=i/4<<1;
(-5). Ichi=i/4*2;
bin mir nicht sicher, ob ich dasselbe tun werde.BASH, 81 Bytes
quelle
Schnell, 84 Bytes
Ungolfed
quelle
Befunge, 45 Bytes
Probieren Sie es online!
Erläuterung
quelle
Javascript, 106 Bytes
Erster Code Golf, dachte ich hätte eine Chance. (Es ist nicht sehr gut).
Nicht abgeschlossen:
quelle