Wszyscy powinniście już znać sekwencję Conwaya (czyli sekwencję „look-and-say”) :
1
11
21
1211
111221
312211
etc
Możesz także zacząć od dowolnej liczby jako punktu początkowego. Niech f(s)
będzie kolejnym elementem sekwencji. Teraz dla każdego, co s
możemy znaleźć f(s)
. Odwrotna sytuacja nie jest tak trywialna: nie jest y
możliwe znalezienie s
takiego poprzednika f(s) = y
. Np. y = 1
Nie możemy znaleźć poprzednika. Ale jeśli y
ma parzystą długość, możesz podzielić ją na pary cyfr, które opisują każdą część poprzednika:
513211 divides in 51,32,11
so: 51 comes from 11111
32 comes from 222
11 comes from 1
put together: 111112221
W ten sposób możemy zdefiniować unikalnego poprzednika dla każdej y
równej długości.
Uwaga : Tak s
zdefiniowany „poprzednik” zasadniczo NIE spełnia wymagań f(s) = y
.
Cel
Napisz fragment funkcji / programu, który przyjmuje ciąg cyfr jako dane wejściowe
- oblicza następny element sekwencji Conwaya, jeśli długość ciągu wejściowego wynosi nieparzysta
- oblicza poprzednika ciągu wejściowego, jak zdefiniowano powyżej, jeśli długość ciągu wejściowego jest równa .
Najkrótszy kod w bajtach wygrywa.
Ostatnie pytania oparte na sekwencjach typu look-and-say:
513111
dzieli51
,32
i11
?11111111111111
? Zgodnie z twoją specyfikacją byłoby1111111
. Powinieneś zmodyfikować specyfikację, aby zdefiniować rozsądną odpowiedź na to pytanie.11111111111111
po prostu nie ma poprzednika. To nielegalny wkład.Odpowiedzi:
CJam,
4645444342 bajtówSprawdź to tutaj. Pobiera numer na STDIN i wypisuje wynik na STDOUT.
źródło
si
->~
= 45Rubin,
125 120 119101 bajtówCiąg wejściowy pobrany za pomocą funkcji
f
:Rozszerzony o notatki:
źródło
Prolog - 170 bajtów
Ten wycinek określa funkcję
(-)/2
. Możesz to wywołać jakWydaje się, że w tej sekwencji występuje tylko jedna długość z nieparzystą parzystością: początkowa
[1]
.Czytelny:
źródło
Python: 139 znaków
pojedynczy przypadek testowy
źródło
s)] if
dos)]if
.2 else
Haskell,
134 128115Jeśli musi to być od standardowego / standardowego, dodaj
main=interact l
do150 144131 wszystkich znaków. Funkcja jest wywoływanal
.źródło
l "11"
pracy dostaję wyjątek zl "111"
lubl "1111111111111"
Perl - 98 bajtów
Rozmiar wszystkich tych instrukcji sterujących mnie wkurza, ale jestem całkiem zadowolony z tego, jak działały wyrażenia regularne.
Nieskompresowane:
źródło
Erlang, 205
Główną funkcją jest f, przyjmowanie danych wejściowych jako ciągu Erlanga i zwracanie danych wyjściowych również jako ciągu.
Funkcja może zostać zmniejszona o 15 bajtów (190), porzucając wymóg dotyczący więcej niż 9 znaków identycznych.
f
wywołujeg
rekurencyjne obliczenia poprzednika, a jeśli liczba znaków jest nieparzysta (stwierdzona w momencie zakończenia obliczeń), wywołuje funkcję,i
która w połączeniu zh
oblicza następny element.źródło
Haskell, 105
Myślę, że to miłe, że nie używa żadnych funkcji pomocniczych :-).
źródło
|x:y:z<-r
- Nie wiedziałem, że możesz to zrobić. To jest takie fajne!APL (45)
Tak, to poprawna definicja funkcji, nawet z
∊
zewnętrzną stroną.źródło
Java 7, wynik =
252235 bajtówTak, to znowu java; najgorszy język golfa na świecie. To podejście wykorzystuje ciągi znaków. Arbitralnie duże liczby całkowite są obsługiwane w Javie, ale zajęłyby znacznie więcej miejsca na kodowanie.
Zadzwoń z
f(intputString)
. Zwraca odpowiedni ciąg.Gra w golfa:
Golfowy Rozszerzony z kodem struktury:
Częściowo gra w golfa:
Całkowicie rozbudowany:
Aby uruchomić, najpierw skompiluj drugi wpis za pomocą:
javac LookAndSayExpandedGolfed.java
Następnie uruchom z:
java LookAndSayExpandedGolfed
Edycja: Naprawiono błąd.
źródło
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 4 at java.lang.String.charAt(String.java:658)
--1
powinno być--i
?513211
->11111
.JavaScript (w przeglądarce, ES5, IE8 +), 152
Może zostać skrócony o 4 znaki, jeśli pominiesz var, lub kilka innych znaków z innymi pośrednimi niepodzielonymi globalsami, ale udawajmy, że nie jesteśmy złymi programistami przez minutę.
Przejście na funkcję krótkiej składni ES6 z argumentem i wartością zwracaną zamiast monitu, alert dla IO może zaoszczędzić więcej.
JSFiddle tutaj: http://jsfiddle.net/86L1w6Lk/
źródło
var
... wszyscy jesteśmy tutaj „złymi programistami”. ;)Python 3 - 159 bajtów
źródło
Kobra - 217
(186, jeśli mogę założyć, że
use
oświadczenieSystem.Text.RegularExpressions
istnieje w innym miejscu)źródło
JavaScript (ES6) 85
Używając wyrażenia regularnego zamień na function. Różne wyrażenia regularne i różne funkcje w zależności od długości wejściowej są parzyste lub nieparzyste.
źródło