Naturalna konstrukcja


27

Liczby naturalne, w tym 0, są formalnie zdefiniowane jako zbiory, w następujący sposób :

  • Liczba 0 jest zdefiniowana jako pusty zestaw, {}
  • Dla n ≥ 0 liczba n +1 jest zdefiniowana jako n ∪ { n }.

W konsekwencji n = {0, 1, ..., n -1}.

Pierwsze liczby zdefiniowane w tej procedurze to:

  • 0 = {}
  • 1 = {{}}
  • 2 = {{}, {{}}}
  • 3 = {{}, {{}}, {{}, {{}}}}

Wyzwanie

Biorąc pod uwagę n, wypisz jego reprezentację jako zbiór.

Zasady

Wyjście może konsekwentnie używać wspornik charakteru takie jak {}, [], ()lub <>. Dowolne znaki (takie jak 01) są niedozwolone.

Zamiast przecinka, jak powyżej, separatorem może być dowolny znak interpunkcyjny; lub może nie istnieć.

Spacje (nie nowe wiersze) mogą być wprowadzane arbitralnie i niekonsekwentnie.

Na przykład liczba 2 z nawiasami kwadratowymi i średnikiem jako separatorem jest [[]; [[]]]lub jest równoważna [ [ ]; [ [ ] ] ]lub nawet[ [ ] ;[ []]]

Kolejność w której elementy zestawu są określone nie ma znaczenia. Możesz więc użyć dowolnej kolejności w reprezentacji. Na przykład są to niektóre prawidłowe dane wyjściowe dla 3:

{{},{{}},{{},{{}}}}
{{{}},{{},{{}}},{}}
{{{}},{{{}},{}},{}}

Możesz napisać program lub funkcję . Dane wyjściowe mogą być łańcuchem lub, jeśli używasz funkcji, możesz zwrócić zagnieżdżoną listę lub tablicę, których ciąg znaków jest zgodny z powyższym.

Przypadki testowe

0  ->  {}
1  ->  {{}}
2  ->  {{},{{}}}
3  ->  {{},{{}},{{},{{}}}}
4  ->  {{},{{}},{{},{{}}},{{},{{}},{{},{{}}}}}
5  ->  {{},{{}},{{},{{}}},{{},{{}},{{},{{}}}},{{},{{}},{{},{{}}},{{},{{}},{{},{{}}}}}}
6  ->  {{},{{}},{{},{{}}},{{},{{}},{{},{{}}}},{{},{{}},{{},{{}}},{{},{{}},{{},{{}}}}},{{},{{}},{{},{{}}},{{},{{}},{{},{{}}}},{{},{{}},{{},{{}}},{{},{{}},{{},{{}}}}}}}
7  ->  {{},{{}},{{},{{}}},{{},{{}},{{},{{}}}},{{},{{}},{{},{{}}},{{},{{}},{{},{{}}}}},{{},{{}},{{},{{}}},{{},{{}},{{},{{}}}},{{},{{}},{{},{{}}},{{},{{}},{{},{{}}}}}},{{},{{}},{{},{{}}},{{},{{}},{{},{{}}}},{{},{{}},{{},{{}}},{{},{{}},{{},{{}}}}},{{},{{}},{{},{{}}},{{},{{}},{{},{{}}}},{{},{{}},{{},{{}}},{{},{{}},{{},{{}}}}}}}}

Odpowiedzi:


8

Galaretka , 3 bajty

Ḷ߀

To jest monadyczny link. Wypróbuj online!

Jak to działa

Każda liczba naturalna jest zbiorem wszystkich poprzednich liczb naturalnych, tj. N = {0,…, n-1} . Ponieważ nie ma liczb naturalnych poprzedzających 0 , mamy 0 = {} .

Ḷ߀  Monadic link. Argument: n (natural number)

Ḷ    Unlength; yield [0, ..., n-1].
 ߀  Recursively map this link over the range.

3
„Unlength” Lubię funkcje odwrotne Jelly.
ETHproductions

1
Jeśli dobrze rozumiem, brak długości to w zasadzie zakres [0, n)?
Downgoat 30.09.16

5
@Downgoat To prawda. Staram się trzymać litery i litery z kropką poniżej jako odwrotności boczne. Ponieważ ḶLnie ma operacji, mnemonik nie ma długości. Istnieją również pliki niebinarne, undecimal, unhalve, unsine, unarccosine itp.
Dennis,

1
Czekaj, unarccosine? Czy nie byłby to po prostu cosinus?
ETHproductions

@ETHproductions Tak. Jednak nie ma litery C z kropką poniżej.
Dennis


10

JavaScript (ES6), 32 bajty

f=n=>[...Array(n).keys()].map(f)

Wystarczająco proste.


1
@Downgoat Myślę, że to może być pierwszy raz, kiedy użyłem .map()bez funkcji strzałki w środku :-)
ETHproductions

cóż technicznie f jest funkcją strzałki: P
Downgoat

@ETHproductions Naprawdę? .map(Number)jest dość powszechnym przypadkiem.
Sebastian Simon

@Xufox Dobrze, myślę, że przynajmniej raz to zrobiłem.
ETHprodukcje

4
@Xufox Choć .map(e=>+e)jest krótszy, bajt.
Conor O'Brien

7

Perl 6 , 16 bajtów

{({@_}…*)[$_]}

Zwraca zagnieżdżoną strukturę danych.

Przykład:

say {({@_}…*)[$_]}( 4 );
# [[] [[]] [[] [[]]] [[] [[]] [[] [[]]]]]

Wyjaśnienie:

{   # lambda with implicit parameter 「$_」

  (


    # produce a lazy infinite sequence of all results

    {       # lambda with implicit parameter 「@_」
      @_    # array containing all previously seen values in the sequence
    }

           # keep repeating that block until:

    *       # Whatever ( never stop )


  )[ $_ ]   # use the outer block's argument to index into the sequence

}

To jest ... imponujące.
Conor O'Brien

6

Ruby, 27 21 bajtów

Jestem nowy w rubinowym golfie, ale tutaj nic nie idzie. Dzięki Jordanowi za oszczędność 6 bajtów!

f=->s{(0...s).map &f}

Jest to funkcja rekurencyjna f(konkretnie proc) i wymaga argumentu s. To odwzorowuje proc fciągu 0...s, który jest zasięg [0, s).


Można wymienić map{|e|f[e]}z map &f.
Jordan

@Jordan Wow, miło!
Conor O'Brien


4

CJam , 14 bajtów

"[]"{_)@\]}ri*

Wypróbuj online!

Wyjaśnienie

"[]"            e# Push this string. It is the representation of 0, and also serves
                e# to initialize
    {     }ri*  e# Repeat this block as many times as the input number
     _          e# Duplicate
      )         e# Uncons: split into array without the last element, and last element
       @\       e# Rotate, swap
         ]      e# Pack stack contents into an array
                e# Implicitly display

W każdej iteracji blok buduje reprezentację liczby na podstawie liczby poprzedniej. Aby to zilustrować, rozważmy drugą iterację, w której reprezentacja liczby 2jest zbudowana z tej 1, która jest łańcuchem "[[]]".

  1. Stos zawiera "[[]]"
  2. Po wyciągu _(duplikacie) zawiera "[[]]":"[[]]"
  3. Po wypowiedzi )(uncons) zawiera "[[]]", "[[]","]"
  4. Po oświadczenie @(Obrót) zawiera "[[]", "]","[[]]"
  5. Po oświadczenie \(swap) zawiera "[[]", "[[]]","]"
  6. Po instrukcji ](spakuj do tablicy) zawiera ona ["[[]" "[[]]" "]"], która byłaby wyświetlana jako ciąg "[[][[]]]".

4

Cheddar, 17 bajtów

n f->(|>n).map(f)

Krótka rekurencja + Krótki zasięg + Krótka iteracja = Wyzwanie, w którym cheddar ma się bardzo dobrze

Nie konkuruje, 11 bajtów

n f->|>n=>f

=>Operator został dodany po to wyzwanie został zwolniony dzięki czemu ta odpowiedź nie konkurują.

Może to wyglądać na mylące, ale pozwolę sobie uprościć:

n f -> |> n => f

w zasadzie njest wejściem i fsamą funkcją. |>ngeneruje [0, n) i =>odwraca mapy f.


1
Niekonkurencyjny wygląda bardzo ładnie: D
Conor O'Brien

4

05AB1E , 8 7 bajtów

)IF)©`®

Wyjaśnienie

)         # wrap stack in a list, as stack is empty this becomes the empty list []
 IF       # input number of times do:
   )      # wrap stack in list
    ©     # store a copy of the list in the register
     `    # flatten the list
      ®   # push the copy from the register
          # implicitly print top value of stack after the last loop iteration

Wypróbuj online!

Zaoszczędzono 1 bajt dzięki Adnanowi.


Mniej niż 2 minuty LOL
Luis Mendo

@LuisMendo Dosłownie właśnie się zalogowałem, kiedy opublikowano wyzwanie :)
Emigna 30.09.16

Wierzę, że możesz usunąć ostatni nawias: p
Adnan

@Adnan: Ups. Nie wiem, jak mi tego brakowało :)
Emigna

3

Pyth, 4 bajty

LyMb

Zestaw testowy

L: Zdefiniuj funkcję za ypomocą wejściab

yMb: yodwzorowany w zakresie0, 1, ..., b-1

Na wejściu 0 mapa powraca []. W przeciwnym razie zwraca ymapowane na wszystkie liczby do b.


3

MATL , 13 bajtów

Xhi:"tY:Xh]&D

Wypróbuj online!

Wyjaśnienie

Xh              % Concatenate the stack contents into cell array. Since the stack
                % is empty, this produces the empty cell array, {}
  i:"     ]     % Take input number. Repeat that many times
     t          % Duplicate the cell array that is at the top of the stack
      Y:        % Unbox it, i.e., push its contents onto the stack
        Xh      % Concatenate the stack contents into a cell array
           &D   % String representation. Implicitly display

2
Bardzo sprytna odpowiedź
Suever

@Suever Thanks! O wiele za długo ...
Luis Mendo,

3

Perl, 27 bajtów

Obejmuje +1 dla -p

Wydaje się, że wiele różnych metod kończy się na 27 lub 28 bajtów. na przykład

#!/usr/bin/perl -p
$\=$_="{@F}"for@F[0..$_]}{

Najlepsze, co mogłem znaleźć, to

#!/usr/bin/perl -p
s/./{$_/ for($\="{}")x$_}{

ponieważ na starszych perlach możesz upuścić miejsce przed fori uzyskać 26 bajtów



2

Mathematica, 31 bajtów

Prosto implementuje definicję jako listę zagnieżdżoną. Używa nienazwanej funkcji, która rekurencyjnie wywołuje się za pomocą #0.

If[#<1,{},Join[t=#0[#-1],{t}]]&

4
Możesz dużo zaoszczędzić, używając operatora nazwanego oraz Unionzamiast Join: ±0={};±n_:={t=±(n-1)}⋃t... Jednak w tym przypadku jeszcze krótsze jest znalezienie rozwiązania iteracyjnego:Nest[{#}⋃#&,{},#]&
Martin Ender

2

Siatkówka , 24 18 bajtów

.+
$*1<>
+`1<
<<$'

Wypróbuj online! (Pierwszy wiersz włącza pakiet testowy oddzielony od linii).

Wyjaśnienie

.+
$*1<>

Konwertuje to dane wejściowe na jednoargumentowe i dołącza <>reprezentację 0.

+`1<
<<$'

Tutaj +wskazuje, że to podstawienie powinno być uruchamiane w pętli, aż łańcuch przestanie się zmieniać. Łatwiej to wyjaśnić, przechodząc przez poszczególne etapy gry w golfa. Let's z tą wersją podstawienia:

1<(.*)>
<<$1>$1>

Jest to zgodne z ostatnią 1jednostkową reprezentacją pozostałych danych wejściowych (aby je usunąć i zmniejszyć dane wejściowe), a także zawartością bieżącego zestawu na końcu. Jest on następnie zastępowany nowym zestawem zawierającym poprzedni oraz jego zawartość. Możemy jednak zauważyć, że $1następuje to >w obu przypadkach, a zatem możemy uwzględnić go w samym przechwytywaniu i pominąć we wzorcu podstawiania. To prowadzi do formy

1<(.*)
<<$1$1

Jednak teraz możemy zauważyć, że (.*)po prostu przechwytuje sufiks łańcucha po, 1<a nawet wstawiamy ten sufiks na końcu za pomocą $1. Ponieważ składnia podstawienia daje nam możliwość odwołania się do części ciągu po dopasowaniu $', możemy po prostu pominąć obie te części i skończyć na wersji użytej w odpowiedzi:

1<
<<$'

Jesteś pewien, że to Retina, a nie język> <>? :-P
Luis Mendo

@LuisMendo Chyba mógłbym użyć {}, ale <>to jedyna para, która nigdy nie potrzebuje ucieczki, więc pomyślałem, że pójdę z tym. ;)
Martin Ender

2

Niedociążenie , 14 bajtów

((:a*)~^()~^a)

Wypróbuj online!

Pełne programy niedociążenia nie mogą pobierać danych wejściowych za pomocą żadnej z naszych zdefiniowanych metod, więc jest to funkcja, która pobiera dane wejściowe ze stosu jako liczby kościelnej (normalny sposób definiowania liczb całkowitych w programie Niedociążenie) i generuje dane wyjściowe do stosu jako ciąg .

Do (…)grupowania markery mają obowiązek dokonać tej funkcji (wielokrotnego użytku), a nie tylko użyteczny fragmencie (raz). Opakowanie w łączu TIO wywołuje tę funkcję destrukcyjnie przy użyciu ^, ale można ją ponownie wykorzystać, wykonując jej kopię i zużywając tylko jedną z kopii podczas wywoływania. Dostarcza również dane wejściowe do programu (tutaj (:*:*), tj. 4) i drukuje dane wyjściowe za pomocą S.

Wyjaśnienie

Niedociążenie zaskakująco nadaje się do tego zadania, gdy pojawiają się plandeki Turinga, mające takie przydatne prymitywy, jak „kopiuj” i „otaczaj nawiasami”. (W jakiś sposób niedociążenie, zwykle bardzo szczegółowy język, pokonuje Mathematica, zwykle język, który wygrywa dzięki posiadaniu ogromnego zestawu wbudowanych funkcji, dzięki bardziej odpowiednim wbudowanym funkcjom!) Oto, jak działa program:

((:a*)~^()~^a)
(            )   Make a snippet into a function
 (   )~^         Exponentiate the following function by the top of stack:
  :                Copy the top stack element
   a               Surround the copy in parentheses
    *              Append the copy to the original, popping the copy
          ~^     Run the resulting function, with the following argument on its stack:
        ()         Empty string
            a    Surround the result in parentheses

Potęgowanie funkcji skutecznie powoduje, że kroki funkcji powtarzają się tyle razy, więc np (:a*). Byłoby ³ (:a*:a*:a*). Jest to idiomatyczny sposób napisania pętli, która powtarza określoną liczbę razy w trybie niedociążenia. (Możesz zauważyć, że ~^opisano to na dwa różne sposoby powyżej; to dlatego, że liczby całkowite w niedociążeniu są zdefiniowane jako potęgowanie funkcji specjalizowane dla tej liczby całkowitej, więc aby wykonać potęgowanie funkcji, po prostu spróbuj wykonać liczbę całkowitą tak, jakby była funkcją .)



2

APL (NARS), 15 znaków, 30 bajtów

{⍵=0:⍬⋄∇¨¯1+⍳⍵}

test:

  f←{⍵=0:⍬⋄∇¨¯1+⍳⍵}
  o←⎕fmt
  o f 0
┌0─┐
│ 0│
└~─┘
  o f 1
┌1───┐
│┌0─┐│
││ 0││
│└~─┘2
└∊───┘
  o f 2
┌2──────────┐
│┌0─┐ ┌1───┐│
││ 0│ │┌0─┐││
│└~─┘ ││ 0│││
│     │└~─┘2│
│     └∊───┘3
└∊──────────┘
  o f 3
┌3────────────────────────┐
│┌0─┐ ┌1───┐ ┌2──────────┐│
││ 0│ │┌0─┐│ │┌0─┐ ┌1───┐││
│└~─┘ ││ 0││ ││ 0│ │┌0─┐│││
│     │└~─┘2 │└~─┘ ││ 0││││
│     └∊───┘ │     │└~─┘2││
│            │     └∊───┘3│
│            └∊──────────┘4
└∊────────────────────────┘
  o f 4
┌4────────────────────────────────────────────────────┐
│┌0─┐ ┌1───┐ ┌2──────────┐ ┌3────────────────────────┐│
││ 0│ │┌0─┐│ │┌0─┐ ┌1───┐│ │┌0─┐ ┌1───┐ ┌2──────────┐││
│└~─┘ ││ 0││ ││ 0│ │┌0─┐││ ││ 0│ │┌0─┐│ │┌0─┐ ┌1───┐│││
│     │└~─┘2 │└~─┘ ││ 0│││ │└~─┘ ││ 0││ ││ 0│ │┌0─┐││││
│     └∊───┘ │     │└~─┘2│ │     │└~─┘2 │└~─┘ ││ 0│││││
│            │     └∊───┘3 │     └∊───┘ │     │└~─┘2│││
│            └∊──────────┘ │            │     └∊───┘3││
│                          │            └∊──────────┘4│
│                          └∊────────────────────────┘5
└∊────────────────────────────────────────────────────┘

Nie wiem, czy to zostanie zaakceptowane ... Zilde jest ⍬ tutaj reprezentuje zestaw pustek {}, jeśli chcę wydrukować element Zilde lub jeden element pełen Zilde, a Zilde załączyła wszystko, co się dzieje, to nie drukuj nic ... więc dla zobaczenia Zilde należy zdefiniować jedną funkcję, którą nazywam o ( o←⎕fmt) Nie wstawiam do licznika, ponieważ element i jego struktura istnieją nawet, jeśli sys go nie wydrukuje ... Jest to możliwe, jeśli io wynosi 0

{⍵=0:⍬⋄∇¨⍳⍵}

rozwiązanie może mieć również 12 znaków ...




1

Rakieta 119 bajtów

(λ(n)(define ll(list'()))(for((i(range 1 n)))(set! ll(cons ll(for/list((j(length ll)))(list-ref ll j)))))(reverse ll))

Nie golfowany:

(define f
  (λ (n)
    (define ll (list '()))
    (for ((i (range 1 n)))
      (set! ll
            (cons ll
                  (for/list ((j (length ll)))
                    (list-ref ll j)
                    ))))
    (reverse ll)))

Testowanie (w Racket {} jest takie samo jak (), a domyślnym wyjściem jest ()):

(f 4)

'(() (()) ((()) ()) (((()) ()) (()) ()))

Aby wyraźnie zobaczyć każdą liczbę (od 0 do 3):

(for((i (f 4)))  (println (reverse i)))

'()
'(())
'(() (()))
'(() (()) ((()) ()))

1

Partia, 74 bajty

@set s={}
@for /l %%i in (1,1,%1)do @call set s={%%s%%%%s:~1%%
@echo %s%

Wykorzystuje fakt, że każda odpowiedź jest równa poprzedniej odpowiedzi wstawionej do siebie po prowadzeniu {. Pierwsze kilka wyników jest następujące:

{}

{{}}

{{{}}{}}

{{{{}}{}}{{}}{}}

{{{{{}}{}}{{}}{}}{{{}}{}}{{}}{}}

{{{{{{}}{}}{{}}{}}{{{}}{}}{{}}{}}{{{{}}{}}{{}}{}}{{{}}{}}{{}}{}}

Czy możesz zamieścić przykład pokazujący formaty wejściowe i wyjściowe?
Luis Mendo,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.