Diese Herausforderung besteht einfach darin, eine Liste mit ganzen Zahlen zurückzugeben, die der Python-Bereichsfunktion ähnelt, mit der Ausnahme, dass jede aufeinanderfolgende Zahl so tief in Listen sein muss.
Regeln :
- Erstellen Sie ein Programm oder eine nicht anonyme Funktion
- Das Ergebnis sollte zurückgegeben oder gedruckt werden
- Das Ergebnis sollte in einer Liste (von Listen) oder einem Array (von Arrays) zurückgegeben werden.
- Wenn der Parameter Null ist, geben Sie eine leere Liste zurück
- Dies sollte in der Lage sein, einen ganzzahligen Parameter 0 <= n <70 zu behandeln.
- (rekursive Lösungen explodieren ziemlich schnell)
- Die Funktion sollte nur mit dem einen Parameter aufrufbar sein.
- Anderes Verhalten ist undefiniert.
- Dies ist Codegolf, also gewinnt der kürzeste Code.
Beispiel Anruf:
rangeList(6)
> [0, [1, [2, [3, [4, [5]]]]]]
Testfälle:
0 => []
1 => [0]
2 => [0, [1]]
6 => [0, [1, [2, [3, [4, [5]]]]]]
26 => [0, [1, [2, [3, [4, [5, [6, [7, [8, [9, [10, [11, [12, [13, [14, [15, [16, [17, [18, [19, [20, [21, [22, [23, [24, [25]]]]]]]]]]]]]]]]]]]]]]]]]]
69 => [0, [1, [2, [3, [4, [5, [6, [7, [8, [9, [10, [11, [12, [13, [14, [15, [16, [17, [18, [19, [20, [21, [22, [23, [24, [25, [26, [27, [28, [29, [30, [31, [32, [33, [34, [35, [36, [37, [38, [39, [40, [41, [42, [43, [44, [45, [46, [47, [48, [49, [50, [51, [52, [53, [54, [55, [56, [57, [58, [59, [60, [61, [62, [63, [64, [65, [66, [67, [68]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]
EDIT: isaacg Die Antwort ist die bisher kürzeste. Ich aktualisiere die akzeptierte Antwort, wenn jemand eine kürzere in einer Sprache findet, die zum Zeitpunkt der Veröffentlichung der Herausforderung vorhanden war. Danke fürs Spielen!
code-golf
array-manipulation
mbomb007
quelle
quelle
import math
ich nicht glaube, dass er in einer Funktion auftreten könnte , wenn jemand zum Beispiel in Python arbeiten wollte .Antworten:
Pyth, 13 Bytes
Probieren Sie es hier aus.
quelle
APL (
1318)Vorausgesetzt
⎕IO=0
:Erläuterung:
×⍵:
wenn⍵
positiv ist,,∘⊂∘,
: Verbinde den linken Operanden mit der Einschließung des rechten Operanden (iex ,∘⊂∘, y = [x, [y]]
)/
: reduzieren⍳⍵
: die Zahlen0..⍵-1
⊃
: das Ergebnis bekannt geben⋄
: Andernfalls⍬
: gibt die leere Liste zurück/
fehlschlägt⍬
und⍳0
die leere Liste anzeigt.)Nachtrag:
Diese Funktion gibt ein verschachteltes Array zurück. Es ist jedoch etwas schwierig, dies von der Standardausgabe von APL zu unterscheiden. Es trennt Array-Elemente durch Leerzeichen, sodass Sie die Verschachtelung nur durch doppelte Leerzeichen erkennen können. Hier ist eine Funktion, die ein verschachteltes Array verwendet und einen String zurückgibt, der das verschachtelte Array im Python-Stil formatiert (dh
[a,[b,[c,...]]]
).quelle
f←
das Programm zum Start hinzufügen , sofern Sie es nicht ändern, um Benutzereingaben zu akzeptieren.Haskell, 67 Bytes
In Haskell müssen alle Elemente einer Liste vom selben Typ sein, daher kann ich keine Ganzzahlen mit einer Liste von Ganzzahlen mischen und ich muss einen benutzerdefinierten Listentyp definieren
L
. Die Hilfsfunktion erstellt#
die erforderliche Liste rekursiv. Die Hauptfunktionp
sucht nach der leeren Liste und ruft#
ansonsten auf.Da neue Datentypen nicht standardmäßig gedruckt werden können (die Regeln erlauben nur das Zurückgeben der Liste), füge ich zu Demonstrationszwecken etwas mehr Code hinzu:
Jetzt:
quelle
Python, 48 Bytes
Verwendung der Listenmultiplikation zur Behandlung des Sonderfalls.
quelle
*(i<n-1)
kann wie folgt durchgeführt werden[:n+~i]
, da es sich um eine Singleton-Liste handelt.Mathematica, 33
quelle
CJam, 16 Bytes
Dies ist ein volles Programm. Es nimmt Eingaben über STDIN entgegen und druckt das endgültige Array auf STDOUT.
Wie beim anderen CJam-Eintrag wird die
0
Eingabe gedruckt,""
da dies die Darstellung eines leeren Arrays in CJam ist.Wie es funktioniert :
Probieren Sie es hier online aus
quelle
JavaScript (ES6) 40
Rekursive Lösung, ziemlich robust, keine Schläge. Update schlägt in der Nähe von 6500 mit "zu viel Rekursion" fehl
Iterative Lösung (45) Keine Einschränkungen außer der Speichernutzung
Versuchen Sie es mit F (1000): Die FireBug-Konsole zeigt nicht mehr als 190 verschachtelte Arrays an, aber sie sind vorhanden
quelle
Java,
88107105104102 BytesZiemlich lange im Vergleich zu den anderen, obwohl Sie mit Java nicht viel besser machen können. Es genügt eine Prüfung, um festzustellen, ob die Rekursion fortgesetzt werden soll.
quelle
import java.util.*;
dafür eigenständig sein (oder sich voll qualifizierenjava.util.List
undjava.util.Stack
, aber das ist viel länger). +19, um es auf 107 zu bringen, immer noch 7 besser als die Java-Antwort, an der ich gearbeitet habe: Do!=n
können seino<n
, und Sie können den Ternär zu tauscheno<n?o++:""
.final
Onint n
entfernt werden kann.Python 2, 56 Bytes
Ich vermute, das könnte mehr Golf sein.
Tests:
quelle
CJam, 17 Bytes
Ich weiß, dass Optimizer 16 gefunden hat, aber hier ist das Beste, was ich tun kann:
Dies ist ein Block, der einer Funktion in CJam am nächsten kommt, die eine Ganzzahl auf dem Stapel annimmt und das gewünschte verschachtelte Array zurücklässt.
Verwenden Sie dieses Programm, um es zu testen. Dabei wird die Eingabe auf den Stapel gelegt, dann die Funktion aufgerufen und der Stapel überprüft. Beachten Sie, dass für
0
die Stapelausgabe Folgendes enthalten wird""
: Dies ist CJams native Darstellung eines leeren Arrays.quelle
Rubin 46
Testen Sie es online: http://ideone.com/uYRVTa
quelle
C # - 100
Einfache Rekursion. Überprüfen Sie den Sonderfall Null und kreuzen Sie mit einer Variablen nach oben und mit der anderen nach unten an
C ++ 87
(Visual C ++ 2012)
Dieser ist großartig, womit ich byzantinisch meine, aber es ist die gleiche Grundidee wie der c # one.
Es ist eine Array-Implementierung im C-Stil, also gibt es kein Array, sondern einen Int-Zeiger, in dem ich sowohl Ints als auch andere Zeiger gespeichert habe. So was:
[0,*] *->[1,#] #-> [2,&] &-> etc
folgt:, wobei die Symbole Pseudocode für den int-Wert eines Zeigers sind und -> dort, wo er im Speicher verweist.Was für eine hervorragende, benutzerfreundliche Implementierung von gezackten Arrays im C-Stil, die ich mir ausgedacht habe (cough), aber ich behaupte, es ist plausibel genug, um den Regeln der Frage zu entsprechen.
Es gibt hier eine Menge Missbrauch von ternären Operatoren und auch eine Menge Missbrauch der impliziten Umwandlung von int zu bool.
Beispiel: Wenn wir lassen
int *bar = (int*)A(3);
, können wir sehen:Welches ist Pointer Talk für [0, [1, [2]]].
Okay gut. Es muss eigentlich nicht das Schreckliche sein. Hier ist ein Testcode zum Ausführen dieses C ++ - Codes:
}
quelle
C++
.Array g(params object[]a)=>a;Array f(int y,int x=0)=>y<1?g():y<2?g(x):g(x,f(y-1,x+1));
Pyth, 15 Bytes
Was in Python wirklich heißt:
quelle
qJ_1
ist das gleiche wie!Q
. UndJtQ
tatsächlich verschwendet 1 Byte.?Y!Qu[HG)_UtQ[tQ
[tQ
zu]tQ
, was äquivalent ist, Sie tauschen zu Reihenfolge der Operationen?
, so dass Sie ersetzen können ,!Q
mitQ
. Dies führt dazu, dass?u[HG)_UtQ]tQQY
- 1 weiteres Byte gespeichert wird.Haskell ,
65 59 4541 BytesDiese verschachtelten Listen haben dieselbe Datenstruktur wie die verwurzelten Listen
Tree
, außer dass sie auch leer sein können. Daher können wir eine Liste von ihnen verwenden - auch a genanntForest
, um sie darzustellen.Probieren Sie es online!
Erläuterung
Zunächst müssen wir den
Tree
Datentyp implementieren :Von dort ist es nur eine Rekursion mit zwei Parametern
m
(Aufwärtszählen) undn
um zu verfolgen, wann zu beenden ist:Alternative 61 Bytes
Probieren Sie es online!
Erläuterung
Die Funktion
unfoldForest
nimmt eine Liste von Anfangswerten und eine Funktion aufx -> (y,[x])
. Für jeden Anfangswertx
es entfaltet einen Baum mit der Funktion, ein Tupel produzieren ,(y,xs)
woy
die Wurzel werden wird und diexs
verwendet werden , um den Vorgang zu wiederholen:quelle
Perl - 44
Fügt auf Anfrage eine Erklärung hinzu. Sie können es hier ausprobieren .
quelle
nil
oder was auch immer das Äquivalent ist? Ich frage, weil auf der Seite, die Sie auf das innerste Array verlinken, sieht aus wie(3,)
undef
ist das Äquivalent vonnil
odernull
in Perl und es gibt kein zusätzliches Element. Perl reduziert Arrays, sodass verschachtelte Array-Referenzen erstellt werden.JavaScript, 93 Bytes
Das ist nicht ideal, aber ich könnte es genauso gut versuchen. Ich werde versuchen, dies später weiter zu spielen, obwohl ich im Moment keinen offensichtlichen Weg dazu sehe.
quelle
Python, 75 Bytes
Dies ist nur für die Show. Es ist das Programm, das ich beim Erstellen / Entwerfen dieser Herausforderung geschrieben habe.
quelle
Python, 44
Erstellt rekursiv den Baum. Das
[:n]
am Ende ist auf Sonderfall hinn==0
die leere Liste zu geben.quelle
and
undor
Räume ausgelassen neben ganzen Zahlen haben kann, aberelse
nicht kann.else
beginnt damite
und Dinge wie1e6
sind gültige Zahlenliterale.else
, zum Beispielx = 1 if y==2else 5
funktioniert.Joe , 8 Bytes
Hinweis: Dies ist eine nicht konkurrierende Antwort. Die erste Version von Joe wurde nach dieser Frage veröffentlicht.
Was haben wir hier?
F:
definiert eine Funktion F , die eine Kette von ist/+,
,M]
undR
. Wenn Sie anrufenFn
, wird zuerstRn
ausgewertet und der Bereich von 0 bis n (exklusiv) zurückgegeben.M]
Bricht jedes Element in eine Liste um. Dann wird die Liste angewendet/+,
.x +, y
kehrt zurückx + [y]
./
ist eine rechte Falte. So/+,a b c d...
kehrt zurück[a, [b, [c, [d...]]]
.Beispielaufrufe (Code wird um 3 eingerückt, Ausgabe um 0):
quelle
Ruby - Rekursive Version - 52
Nichtrekursive Version:
666257Beispielausgabe (für beide Versionen gleich)
Die nicht-rekursive Version kann beliebig große Eingaben verarbeiten.
Beide Versionen akzeptieren auch problemlos negative Zahlen
quelle
stack level too deep (SystemStackError)
)PHP 5.4 (67 Bytes):
Ich weiß, ich weiß.
Es ist weit davon entfernt, die kürzeste Antwort zu sein.
Aber es funktioniert!
Hier ist es:
Sie können es hier testen: https://ideone.com/42L35E (ignorieren Sie den Fehler)
Javascript (57 Bytes):
Dies ist derselbe genaue Code, außer dass Javascript in Bezug auf die Rückgabe pingelig ist und ich die Variablennamen reduziert habe:
Sehen? Gleicher Code!
ES6 (49 Byte):
Grundsätzlich derselbe genaue Code, jedoch reduziert für ES6:
quelle
f=lambda
But it's pretty standard codegolf for functions that they have to be callable by name (aka, more than once and without typing the entire function again.)
-> habe noch nie davon gehört und ich benutze diese Website seit etwas knapp einem Jahr. Außerdem ist dies ein ungültiges Argument, da Sie die Funktionen einer Variablen zuweisen können.Javascript (114 Bytes):
Alle anderen machten rekursiv, also wollte ich eine iterative Lösung ausprobieren. Ich habe jedoch zu viele Sonderfälle.
Ich halte eine Master-Liste, und dann Schleife und Anhängen neuer Listen mit neuen Nummern.
quelle
Common Lisp (95 Bytes):
quelle
JavaScript,
3537 BytesRekursive Lösung
Probieren Sie es online!
quelle
05AB1E , 11 Bytes
Probieren Sie es online oder überprüfen Sie alle Testfälle .
11-Byte-Alternative:
Probieren Sie es online oder überprüfen Sie alle Testfälle .
Erläuterung:
05AB1E hat keine Schleifen, die nach unten verlaufen. Um also in dem Bereich zu schleifen, muss
(input, 0]
ich entweder:ݨR
; erstellen Sie einen Bereich[0, input]
, entfernen Sie das letzte Element, kehren Sie ihn um) und durchlaufen Sie ihn dann (vy
).[0, input)
stattdessen den Bereich (F
) und nehmen Sie die absolute Differenz zwischen dem Schleifenindex und der Eingabe-1 (NI<α
).quelle