W językach w stylu Lisp lista jest zwykle definiowana w następujący sposób:
(list 1 2 3)
Na potrzeby tego wyzwania wszystkie listy będą zawierać tylko dodatnie liczby całkowite lub inne listy. Na początku pomijamy również list
słowo kluczowe, więc lista będzie wyglądać następująco:
(1 2 3)
Pierwszy element listy możemy uzyskać za pomocą car
. Na przykład:
(car (1 2 3))
==> 1
I możemy uzyskać oryginalną listę z usuniętym pierwszym elementem za pomocą cdr
:
(cdr (1 2 3))
==> (2 3)
Ważne: cdr
zawsze zwróci listę, nawet jeśli ta lista zawiera jeden element:
(cdr (1 2))
==> (2)
(car (cdr (1 2)))
==> 2
Listy mogą znajdować się również na innych listach:
(cdr (1 2 3 (4 5 6)))
==> (2 3 (4 5 6))
Napisz program, który zwraca kod, który używa car
i cdr
zwraca określoną liczbę całkowitą na liście. W kodzie, który zwraca program, możesz założyć, że lista jest przechowywana l
, docelowa liczba całkowita jest l
gdzieś i że wszystkie liczby całkowite są unikalne.
Przykłady:
Wejście: (6 1 3) 3
Wynik: (car (cdr (cdr l)))
Wejście: (4 5 (1 2 (7) 9 (10 8 14))) 8
Wynik: (car (cdr (car (cdr (cdr (cdr (cdr (car (cdr (cdr l))))))))))
Wejście: (1 12 1992) 1
Wynik: (car l)
źródło
(1 2 3) 16
wrócimy()
?(1 2 3) 16
nigdy się nie pojawi.Odpowiedzi:
CJam, 59 lat
Wypróbuj online
Wyjaśnienie:
źródło
Common Lisp, 99
Następujące 99 bajtów rozwiązanie jest wersją CL ładnej odpowiedzi Scheme .
Początkowo próbowałem użyć
position
iposition-if
, ale okazało się, że nie jest tak kompaktowy, jak bym chciał (209 bajtów):Rozszerzony
Przykład
Lista jest cytowana, ale jeśli naprawdę chcesz, mogę użyć makra. Zwrócona wartość to [1] :
Do testów generowałem postać lambda, w której
l
była zmienna:Wywołanie tego z oryginalną listą zwraca 14.
[1] też
(caddar (cddddr (caddr l)))
byłoby miłoźródło
Siatkówka ,
170142125115114878483757370696867 bajtówTak,
mniej niż 50% zponad 100 bajtów mojej pierwszej próby. :)Aby uruchomić kod z jednego pliku, użyj
-s
flagi.Nadal nie jestem przekonany, że jest to optymalne ... W najbliższych dniach nie będę miał dużo czasu, w końcu dodam wyjaśnienie.
źródło
Pyth, 62 bajty
Wypróbuj online: Demonstracja lub pakiet testowy
Wyjaśnienie:
Pierwszy bit
JvXz"() ,][")
zastępuje znaki"() "
przez znaki"[],"
w ciągu wejściowym, co kończy się reprezentacją listy w stylu Pythona. Oceniam i przechowujęJ
.Następnie zmniejszam ciąg za
G = "l"
pomocąu...\l
....
Wielokrotnie stosuję funkcję wewnętrznąG
, dopóki wartośćG
nie zmieni się, a następnie drukujęG
.Funkcja wewnętrzna wykonuje następujące czynności: Jeśli
J
jest już równa liczbie wejściowej, to nie modyfikujG
(?qJQG
). W przeciwnym razie spłaszczę listęJ[:1]
i sprawdzę, czy numer wejściowy znajduje się na tej liście, i zapiszę ją w zmiennejK
(K}Quu+GHNY<J1)
). Zauważ, że Pyth nie ma spłaszczonego operatora, więc zajmuje to sporo bajtów. JeśliK
to prawda, aktualizuję J za pomocąJ[0]
, w przeciwnym razie za pomocąJ[1:]
(=J?KhJtJ
). I wtedy wymienićG
z"(cdr G)"
i zastąpić , jeśli jest prawdziwe ( ).d
a
K
++XWK"(cdr "\d\aG\)
źródło
Schemat (R5RS), 102 bajty
źródło
PHP - 177 bajtów
Dodałem kilka nowych linii dla czytelności:
Oto wersja bez golfa:
źródło
Haskell,
190188 bajtówl "(4 5 (1 2 (7) 9 (10 8 14)))" 8
ocenia na
"(car (cdr (car (cdr (cdr (cdr (cdr (car (cdr (cdr l))))))))))"
źródło
(
ic
funkcjęc
w ciąg:c(h:s)="(c"++h:...
h
byciem Char!Common Lisp,
168155 bajtówJakaś głupia rzecz rekurencyjna, którą prawdopodobnie można by trochę skondensować:
Dość drukowane:
źródło