Wyzwanie polega po prostu na zwróceniu listy liczb całkowitych, podobnej do funkcji zakresu Pythona, z tym wyjątkiem, że każda kolejna liczba musi znajdować się tak głęboko na listach.
Zasady :
- Utwórz program lub funkcję nieanonimową
- Powinien zwrócić lub wydrukować wynik
- Wynik należy zwrócić w postaci listy (list) lub tablicy (tablic)
- Jeśli parametr wynosi zero, zwróć pustą listę
- Powinno to być w stanie obsłużyć wartość całkowitą parametru 0 <= n <70.
- (rozwiązania rekurencyjne wybuchają dość szybko)
- Funkcja powinna być możliwa do wywołania za pomocą tylko jednego parametru.
- Inne zachowanie jest niezdefiniowane.
- To jest kod golfowy, więc wygrywa najkrótszy kod.
Przykładowe połączenie:
rangeList(6)
> [0, [1, [2, [3, [4, [5]]]]]]
Przypadki testowe:
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]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]
EDYCJA: odpowiedź Isaacga jest najkrótsza jak dotąd. Zaktualizuję zaakceptowaną odpowiedź, jeśli ktoś znajdzie krótszy w języku, który istniał w momencie opublikowania wyzwania. Dzięki za grę!
code-golf
array-manipulation
mbomb007
źródło
źródło
import math
na przykład w Pythonie, nie sądzę, aby mógł wystąpić w funkcji.Odpowiedzi:
Pyth, 13 bajtów
Wypróbuj tutaj.
źródło
APL (
1318)Zakładając
⎕IO=0
:Wyjaśnienie:
×⍵:
jeśli⍵
jest pozytywny,,∘⊂∘,
: dołącz lewy operand do otaczania prawego operandu (tj.x ,∘⊂∘, y = [x, [y]]
)/
: redukować⍳⍵
: liczby0..⍵-1
⊃
: ujawnij wynik⋄
: Inaczej⍬
: zwraca pustą listę/
kończy się niepowodzeniem⍬
i⍳0
daje pustą listę).Uzupełnienie:
Ta funkcja zwraca tablicę zagnieżdżoną. Jednak trudno jest to stwierdzić na podstawie domyślnego wyjścia APL. Oddziela elementy tablicy od spacji, dzięki czemu można rozpoznać zagnieżdżanie tylko przez podwójne spacje. Oto funkcja, która pobierze zagnieżdżoną tablicę i zwróci ciąg znaków, formatując zagnieżdżoną tablicę w stylu Pythona (tj
[a,[b,[c,...]]]
.).źródło
f←
na początku programu, chyba że zmodyfikujesz go tak, aby akceptował dane wprowadzone przez użytkownika.Haskell, 67 bajtów
W Haskell wszystkie elementy listy muszą być tego samego typu, więc nie mogę mieszać liczb całkowitych z listą liczb całkowitych i muszę zdefiniować niestandardowy typ listy
L
. Funkcja pomocnicza#
rekurencyjnie tworzy wymaganą listę. Główna funkcjap
sprawdza pustą listę i w#
przeciwnym razie wywołuje .Ponieważ nowe typy danych nie mogą być drukowane domyślnie (reguły zezwalają tylko na zwrócenie listy), dodaję trochę kodu dla celów demonstracyjnych:
Teraz:
źródło
Python, 48 bajtów
Używanie mnożenia listy do obsługi specjalnego przypadku.
źródło
*(i<n-1)
można to zrobić[:n+~i]
, ponieważ jest to lista singletonów.Mathematica, 33
źródło
CJam, 16 bajtów
To jest pełny program. Pobiera dane wejściowe przez STDIN i drukuje ostatnią tablicę na STDOUT.
Podobnie jak w przypadku innych pozycji CJam,
0
dane wejściowe zostaną wydrukowane,""
ponieważ jest to reprezentacja pustej tablicy w CJam.Jak to działa :
Wypróbuj online tutaj
źródło
JavaScript (ES6) 40
Rozwiązanie rekurencyjne, dość solidne, bez ciosów. Aktualizacja kończy się niepowodzeniem w okolicach 6500 z „zbyt dużą rekurencją”
Rozwiązanie iteracyjne (45) Bez ograniczeń oprócz użycia pamięci
Wypróbuj F (1000): konsola FireBug nie wyświetli więcej niż 190 zagnieżdżonych tablic, ale one tam są
źródło
Java,
88107105104102 bajtówDość długo w porównaniu do innych, choć Java nie da się lepiej. Wystarczy sprawdzić, czy kontynuować rekurencję.
źródło
import java.util.*;
to zrobić samowystarczalnie (lub w pełni się kwalifikowaćjava.util.List
ijava.util.Stack
, ale to znacznie dłużej). +19, aby 107, wciąż 7 lepszych niż odpowiedź Java, nad którą pracowałem: Do!=n
możesz byćo<n
i możesz zamienić trójskładnik nao<n?o++:""
.final
onint n
może być usunięty.Python 2, 56 bajtów
Podejrzewam, że można by bardziej zagrać w golfa.
Testy:
źródło
CJam, 17 bajtów
Wiem, że Optymalizator znalazł 16, ale oto najlepsze, co mogę zrobić:
Jest to blok najbliższy funkcji w CJam, która przyjmuje liczbę całkowitą na stos i pozostawia żądaną zagnieżdżoną tablicę.
Użyj tego programu do przetestowania go , który umieszcza dane wejściowe na stosie, a następnie wywołuje funkcję i sprawdza stos. Zauważ, że dla
0
, wyjście stosu będzie zawierać""
- jest to natywna reprezentacja pustej tablicy przez CJam.źródło
Rubinowy 46
Przetestuj online: http://ideone.com/uYRVTa
źródło
C # - 100
Prosta rekurencja. Sprawdź zerowy przypadek specjalny i zaznacz jedną zmienną w górę, drugą w dół
C ++ 87
(Visual C ++ 2012)
Ten jest świetny, przez co rozumiem bizantynę, ale jest to ten sam podstawowy pomysł, co c # one.
Jest to implementacja tablicy w stylu C, więc nie daje ci tablicy, daje wskaźnik int, w którym przechowywałem zarówno ints, jak i inne wskaźniki. W ten sposób:
[0,*] *->[1,#] #-> [2,&] &-> etc
gdzie symbole są pseudo kodem wartości int wskaźnika, a -> wskazuje miejsce w pamięci.Cóż za doskonała, łatwa w użyciu implementacja poszarpanych tablic w stylu c (kaszel), ale uważam, że jest wystarczająco prawdopodobna, aby była zgodna z regułami pytania.
Jest tu całkiem sporo nadużywających operatorów trójskładnikowych, a także sporo nadużywania niejawnej obsady od int do bool.
Przykład: jeśli pozwolimy
int *bar = (int*)A(3);
, możemy zobaczyć:Który jest wskaźnikiem dla [0, [1, [2]]].
Ok dobrze. To wcale nie musi być okropne. Oto kod testowy do uruchomienia tego kodu c ++:
}
źródło
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 bajtów
Co tak naprawdę mówi w Pythonie:
źródło
qJ_1
jest taki sam jak!Q
. IJtQ
faktycznie marnuje 1 bajt.?Y!Qu[HG)_UtQ[tQ
[tQ
się]tQ
, co jest równoważne, by zamienić kolejność operacji?
, więc można wymienić!Q
sięQ
. Powoduje to?u[HG)_UtQ]tQQY
- zapisano jeszcze 1 bajt.Haskell ,
65 59 4541 bajtówTe zagnieżdżone listy mają tę samą strukturę danych co zrootowane
Tree
s, z tym że mogą być również puste. Dlatego możemy użyć ich listy - zwanej także a,Forest
aby je reprezentować.Wypróbuj online!
Wyjaśnienie
Przede wszystkim musimy zaimplementować
Tree
typ danych:Stamtąd jest to po prostu rekurencja przy użyciu dwóch parametrów
m
(zliczanie w górę) in
śledzenie, kiedy należy zakończyć:Alternatywnie, 61 bajtów
Wypróbuj online!
Wyjaśnienie
Funkcja
unfoldForest
przyjmuje listę wartości początkowych i funkcjęx -> (y,[x])
. Dla każdej wartości początkowejx
to rozwija drzewa przy użyciu funkcji, tworząc krotki(y,xs)
gdziey
staną korzeń ixs
są wykorzystywane, aby powtórzyć procedurę:źródło
Perl - 44
Na żądanie doda wyjaśnienie. Możesz spróbować tutaj .
źródło
nil
lub cokolwiek równoważnego? Pytam, ponieważ na stronie, na której znajduje się link do najbardziej wewnętrznej tablicy wygląda(3,)
undef
jest równowagąnil
lubnull
w Perlu i nie ma dodatkowego elementu. Perl spłaszcza tablice, więc tworzy to zagnieżdżone odwołania do tablic.JavaScript, 93 bajty
To nie jest idealne, ale równie dobrze mogę spróbować. Później spróbuję zagrać w golfa, choć na razie nie widzę oczywistego sposobu.
źródło
Python, 75 bajtów
To tylko na pokaz. Jest to program, który napisałem podczas tworzenia / projektowania tego wyzwania.
źródło
Python, 44
Rekurencyjnie tworzy drzewo. Na
[:n]
koniec należy w specjalnym przypadkun==0
podać pustą listę.źródło
and
ior
może mieć spacji pominięte obok liczb całkowitych, aleelse
nie mogę.else
zaczyna się ode
, a rzeczy takie jak1e6
są poprawnymi literałami liczb.else
, npx = 1 if y==2else 5
. działa.Joe , 8 bajtów
Uwaga: to jest niekonkurencyjna odpowiedź. Pierwsza wersja Joe została wydana po tym pytaniu.
Co my tu mamy?
F:
określa funkcji F, która jest łańcuch/+,
,M]
aR
. Kiedy zadzwoniszFn
, najpierwRn
zostanie oceniony, zwracając zakres od 0 do n, wyłącznie.M]
zawija każdy element do listy. Następnie stosowana jest lista/+,
.x +, y
zwracax + [y]
./
jest prawy pas. Tak więc/+,a b c d...
powraca[a, [b, [c, [d...]]]
.Przykładowe wywołania (kod jest wcięty przez 3, a wynik przez 0):
źródło
Ruby - wersja rekurencyjna - 52
Wersja nierekurencyjna:
666257Przykładowe dane wyjściowe (takie same dla obu wersji)
Wersja nierekurencyjna może obsługiwać dowolnie duże dane wejściowe.
Obie wersje z wdzięcznością przyjmują również liczby ujemne
źródło
stack level too deep (SystemStackError)
)PHP 5.4 (67 bajtów):
Wiem wiem.
Nie jest to najkrótsza odpowiedź.
Ale to działa!
Oto on:
Możesz to przetestować tutaj: https://ideone.com/42L35E (zignoruj błąd)
JavaScript (57 bajtów):
To jest dokładnie ten sam kod, z tym wyjątkiem, że JavaScript jest wybredny w kwestii zwrotu i zredukowałem nazwy zmiennych:
Widzieć? Ten sam kod!
ES6 (49 bajtów):
Zasadniczo ten sam dokładny kod, ale zmniejszony dla ES6:
źródło
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.)
-> nigdy o tym nie słyszałem, a ja korzystam z tej witryny przez prawie rok. Poza tym jest to niepoprawny argument, ponieważ można przypisać funkcje do zmiennej.JavaScript (114 bajtów):
Wszyscy inni robili rekurencję, więc chciałem wypróbować iteracyjne rozwiązanie. Mam jednak zbyt wiele specjalnych przypadków.
Trzymam główną listę, a następnie zapętlam i dołączam nowe listy z nowymi numerami.
źródło
Common Lisp (95 bajtów):
źródło
JavaScript,
3537 bajtówRozwiązanie rekurencyjne
Wypróbuj online!
źródło
05AB1E , 11 bajtów
Wypróbuj online lub sprawdź wszystkie przypadki testowe .
11-bajtowa alternatywa:
Wypróbuj online lub sprawdź wszystkie przypadki testowe .
Wyjaśnienie:
05AB1E nie ma pętli, które schodzą w dół, więc aby zapętlić zakres,
(input, 0]
muszę albo:ݨR
; utwórz zakres[0, input]
, usuń ostatni element, odwróć), a następnie zapętl go (vy
);[0, input)
zamiast (F
) i weź absolutną różnicę między indeksem pętli a wejściem 1 (NI<α
).źródło