Z Wikipedii Zestaw teoretycznej definicji liczb naturalnych
Zbiór N liczb naturalnych jest zdefiniowany jako najmniejszy zbiór zawierający 0 i zamknięty pod funkcją następczą S zdefiniowaną przez S (n) = n ∪ {n}.
Pierwsze kilka liczb zdefiniowanych w ten sposób to 0 = {}, 1 = {0} = {{}}, 2 = {0,1} = {{}, {{}}}, 3 = {0,1,2 } = {{}, {{}}, {{}, {{}}}}.
Korzystając z tej definicji liczb naturalnych, policz długość łańcucha.
Wprowadź ciąg znaków od a-zA-Z o dowolnej długości
Wyprowadza długość łańcucha w ustawionej notacji bez separatorów
Przykłady
Wpisz pusty ciąg
Wyjście {}
Wprowadź a
Dane wyjściowe {{}}
Wpisz aaaa
Wyjście {{} {{}} {{} {{}}} {{} {{}} {{} {{}}}}}
Dla czytelności wyjście dla „aaaa” z separatorami wynosi
{
{}
{{}}
{{} {{}} }
{{} {{}} {{} {{} } } }
}
Warunki
- W kodzie nie ma cyfr od 0 do 9;
- Bez użycia konwersji kodu znaków do generowania liczb;
- Bez użycia + - * / do obliczeń arytmetycznych, w tym zwiększania i zmniejszania;
- Żadnych operacji matematycznych innych niż logika logiczna;
- Łańcuch wejściowy nie liczy się przy określaniu długości bajtu;
Zwycięzca Najkrótsza długość kodu w bajtach.
Ponieważ jest to moje pierwsze pytanie, mam nadzieję, że wyjaśniłem je wystarczająco rygorystycznie. Przyjmujemy przyjazną radę.
źródło
f(n-1)
?Odpowiedzi:
GolfScript (
1817 bajtów)Pobiera dane wejściowe na stosie (więc jeśli jest uruchamiany jako program, przez stdin). Pozostawia wyjście jako dwa ciągi na stosie (więc jeśli uruchomione jako program, poprawne wyjście zostanie wysłane do standardowego wyjścia).
Aby zostawić pojedynczy ciąg na stosie, dołącz
+
do konkat lub użyj alternatywySekcja
Alternatywny:
Wpływ ograniczeń
Gdyby dopuszczono zmniejszenie, pozwoliłoby to na rozwiązanie 15-bajtowe
źródło
Funkcja Haskella,
3534 znakiProgram Haskell z zakodowanym wejściem,
48 lub 4947 lub 48 znaków(47 znaków, jeśli nie masz nic przeciwko dodatkowym cudzysłowom wokół wyjścia; jeśli tak, użyj
putStr
zamiast zamiastprint
48 znaków)Program Haskell,
5150 znakówźródło
Python 3-64
Jeśli wstawianie jest dozwolone:
Python 2 - 54
źródło
o[-1]
zamiasto.pop()
o=[]
, który staje sięo=['{}']
po jednym kroku, i wydłuż wejściowy o jeden, zastępując go'_'+input()
, zmniejszając przestrzeń poin
.JavaScript 70 (znaki)
To był mój wysiłek przed postawieniem pytania. Zakładam, że ktoś z większą wiedzą na temat Javascript niż ja prawdopodobnie jest w stanie go pokonać.
Dziękuję Janowi Dvorakowi i Peterowi Taylorowi za dalsze obniżki
teraz 62
a teraz 61
Objaśnienie kodu oryginalnego
ustaw s na pusty
ciąg wejściowy na c i podzielony na tablicę
podczas gdy możliwe jest pop () znak z c to zrobić i zresetować s = s {s} jako następca
prąd wyjściowy s, ale musi być otoczony ustawionymi nawiasami.
źródło
while
(ratuje jedną postać).s='{'
i porzuć obie'{'+
. (To wtedy zachowuje się jak moje rozwiązanie GS). Istnieje jeszcze 1-znakowa oszczędność poprzez użyciefor
zamiastwhile
i wciągnięcie jednej z dwóch inicjalizacji do inicjalizacji pętli.for(a;b;c){d}
jest bezpośrednio równoważne za;while(b){d;c}
większością języków, które mają oba. Więc chociażfor(;b;)
jest identycznywhile(b)
pod względem efektu i liczby znaków,for(a;b;)
oszczędza jeden znaka;while(b)
i jest identyczny w działaniu.J -
2220 znakówJak można to uzyskać:
Alternatywnie można to napisać
'{','{'&(,,~)&'}'@#
, co oznacza to samo.Stosowanie:
źródło
Haskell - 35 znaków
Na rozwiązanie ma wpływ Jan Dvorak, ale bez odwrócenia kolejności.
źródło
Scala, 64 znaki
Zwróć uwagę na podwójną rolę, jaką nawiasy klamrowe i
s
grają w tym kodzie.EDYCJA: usunięto cyfrę
źródło
Python 3 (44)
Na każdym kroku
s
jest ciąg reprezentujący zestaw z ostatecznym}
usuniętym. Tworzymy zbiór reprezentującyn+1
ze zbioru reprezentującegon
za pomocą relacji f (n + 1) = f (n) ∪ {f (n)}. Aby zaimplementować połączenie z ciągami, dołączamy ciąg dla {f (n)}, który jest dokładnie taki,s
ale ze}
zwróconym końcowym , i zaniedbujemy uwzględnienie końcowego}
w wyniku. Na koniec dodajemy ostatnią'}'
wersję przed drukowaniem.Jeśli mogę na stałe zakodować ciąg, liczba znaków zmniejsza się do 35 znaków, przełączając się na Python 2, aby zapisać nawiasy w pliku
print
.Może być sposób na zaoszczędzenie miejsca po
print
zrobieniu czegośprint'{'+s
z odwróceniems
, ale to psuje się z+=
dopisywaniem po prawej stronie.źródło
gs2, 12 bajtów
mnemonika:
źródło
Mathematica, 115 znaków
Pełny kod, jak pokazano, ma 121 znaków, ale 6 z nich jest użytych jako ciąg wejściowy (
"test"
), który zgodnie z regułami się nie liczy.Bez wymogu braku ograniczników długość kodu można by dodatkowo zmniejszyć o 24 znaki; bez wyraźnej konwersji na ciąg znaków można usunąć kolejne 9 znaków.
źródło
Ruby, 27 lat, rodzaj oszustwa
Wątpliwe rzeczy:
[[], [[]], [[], [[]]], [[], [[]], [[], [[]]]]]
źródło
inspect
macierz ręcznie itr
wynik.Pure Bash, 54
Wynik:
źródło
Julia 43
Konstrukt {z ...} rozwija ciąg z do tablicy. Zwiń pętle na wszystkich elementach tablicy, ignorując zawartość i zamiast tego budując z pustego łańcucha. Funkcja składania jest dostępna w Julii 0.30.
Przykładowe dane wyjściowe
źródło
Haskell, 31 bajtów
źródło
Mathematica,
455748 bajtówRozwiązanie 36 bajtów:
Wykorzystuje jednak pewne obliczenia arytmetyczne.
źródło
Delphi XE3 (264)
Ok, nawet się do siebie nie
zbliżam, ale fajnie było to robić :) Prawdopodobnie przesadzając. Sprawdzanie, czy jest lepszy sposób, aby to zrobić.
Grał w golfa
Nie golfił
Wyniki testów
Testowane ciągi o długości 0..10
źródło
Perl 5: 33 znaków
Nie jest do końca jasne, które postacie powinienem liczyć jako część rozwiązania. Prawdopodobnie nieecho ... |
część, ponieważ służy ona tylko do wprowadzenia linii do standardowego wejścia. Prawdopodobnie nie jest to nazwa pliku binarnego Perla, ponieważ możesz zmienić nazwę tego, co chcesz.Policzyłem więc przełączniki wiersza poleceń przekazane do perla, znaki cudzysłowu owinięte wokół kodu Perla i sam kod Perla.Również powiązane .
źródło
pl
jako standard, ale dostajesz-e
i cytaty wokół kodu za darmo. RefPerl 6: 37 znaków
lub ze STDIN:
{"\{@_.join()\}"}...*
tworzy leniwą listę ustawionych form liczb naturalnych i po prostu wybieramy tę, której potrzebujemyget.chars
.Leniwa lista może być łatwiej napisana:
Który brzmi dość podobnie do definicji.
źródło
Dart: 85 znaków
(z dodatkową nową linią dla czytelności).
Wymóg nieużywania „0” naprawdę gryzie, w przeciwnym razie
.first
byłby[0]
i(..).isNegative
byłby..<0
.źródło
Pyth, 13 bajtów
To jest golfowy odpowiednik Pyth'a dla odpowiedzi Python @ xnor. Pamiętaj, że Pyth jest nowszy niż to pytanie, więc ta odpowiedź nie kwalifikuje się do wygrania tego wyzwania.
Demonstracja.
źródło
u+G]GlQY
JavaScript,
171149147142 bajtów(Prawdopodobnie później będzie grał w golfa)
źródło