Motywacja : Czasami musisz wiedzieć, gdzie jesteś w ciągu. Chcesz być w stanie spojrzeć na dowolną część łańcucha i dokładnie wiedzieć, gdzie jesteś, o ile to możliwe.
Wyzwanie : napisz program, który wyświetli ciąg taśmy mierniczej o określonej długości. Centymetrem ciąg siebie opisuje jego długość, tak daleko jak najczęściej wzdłuż własną długość.
Zasady :
- Twój program musi przyjąć jeden dodatni parametr liczby całkowitej, dla całkowitej długości ciągu taśmy mierniczej
- Dla każdego ciągłego ciągu cyfr na wyjściu, cyfry te muszą dokładnie podawać dotychczasową długość wyjścia - włącznie !
- Długości są mierzone od początku ciągu do końca każdej liczby
- Ciąg powinien zawierać jak najwięcej liczb długości
- Unikaj dwuznaczności. Separatory / ograniczniki mogą być użyte, aby uniknąć zestawienia liczb, tzn.
12
Mówi dwanaście, a nie jeden, dwa. - Ciąg musi zawsze dokładnie podawać swoją całkowitą długość na końcu, bez końcowych separatorów
- Aby zachować dokładne długości, możesz potrzebować wielu separatorów, np. Oto przykładowy ciąg taśmy mierniczej o długości 4:
1--4
Przykłady nieokreślone / wyczerpujące:
- taśma miernicza o długości 1:
1
- taśma miernicza o długości 2:
-2
- taśma miernicza o długości 3:
1-3
- łańcuch miara długości 4:
1--4
lub-2-4
(oba zgłaszają długości tak często, jak to możliwe, tj. dwa razy i kończą się prawidłową długością całkowitą) - taśma miernicza o długości 10:
1-3-5-7-10
- łańcuch taśmy mierniczej o długości 11:
1-3-5-7--11
lub1-3-5--8-11
lub1-3--6-8-11
lub1--4-6-8-11
lub-2-4-6-8-11
(wszystkie mają możliwie jak najwięcej liczb długości i kończą się całkowitą długością łańcucha)
-
i musisz mieć tyle znaków długości, ile możesz w ciągu?0
.Odpowiedzi:
Python,
50484746 bajtówWyjaśnienie
Dość proste rekurencyjne rozwiązanie lambda
Nasze podstawowe przypadki to 1 i 0, które są objęte, w
"1"*x
przeciwnym razie otrzymujemy ciąg-x
z`-x`
i poprzedzimy wynik wywołania funkcji nalen(`-x`)
less.źródło
-x
?Mathematica,
6757 bajtówPodziękowania dla Martina Endera za usunięcie 10 bajtów!
Nienazwana funkcja przyjmująca nieujemną liczbę całkowitą i zwracająca ciąg znaków. Prawie oczywisty algorytm rekurencyjny: upewnij się, że łańcuch kończy się liczbą wejściową poprzedzoną znakiem a
"-"
, a następnie ponownie wywołaj funkcję za pomocą#0
.Ale implementacja algorytmu daje golfową frajdę.
""["1"][[#]]
oznacza#
th argument wyrażenia""["1"]
: 0 argument jest głową,""
a pierwszy argument jest widoczny"1"
, co zapewnia podstawowe przypadki rekurencji. Jeśli#
przekracza 1,""["1"][[#]]
generuje komunikat o błędzie i pozostaje jako funkcja nieoceniona. Ale wtedy/._@__:>
jest reguła, która przyjmuje dowolną nieocenioną funkcję i przekształca ją w wyrażenie, które będzie następne, które jest rekurencyjnym wywołaniem pierwotnej funkcji.Oryginalne zgłoszenie:
źródło
""["1"][[#]]/._@__:>#0[#-1-IntegerLength@#]<>ToString@-#&
oszczędza jeden bajt, unikającIf
i kilku bajtów, unikającIntegerString
i"-"<>
._@__
to zła magiaJavaScript (ES6), 49 bajtów
źródło
f
Pyth, 23 bajty
Rażąco ukradł rekurencyjne rozwiązanie z odpowiedzi czarodzieja pszenicy . Poza tym uważam, że nie jest to właściwie gra w golfa.
Wypróbuj tutaj!
źródło
Perl 6 , 43 bajtów
Wyjaśnienie:
Na przykład dla danych wejściowych 10 generuje sekwencję
(-10, -7, -5, -3, -1)
, a następnie ciąg-1-3-5-7-10
, a następnie ciąg końcowy1-3-5-7-10
.Wypróbuj online .
źródło