21, 21, 23, 20, 5, 25, 31, 24, & le;
Inspiriert von diesem Puzzle , drucken Sie die folgende Sequenz aus, wenn Sie eine Ganzzahl , bis Sie eine Nicht-Ganzzahl erreichen (verdorben, falls Sie das Puzzle zuerst selbst lösen möchten).
oder intuitiver: * 1, +2, -3, / 4, * 5, +6, -7, / 8, ...
Testfälle:
1: 1, 1, 3, 0, 0, 0, 6, -1
2: 2, 2, 4, 1
3: 3, 3, 5, 2
4: 4, 4, 6, 3
5: 5, 5 , 7, 4, 1, 5, 11, 4
6: 6, 6, 8, 5
9: 9, 11, 8, 2, 10, 16, 9
21: 21, 21, 23, 20, 5, 25, 31, 24, 3, 27, 37, 26
Eingabe und Ausgabe können in jedem vernünftigen Format erfolgen, Standardlücken sind wie üblich verboten.
Im Sinne von Code-Golf gewinnt die kürzeste Antwort in Byte!
Sandbox: https://codegolf.meta.stackexchange.com/a/18142/59642
Antworten:
05AB1E (Legacy) ,
18 bis17 ByteProbieren Sie es online aus oder überprüfen Sie alle Testfälle .
Erläuterung:
Ich verwende hier die Vorgängerversion von 05AB1E und berechne auch zuerst die nächste Zahl, bevor ich sie drucke, da die Schleife auf 0 basiert und sie
/0
in der ersten Iteration eine ausführt. Dies sparte ein Byte im Vergleich zum vorherigenN>
und"*+-/"
. Dies funktioniert nur, weil in der Vorgängerversion eine durch 0 geteilte Zahl dieselbe bleibt. in der neuen Version würde es 0 werden; und in der tatsächlichen Mathematik würde es eine Division durch Null geben.quelle
Scratch 3.0 39 Blöcke / 323 Bytes
Probieren Sie es einfach
online aus!Alternativ als SB-Syntax:
Schau euch an, hab Spaß mit deinen ausgefallenen
eval
Statements! Na ja, nicht ich! Nein ... Scratch hat keine Evals, also musste ich die Dinge auf die harte Tour machen ... if-Anweisungen.Zumindest ist es nicht
goto
s ...quelle
goto
und eine Subtraktionsschleife, um zu überprüfen, ob wir in einer stapelbasierten Sprache teilen können . ; p (In aller Ernsthaftigkeit, nette Antwort, +1 von mir! Ich konnte einfach nicht widerstehen, Sie in meiner gerade fertig gestellten Whitespace-Antwort zu zitieren .)Whitespace ,
251227202 BytesBuchstaben
S
(Leerzeichen),T
(Tabulator) und (Zeilenvorschub) werdenN
nur als Hervorhebungen hinzugefügt.[..._some_action]
nur als Erklärung hinzugefügt.Probieren Sie es online aus (nur mit Leerzeichen, Tabulatoren und Zeilenumbrüchen).
-24 Bytes nach einem Kommentar von @JoKing was darauf hindeutet
n%i > 0
. Obwohl nurif(x < 0)
undif(x == 0)
in Whitespace verfügbar sind, ist das einfache Überprüfenif(x*-1 < 0)
im Grunde dasselbe wieif(x > 0)
.Weitere -25 Bytes dank @JoKing .
Erläuterung:
Zitat aus der Scratch-Antwort :
Hat jemand gesagt
goto
? Whitespace hat nichts anderesgoto
zu tun, als sowohl Schleifen als auch if-Anweisungen zu erstellen. xD Außerdem ist es eine stapelbasierte Sprache, so dass ich ziemlich oft tauschen / verwerfen / kopieren muss. Und um das Ganze abzurunden: Whitespace hat nicht einmal Gleitkommazahlen und nur eine Ganzzahldivision. Deshalb habe ichn % i * -1 < 0
das Programm verlassen, wenn die Ganzzahl die aktuelle Zahl nicht teilen kann.Pseudocode:
quelle
if(n == 0)
oderif(n < 0)
verfügbar. Leider neinif(n > 0)
oderif(n != 0)
. Aber ich bin sicher, dass einige Aspekte vereinfacht werden können. Diese aktuelle Lösung war ein Versuch und Irrtum beim Debuggen, aber vielleicht sollte ich einfach einen Schritt zurücktreten und einen kürzeren Ansatz überdenken. Wenn ich mal wieder Zeit habe. Und den Pseudocode gefixt, dui
n
m = n%i; n = n/i; if (m == 0) jump to LOOP; exit program
?swap top two, copy second item
in die Gesamtschleife verschieben, anstatt sie in jeden Abschnitt zu kopieren?Haskell ,
75 7473 Bytes-1 Byte danke an Will Ness -1 Byte danke an nimi
Probieren Sie es online!
Vermeidet die Verwendung von Nachkommastellen, um Bytes zu sparen
quelle
JavaScript (V8) , 52 Byte
Druckt Gruppen von 4 Begriffen. Inspiriert von GBs Ruby-Antwort .
Probieren Sie es online!
JavaScript (V8) , 54 Byte
Druckt die Begriffe der Sequenz.
Probieren Sie es online!
JavaScript (ES6),
59-58ByteGibt ein Array zurück.
Probieren Sie es online!
quelle
Perl 6 , 44 Bytes
Probieren Sie es online!
Anonymer Codeblock, der eine Nummer annimmt und eine Sequenz zurückgibt. Wenn wir das erste Element überspringen könnten (das ohnehin immer das gleiche wie das zweite Element ist), könnten wir 3 Bytes einsparen, indem wir das entfernen
$_,
quelle
Python 3 , 60 Bytes
Probieren Sie es online!
quelle
Piet ,
297190144 codels (432 bytes)Versuchte einen neuen Ansatz unter Verwendung eines
pointer
Befehls als Schalter (k mod 4), um den Ausgabecode zu vereinheitlichen, was zu einem dichteren 10x19-Codebild führte. Dann habe ich das um 1 Reihe und 2 Spalten auf 8x18 golfen.Hier ist eine Spur, um zu sehen, wie es funktioniert:
Die erste Zeile drückt eine 0 auf dem Stapel als
push
Startindex (da wir nur natürliche Zahlen können, drücken wir zwei und subtrahieren dann), dann liest die Eingabe als Zahl.Die am weitesten links stehende Spalte enthält den gemeinsamen Code zum Duplizieren der Zahl und zum Einfügen einer Zahl in die Ausgabe. Anschließend wird der Index auf den Stapel verschoben, inkrementiert und anschließend dreimal dupliziert. Wir geben dann den pastellroten, r-förmigen Block durch den dunklen Cyan-Codel ein, um einen
pointer
Befehl zu erhalten, der uns für den Rest unseres Index-Mods 4 verschiedene Pfade gibt.Mod 1 verlassen wir durch die Spitze, um zu multiplizieren. Wir mischen zuerst eine Kopie unseres Indexes für später herunter und führen dann die Multiplikation durch. Nachdem wir das Weiß für eine Pause durchlaufen haben, betreten wir die obere Spalte, um die cc-Parität zu fixieren (es muss eine gerade Anzahl von Malen umgedreht werden, um die Schleife stabil zu halten), gefolgt von a
pointer (1)
vom Eintreten in den Magenta-Balken: Es wirkt als a Fange nach unseren vier Pfaden und schicke uns zurück in die Schleife.Mod 2 verlassen wir rückwärts um zu summieren. Die Form des Pastellcodeblocks bedeutet, dass wir eine Zeile über der Eingabe verlassen und die 3 verwenden, die wir auf den Stapel schieben, indem wir durch den roten Codeblock nach
pointer (3)
oben gehen. Diese Spalte enthält den Leerraum vor der Arithmetik und eine etwas andere Reihenfolge für das Drücken und Umschalten von cc, da sich die Farben sonst mit ganzzahligen Codels in der benachbarten Spalte überlappen würden.Mod 3 schickt uns zur Subtraktion nach unten. Gleicher Vorgang wie die Multiplikation, außer dass wir den Teilungspfad auf dem Weg nach oben überqueren (da der CC beim Eintritt in den grünen Pastellstrich eine unterschiedliche Parität aufweist, verlassen die beiden Ausführungen diesen Takt an verschiedenen Enden). Währenddessen nehmen wir einen unerwünschten
duplicate
Befehl auf, so dass wirpop
ihn mit dem dunkelgrünen Codel zurücknehmen, bevor wir in die CC-Korrektur- und Erfassungsleiste eintreten.Mod 4, wir gehen geradeaus, um uns zu teilen. In diesem Fall müssen wir den Stapel zunächst stärker neu mischen, um zwei Paare von n und a für Operationen zu erhalten, da wir testen müssen, ob es sich um eine Ganzzahl handelt. Wir machen das
mod
mit dem ersten Paar, dannnot
mit dem Ergebnis und dann mit apointer
- wenn es nicht teilbar ist, fahren wir geradeaus weiter, was uns mit zweipointer
Befehlen in die gegenüberliegende Ecke in den unvermeidlichen Block schickt und damit das Programm beendet. Andernfalls biegen wir rechts ab und erhalten einendivide
Befehl, die Magenta-Leiste zu betreten.Alte Version
Sehr einfacher Code: Drückt eine 1 und die Eingabe auf dem Stapel und durchläuft dann die vier Operationen durch: Mischen des Index über dem Stapel, Inkrementieren um 1, Duplizieren, Mischen einer Kopie nach unten, Ausführen der arithmetischen Operation, Duplizieren der Nummer und Einfügen einer Nummer in die Ausgabe.
Bei der Division, die die einzige ist, bei der die Sequenz enden kann, wird ein komplizierterer Stapel erstellt, um zunächst zu überprüfen, ob n mod index == 0 ist. Andernfalls wird der unvermeidliche Codel eingegeben und beendet. Andernfalls verwendet es seine zweite Kopie von i und n, um die Division durchzuführen.
quelle
push (1) pointer
oder für eine schwarze Zelle über einer farbigen.C # (Visual C # Interactive Compiler) ,
72,70, 69 ByteProbieren Sie es online!
quelle
Ruby ,
56 5452 BytesProbieren Sie es online!
Nach einem (gescheiterten) Versuch mit
eval
fand ich heraus, dass die glücklichste Lösung darin besteht, das Array mit 4 Elementen auf einmal zu erstellen, zumindest in Ruby.Danke an Arnauld für -2 Bytes.
quelle
R ,
90 Bytes ,73 Bytes87 Bytes,85 Bytes,80 Bytes,74,Eine einfache Umsetzung der Regeln:
Probieren Sie es online!
mit dem
T<13
folgenden aus einer tieferen Analyse des Puzzles. In der Tat gibt es nur drei Arten von Sequenzen: jene der Länge 4, wenn a⁰ nicht zu 1 Modulo 8 kongruent ist; diejenigen der Länge 12, wenn a when zu 21 modulo 32 kongruent ist; und diejenigen der Länge 8 für die übrigen Fälle.Ein alternativer Code, der Schleifen vermeidet, ist mit 87 Bytes länger:
Probieren Sie es online!
quelle
{}
für -2 Bytes entfernen .length
.Haskell ,
1048685 BytesProbieren Sie es online!
Das
h=
kann weggelassen werden, da es nur zum Testen verwendet wird.Ah, Codegolf, wo sich eine quadratische Zunahme der Zeitkomplexität für die Reduzierung eines Zeichens lohnt.
104 Bytes
Probieren Sie es online!
Mir gefällt diese Antwort besser, aber leider ist sie länger.
quelle
Japt ,
2524 BytesEine weitere Anpassung der Ruby-Lösung von GB .
Versuch es
Der Haupttrick liegt hier in der Überladung der
c
Methode für Arrays. Übergeben Sie ein anderes Array als Argument und verknüpfen Sie es mit dem ursprünglichen Array. Übergeben Sie eine Zahl als Argument, wie dies beim letzten rekursiven Aufruf der1
Fall ist , und glätten Sie das ursprüngliche Array um so viele Ebenen - in diesem Fall nach dem Runden. Da das Array jedoch immer nur eine Ebene tief ist, hat das Abflachen keine Auswirkung.quelle
Java 8, 84 Bytes
Probieren Sie es online aus.
Das Erstellen eines Arrays mit allen vier Werten ist von der Ruby-Antwort von @ GB inspiriert , obwohl ich jetzt feststelle, dass die Verwendung einer ternären if-Anweisung die gleiche Anzahl von Bytes enthält:
Probieren Sie es online aus.
quelle
Perl 5 , 53 Bytes
Probieren Sie es online!
quelle
rot , 102 Bytes
Probieren Sie es online!
quelle
AWK , 57 Bytes
Probieren Sie es online!
quelle
Rutger , 310 Bytes
Probieren Sie es online!
Es ist an der Zeit, dass ich wieder Rutger benutze. Leider ist es möglicherweise nicht die beste Sprache für die Aufgabe, da es keine Form von hat
eval
, die mich zwingt, vier if-Anweisungen zu verwendenWie es funktioniert
Wie funktioniert Rutger?
Ein kurzes Vorwort zur Funktionsweise der Sprache: Alles ist entweder eine Aufgabe oder eine Funktion, und jede Funktion benötigt genau ein Argument. Für Operationen, die mehr als ein Argument erfordern (z. B. Multiplikation), gibt der erste Aufruf eine Teilfunktion zurück, die bei erneutem Aufruf mit dem zweiten Argument das erwartete Ergebnis zurückgibt. Beispielsweise:
druckt 30 aus: Online ausprobieren! . Während dies normalerweise länger ist als die übliche Alternative, kann es manchmal Bytes sparen, wenn eine Funktion wiederholt mit einem konstanten Argument und einem sich ändernden Argument aufgerufen wird, beispielsweise beim Ausdrucken von Zeittabellen.
Diese Regel mit einem Argument gilt für alles, was keine Konstante oder Variable ist, einschließlich Schleifen und Bedingungen. Allerdings Schleifen und Bedingungen (
For
,Each
,While
,DoWhile
,If
undIfElse
) sind machbar , dass im Hinblick auf Bedeutung , die sie tatsächlich läuft, dieDo
muß Funktion (siehe die letzte Zeile in der Antwort) aufgerufen werden. Dies kann wiederum Byte sparen, wenn dieselbe Schleife wiederholt ausgeführt wird, oder Sie können beliebigen Code zwischen der Definition und der Ausführung von Schleifen ausführen.Schließlich gibt es drei Möglichkeiten, auf Variablen zu verweisen, die alle in diesem Programm verwendet werden. Die erste ist die direkte Referenzierung , bei der dem Variablennamen ein
$
Symbol vorangestellt wird . Dies greift direkt auf den Wert der Variablen zu und gibt ihn zurück. Die zweite ist die Funktionsreferenzierung , die keinen Präfixcharakter hat. Auf diese Weise kann der Code zwischen (potenziell partiellen) Funktionen, die Variablen zugewiesen sind, und tatsächlichen Variablen, die einen bestimmten Wert enthalten, unterscheiden. Schließlich indirekte Referenzierung mit einem Präfix@
Symbol, wird eine Variable (falls es nicht bereits vorhanden ist ) und gibt das variable Objekt innerhalb eines bestimmten Bereichs. Auf diese Weise können Sie eine Schleifenvariable erstellen (z . B.i
infor i in range(...)
).Wie die eigentliche Lösung funktioniert
Hier ist der ungolfed Code:
Probieren Sie es online!
Wie man sehen kann, beginnt sie , indem sie die drei Variablen zuweisen
n
,e
unda
, die die Eingabe des Änderungselement in der Sequenz repräsentieren, und die Änderungszahl für jedes jeweils neues Element. Wir erstellen dann eine while-Schleife:Die geschweiften Klammern (1 als zweites Argument zurückkehren 0 für ganze Zahlen und eine ganze Zahl ungleich Null für Gleitkommazahlen. Wir berechnen dann das logische Nicht davon, Mapping0 → 1 und n → 0 , n ≤ 0 .
{
und}
) definieren einen Codeblock , wobei die letzte Anweisung im Block die Bedingung für die while-Schleife ist. In diesem Fall definieren wir zunächst eine partielle Modulo-Funktion, die ein zweites Argument aufnimmtm
und zurückgibte % m
. Wir nennen diese Teilfunktion dann mitAls nächstes kommen wir zu der absoluten Monstrosität, die aus dem Körper der while-Schleife besteht:
Der primäre Teil dieser Schleife ist eine for-Schleife, die iteriert4 mal jede Iteration der while-Schleife, hat eine Iterationsvariable von
x
und besteht aus:Die erste Anweisung druckt jede Iteration der Sequenz aus, bevor sie geändert wird. Wir erstellen dann eine Teilfunktion, um die Gleichheit mit der Schleifenvariablen zu überprüfen
x
, und treffen auf vier if-Anweisungen. Jede Anweisung überprüft , obx
gleich 1, 2, 3 oder 4 ist, und weist dannk
jede Funktion in*
,+
,-
und/
dann wird es in eine Teilfunktione
als Argument. Schließlich weisen wire
aufk
mit laufena
als zweites Argument und Zuwachsa
.quelle
Ruby , 52 Bytes
Probieren Sie es online!
quelle
i=0
und verwenden Sie einen Gleitkomma als Argument für die Funktion.C (clang) , 80 Bytes
Probieren Sie es online!
Vielen Dank an @ceilingcat Verbesserungen.
quelle
dzaima / APL,
3433 BytesProbieren Sie es online!
-1 danke an ngn
quelle
TI83 / 84 BASIC, 69 Bytes
Wir richten einen Zähler in A ein und löschen L1, damit wir die Sequenz verfolgen können. Wir wiederholen dann, bis der Teilungsschritt einen Bruch verursacht. Innerhalb der Schleife speichern wir zuerst N in der Liste. Wenn Sie ein Element hinter dem Ende einer Liste oder eine leere Liste speichern, wird dieses Element erstellt. In diesem einen Speicher wird also das Ergebnis der Division hinzugefügt, wenn es keinen Bruch verursacht, und die Liste wird beim ersten Durchlauf initialisiert. Wir verwenden dann Augment, um die nächsten 3 Terme der Sequenz anzuhängen. Die Mathematik berechnet ein paar Bytes kleiner, indem der Term A4k + 3 in der Variablen O berechnet wird und dann A4k + 2 und A4k + 4 aus O berechnet werden. Dann führen wir die Division separat durch, um N für die Wiederholungsprüfung zurückzusetzen und 4 zu A zu addieren.
Ich habe einen Disp L1 am Ende eingefügt, bin mir aber nicht sicher, wie ideal er ist, da es keinen guten Weg gibt, alle Begriffe auf den Bildschirm zu setzen. Realistisch gesehen würde der Benutzer L1 ausführen, nachdem das Programm manuell ausgeführt wurde, um durch die Ergebnisse zu scrollen.
quelle
Holzkohle , 29 Bytes
Probieren Sie es online!Link ist eine ausführliche Version des Codes. Erläuterung:
Geben Sie den Anfangswert ein.
Wiederholen, bis der Wert keine ganze Zahl mehr ist.
Gibt den Wert in einer eigenen Zeile aus.
Berechnen Sie die vier verfügbaren Rechenoperationen und wählen Sie die richtige aus, abhängig von der aktuellen Ausgabezeilennummer.
quelle
Python 3 ,
7876 BytesProbieren Sie es online!
Nimmt die Eingabe als Liste mit 1 Element und hängt das nächste Element der Sequenz rekursiv an, bis es eine Nicht-Ganzzahl ist.
Für den Fall, dass die Eingabe als Liste nicht zulässig ist, ist hier eine sehr schnell gepatchte Version, die Eingaben als Int. Akzeptiert.
Eingabe als Ganzzahl, 102 Bytes
Probieren Sie es online!
+2 Bytes danke, dass ich vergessen habe, die rekursive Funktion
zu benennen ... -4 Bytes danke an Jitse
quelle
f=
in Ihrem Hauptcode enthalten. Sie können jedoch auch speichern 4 Bytes dan[-1]
undlen(n)
muss nicht in Klammern sein. Probieren Sie es online!n[:-(n[-1]%1>0)]or f...
würde aber ein Byte speichernZweig , 164 Bytes
Okay, das war eigentlich schrecklich schrecklich zu schreiben.
Einschränkungen:
returns
! Sie geben entweder aus oder geben nicht auswhile
Schleifen. Du musst Rekursion oder nichts verwendenset
Tag zu verwendenbreak
,continue
,goto
oder ähnliches. Dies macht die Verwendung einer Schleife unmöglich.for ... in ....
und sie durchläuft alle Elemente in einem Array, ohne dass eine Unterbrechung möglich ist.Alle diese haben den Code massiv gemacht!
Hey, ich habe es sogar länger gemacht als die Java-Antwort!
Es ist so lange wie die JavaScript-Antwort von @ Arnauld ! ... mit allen 3 Alternativen kombiniert.
Hier ist der Code:
Sie können es unter https://twigfiddle.com/zw5zls ausprobieren
Wie benutzt man:
Importieren Sie einfach die Datei und rufen Sie das erste Makro auf.
Um ein brauchbares Array zu haben, können Sie dies tun
a.a(21)|split(',')
.Ungolfed:
Sollte leicht zu lesen sein.
Diese ungolfed Antwort gibt NICHT die korrekte Ausgabe aus, da sie zufällige Leerzeichen wirft.
Es existiert nur, um menschlich lesbar zu sein.
quelle