Ich definiere den n-ten Ternären als einen Ternären, der n zurückgibt und die folgende Form hat:
1 ? 2 ? 3 ? n - 1 ? n : 0 : 0 : 0 # n - 1 zeroes
Schreiben Sie eine Funktion oder ein vollständiges Programm, das bei einer Eingabe von n das n-te Ternär ausgibt oder zurückgibt. Code-Golf.
Testfälle
0 #=> undefined behaviour
1 #=> 1
2 #=> 1 ? 2 : 0
3 #=> 1 ? 2 ? 3 : 0 : 0
10 #=> 1 ? 2 ? 3 ? 4 ? 5 ? 6 ? 7 ? 8 ? 9 ? 10 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0
Das 1000. Ternär Ich denke, es gibt eine Art Zen-Harmonie.
Antworten:
Pyth -
191817 BytesDie Räume töten mich und denken über eine bessere Art nach, mit ihnen umzugehen.
Es verbindet die Zahlen nur durch ein
" ? "
und verkettet dann den zweiten Teil weiter.Probieren Sie es hier online aus .
quelle
CJam,
1818 BytesProbieren Sie es online aus .
Erläuterung
quelle
:)
.Ruby, 31 Bytes
Prüfung:
quelle
array * string
==array.join string
... interessantf[0]
?irb(main):007:0> f[0] ArgumentError: negative argument from (irb):6:in * from (irb):6:in block in irb_binding from (irb):7:in [] from (irb):7 from /usr/bin/irb:11:in <main>
CJam, 19 Bytes
Nur ein Anfang ...
Wie es funktioniert
Probieren Sie es hier online aus
quelle
Brainfuck, 305
(Ohne Eingabenummer von STDIN, siehe Bearbeiten unten)
Ich habe diesen schönen Algorithmus benutzt, um eine Zahl zu drucken, die 155 Bytes des gesamten Programms einnimmt.
Es funktioniert für Eingaben bis zu 32768 (16-Bit-Beschränkung des Algorithmus). Es erzeugt keine nachgestellten Leerzeichen und funktioniert auch für Eingaben
1
:Kurzanleitung:
Setup (97 Byte)
Erster Teil (181 Bytes)
Zweiter Teil (27 Bytes)
Wenn es erlaubt wäre, die 8 Brainfuck-Befehle auf 3 Bits abzubilden, würde dieses Programm 114 Bytes und weitere 3 Bits belegen
Unär, ~ 4,08 * 10 ^ 275 Bytes
Es wäre hier zu lang sein, aber es ist nur 408452257862560239329948606295286361112603208650130608525040044700379331457759667646985586658469601803889628246410788572492437928714867190270708935427798983714797786123292750743771225096145575210320040188155473030775033228313350778616384531426430459309802833775612506568528463 Nullen und funktioniert genauso wie das Programm Brainfuck.
EDIT : Ich habe es vermasselt, dieses Programm nimmt keine Benutzereingaben wirklich, es verwendet nur den aktuellen Zeigerwert als Eingabe. Um eine Zahl analysieren zu können, wäre viel mehr erforderlich, und das kann ich mir nicht leisten.
Es funktioniert also mit einem Wert, der direkt in das Programm eingegeben wurde (indem n-mal "+" vor dem Programm angehängt wird), nicht jedoch mit STDIN
quelle
JavaScript (ES6),
42 bis39 ByteDie äußere Funktion
f
übernimmt den Eingabewert und ruft dann die innere Funktiong
rekursiv auf, um die Zeichenfolge von der Mitte aus aufzubauen. Dabei wird der Eingabewert als Maximum zum Testen des Basisfalls verwendet.Ungolfed:
quelle
Python
5655quelle
C # - 76
quelle
Haskell, 53 Bytes
So funktioniert es: Erstellen Sie die Zeichenfolge von innen nach außen, indem Sie mit einer leeren Zeichenfolge beginnen und von
n
unten nach unten eine Schleife2
ausführen , wobei Sie der aktuellen Zahl und einem voranstellen und einem?
anhängen: 0
. Endlich ein1
vor allem setzen.Ein anderer Ansatz (dank @Mauris jetzt 9 Bytes kürzer):
Haskell,
6051 BytesWie es funktioniert: ein Literal
1
gefolgt von? <x>
für jedes<x>
In[2..n]
gefolgt von einer Konstante: 0
für jedes<x>
In[2..n]
.quelle
g n='1':((=<<[2..n])=<<[(" ? "++).show,\x->" : 0"])
(\_->" : 0")=<<[2..n]
mit[2..n]>>" : 0"
Pyth, 17 Bytes
Demonstration.
quelle
Julia,
4431 BytesDadurch wird eine unbenannte Funktion erstellt, die eine Ganzzahl als Eingabe akzeptiert und eine Zeichenfolge zurückgibt. Um es zu nennen, geben Sie ihm einen Namen, z
f=n->...
.Zuerst fügen wir die ganzen Zahlen 1 bis n zusammen und trennen jedes mit
?
und Leerzeichen in einer einzelnen Zeichenkette. Dann hängen wir die Zeichenkette an, die n" : 0"
wiederholt 1-mal .Beispiele:
quelle
JavaScript ES7, 62 Byte
Ich weiß nicht, ob ich mehr Golf spielen kann. Aber es ist eine ziemlich einfache Lösung
Nur Firefox:
ES5-Äquivalent:
quelle
CoffeeScript, 52 Bytes
Erläuterung
quelle
SWI-Prolog, 90 Bytes
Auf jeden Fall nicht gewinnen, aber die
\+ (between(1,TopBound,N),\+do_something(N))
Konstruktion ist ziemlich interessant, um etwas auf einer Folge von ganzen Zahlen zu wiederholen.quelle
Swift 145 (135 ohne Leerzeichen)
Können Sie glauben, dass der Teil der Teilzeichenfolge tatsächlich länger ist als der Teil, der den Ausdruck erzeugt?
quelle
str[1]
oder zugreifen könnenstr[0...5]
. Natürlich können Sie eine kleine Erweiterung vornehmen, aber ich wünschte, die Standardbibliothek hätte dies aktiviertPerl, 36 Bytes
35
Zeichen+1
für-n
.Laufen mit:
quelle
Java, 71
Ich konnte mir nicht helfen, nachdem ich die Antwort von RCB kommentiert hatte . Also hier ist ein weiteres Java (71 wie wow, wenn Java nicht das längste ist!)
quelle
Java,
12588 BytesOriginal
Mit schönerer Formatierung und Variablennamen:
Verbessert - Dank Jack Ammos Kommentaren unten:
quelle
e+=" : 0";
. Sie können dann 1 Byte speichern, indem Sie i nachträglich erhöhen, wenn es anstelle der forloop-Zeile verwendet wird. Infor(int i=1;i<n;){s+=i+++" ? ";
Ihrer return-Anweisung wird der nach n hinzugefügte Speicherplatz nicht mehr benötigtreturn s+n+e;
. Sie können auch 1 Byte speichern, indem Sie verwendene=s
. Außerdem ist die if-Anweisung am Anfang nicht erforderlich, da die for-Schleifenlogik dieses Ergebnis sowieso garantiert.JavaScript (ES6), 59 Byte
Der gleiche Ansatz wie bei meiner CoffeeScript-Antwort.
String.prototype.repeat
kostet zu viele Zeichen.Demo
Firefox erstmal, da es sich um ES6 handelt.
quelle
K, 36 Bytes
quelle
Python 2,
63605856Probieren Sie es hier aus
Einfache Lösung: (63)
Edit : Ich wollte unbedingt eine rekursive Funktion ausprobieren. Hier ist es: (56)
Edit : Weiß jemand, warum das nicht funktioniert? Ich habe versucht, eine Liste mit einem Index von zu erstellen
c<n
, aber das hat aufgrund eines Stapelüberlauffehlers nicht funktioniert. Dasselbe mit diesem:quelle
0*
.rs , 77 bytes
Live-Demo und Testfälle.
Erläuterung:
Erweitern Sie die Zahl in eine Reihe von N Unterstrichen.
Erstellen Sie wiederholt einen Bereich von Unterstrichen, die durch Leerzeichen getrennt sind. Dies würde zB
___
zu_ __ ___
.An den letzten Satz von Unterstrichen (mit der Länge N) N-1 Instanzen von anhängen
: 0
.Ersetzen Sie jede Gruppe von Unterstrichen durch ihre Länge
?
, gefolgt von EXCEPT für die erste.Ersetzen Sie die erste durch die Nummer 1.
Aufgrund des Formats funktioniert dies auch
0
gut: Es wird nur die leere Zeichenfolge gedruckt.quelle
Swift,
7975 Bytesf
wird implizit als Funktion mit einemInt
Parameter deklariert, der a zurückgibtString
Arbeitet mit
n >= 1
und stürzt zur Laufzeit ab, wennn == 0
. Es gibt keine nachgestellten LeerzeichenBearbeiten: 2 * 2 Zeichen konnten entfernt werden, da die String-Interpolation nicht immer die kürzeste ist
Hinweis zum Bearbeiten: Das Kompilieren dieses Codes dauert ewig (es hört nicht auf), aber es würde definitiv dauern, wenn der Compiler damit umgehen könnte. Schauen Sie sich die Version vor dieser Bearbeitung an, um eine zu erhalten, die kompiliert werden kann
quelle
> <> , 32 + 3 = 35 Bytes
Beachten Sie, dass die zweite Zeile ein Leerzeichen enthält. Die +3 ist für die
-v
Flagge, zB wie ausgeführtEingabe als Codepunkt übernehmen wie
ist 34 Bytes, aber ich bevorzuge die obige Version, da es einfacher zu testen ist und es sowieso nicht gewinnen wird.
Erläuterung
Es gibt einiges an Pseudo-Rekursion und Missbrauch, schauen wir uns das an.
Die erste Zeile druckt das
"1 ? 2 ? ... n-1 ? "
Teil. Der Stack beginntn
dank des-v
Flags nur mit der Eingabe , und wir tun Folgendes:> <> ist toroidal, daher wird der obige Befehl in einer Schleife ausgeführt, bis der Stapel
n
oben ausn-1
Nullen besteht und sich an diesem Punkt zur zweiten Zeile bewegt.Wenn die zweite Zeile zum ersten Mal ausgeführt wird, wird der
n
Befehl ausgeführt undn
oben im Stapel gedruckt . Dies lässt nur dien-1
Nullen und wir machen das Folgende, ebenfalls in einer Schleife:quelle
" ? "ooo
Drucken Sie die Rückseite von "?" (Aber hey, Palindrome) ist das Drucken der Rückseite kürzer als das Drucken der tatsächlichen Zeichenfolge?Scala,
78715250 Bytesquelle
Objective-C, 346 Bytes
Wenn Sie
0
für dasint
oder etwas Negatives eintreten, wird ein ErgebnisNSRangeException
aufgrund desoutString
Inhalts ausgelöstnil
. Dies sollte unter iOS 2.0 und höher und vielen der neuesten Versionen von Mac OS X ausgeführt werden.Eine Aufschlüsselung des Codes:
Standardfunktionsdeklaration in Objective-C.
Erzeugt einen String, zu dem die Ausgabe gehen soll
outString
, und macht ihn veränderbar. (Mit anderen Worten, es kann gelesen und geschrieben werden.Fügt den ersten Teil der Zeichenfolge zur Ausgabe hinzu.
Bereinigt den Anfang der Zeichenfolge, um sicherzustellen, dass er
? 1
durch ersetzt wird1
. Hinweis: Wenn0
angegeben, tritt an dieser Stelle dasNSRangeException
auf, da kein Index vorhanden ist1
.Fügt der Zeichenfolge den zweiten Teil der Zeichenfolge hinzu.
Spuckt den String mit wieder aus
NSLog
und beendet die Funktion.Ausgabe:
Die Eingabe
0
ergibt folgendes Absturzprotokoll :1
gibt dies:2
gibt dies:7
gibt dies:200
gibt dies:quelle
C
8478 BytesC, obwohl es nicht das kürzeste ist, als Funktion:
Im Namen des Golf, der
int
ist Typspezifizierer links weg voni
,f
undn
weil es ist die Standardeinstellung.i
kann nicht initialisiert werden, da es sich um eine globale Variable handelt, die standardmäßig Null ist.f
gibt keinen Wert zurück, aber das verursacht nur eine Warnung.printf
ist nicht#include
'd. Zum Ausführen ist hier eine vollständige Programmversion:quelle
for(printf(...);--i;)
.C 63 Bytes
Wiederverwendbare Funktion, nimmt n als Argument.
Ungolfed und kommentiert (ziemlich unkompliziert):
quelle
Common Lisp, 84
Zuerst,
(loop for i from 1 to (read) collect i)
erzeugt eine Liste von ganzen Zahlen von 1 bis was in gesetzt wird, die als einziges Argument für die Funktion verwendet wird. Die wahre Magie liegt jedoch in der Steuerzeichenfolge, die wie Linienrauschen aussieht."~{~A ? ~}"
Durchläuft die gesamte Liste, die im ersten Argument gespeichert ist, und gibt jede Zahl mit der?
für die erste Hälfte aus.~@*
Setzt die Argumentliste auf das erste Argument zurück.~{~[~;~:;0~^ ? ~]~}
wiederholt die Liste und gibt sie aus0 ?
für jedes verbrauchte Argument aus, gibt aber nichts aus, wenn das Argument 0 oder 1 ist.quelle