tło
Wiele ezoterycznych języków programowania nie ma liczb wbudowanych w literały, więc musisz je obliczyć w czasie wykonywania; w wielu przypadkach reprezentacja liczb może być dość interesująca. Mieliśmy już wyzwanie dotyczące reprezentowania liczb w przypadku niedociążenia. Wyzwanie polega na reprezentowaniu liczb w Modular SNUSP . (Pamiętaj, że nie musisz uczyć się SNUSP, aby ukończyć to wyzwanie - wszystkie potrzebne informacje znajdują się w specyfikacji - ale tło może być dla ciebie interesujące).
Zadanie
Dla celów tego wyzwania, szereg Modular SNUSP to ciąg utworzony z bohaterów @
, +
oraz =
z tym, że ostatni znak to #
, że charakter i przedostatni musi być +
albo =
(nie może być @
). Na przykład, ważne numery zawierać @+#
, ==#
oraz @@+@=#
; Przykłady obejmują liczby nieważnych +=
, @@#
i +?+#
.
Wartość modułowego numeru SNUSP oblicza się rekurencyjnie w następujący sposób:
#
ma wartość 0 (to jest przypadek podstawowy).- Jeśli liczba ma postać
=x
, dla dowolnego łańcuchax
jej wartość jest równa wartościx
. - Jeśli liczba ma postać
+x
, dla dowolnego łańcuchax
jej wartość jest równa wartościx
plus 1. - Jeśli liczba ma postać
@cx
, dla dowolnego pojedynczego znakuc
i dowolnego łańcuchax
, jego wartość jest równa wartościx
plus wartośćcx
.
Aby sprostać temu wyzwaniu, musisz napisać program, który przyjmuje nieujemną liczbę całkowitą jako dane wejściowe i generuje ciąg, który jest najkrótszym możliwym Modularnym numerem SNUSP o wartości równej wartości wejściowej.
Wyjaśnienia
- Jest całkiem możliwe, że będzie więcej niż jeden ciąg o tej samej wartości, a w szczególności dla niektórych liczb całkowitych będzie remis dla najkrótszego Modularnego numeru SNUSP o tej wartości. W takim przypadku możesz wypisać dowolną liczbę związaną z remisem.
- Nie ma ograniczeń w algorytmie używanym do znalezienia liczby; na przykład brutalne wymuszanie ciągów i ich ocenianie jest taktyką prawną, ale robi coś mądrzejszego, aby zmniejszyć przestrzeń wyszukiwania.
- Jak zwykle w PPCG, twoje zgłoszenie może być pełnym programem lub funkcją (wybierz ten, który jest bardziej zwięzły w twoim języku).
- Nie jest to problem z obsługą formatów wejściowych i wyjściowych, więc możesz użyć wszelkich rozsądnych środków, aby wprowadzić nieujemną liczbę całkowitą i wyprowadzić ciąg. Istnieje pełny przewodnik na temat meta , ale najczęściej stosowanymi metodami prawnymi są argumenty / powroty funkcji, argumenty wiersza poleceń oraz standardowe wejście / standardowe wyjście.
Przypadki testowe
Oto najkrótsze przedstawienia pierwszych kilku liczb:
- 0 :
#
- 1 :
+#
- 2) :
++#
- 3 :
+++#
lub@++#
- 4 :
++++#
lub+@++#
lub@=++#
- 5 :
@+++#
lub@@++#
- 6 :
+@+++#
lub+@@++#
lub@=+++#
lub@=@++#
lub@@=++#
- 7 :
@++++#
lub@+@++#
- 8 :
@@+++#
lub@@@++#
- 9 :
+@@+++#
lub+@@@++#
lub@+++++#
lub@++@++#
lub@+@=++#
lub@@=+++#
lub@@=@++#
- 10 :
@=@+++#
lub@=@@++#
lub@@@=++#
( jest to dość ważny przypadek testowy do sprawdzenia , ponieważ wszystkie możliwe odpowiedzi obejmują=
) - 11 :
@+@+++#
lub@+@@++#
lub@@++++#
lub@@+@++#
- 12 :
+@+@+++#
lub+@+@@++#
lub+@@++++#
lub+@@+@++#
lub@=+@+++#
lub@=+@@++#
lub@=@=+++#
lub@=@=@++#
lub@=@@=++#
lub@@=++++#
lub@@=+@++#
lub@@=@=++#
- 13 :
@@@+++#
lub@@@@++#
- 14 :
+@@@+++#
lub+@@@@++#
lub@=@++++#
lub@=@+@++#
lub@@+++++#
lub@@++@++#
lub@@+@=++#
- 15 :
@+@++++#
lub@+@+@++#
lub@@=@+++#
lub@@=@@++#
lub@@@=+++#
lub@@@=@++#
W większej testu na wyjściu z wejściem 40 powinny być @@@=@@+++#
, @@@=@@@++#
, @@@@=@+++#
lub @@@@=@@++#
.
Warunek zwycięstwa
Jako wyzwanie dla golfa , zwycięzca jest najkrótszym wejściem, mierzonym w bajtach.
=
optymalnie wystąpi tylko jako@=
, prawda?Odpowiedzi:
Oracle SQL 11.2,
341262 bajtówStara wersja
: 1 liczba do reprezentowania w modułowym SNUSP
Bez golfa:
Najpierw utwórz widok z 3 liniami, po jednym dla każdego symbolu używanego do przedstawienia liczb, minus #, który jest używany tylko na końcu ciągu:
Następnie widok rekurencyjny n generuje każdy możliwy ciąg z tymi 3 symbolami, łączy je do # i ocenia je.
Parametry to:
s: Modularna reprezentacja SNUSP ocenianej liczby
v: wartość dziesiętna s obliczona na podstawie poprzedniej iteracji
p: v obliczona na podstawie iteracji i-2
c: następny symbol do połączenia z s
i: tylko długość s, tylko potrzebne do pozbycia się dwóch LENGTH () do gry w golfa
Jeśli ostatnim symbolem jest +, to dodaj 1
Jeśli to @, dodaj wartość iteracji i-2 W
przeciwnym razie symbolem będzie # lub =. v jest inicjowane z 0 w części początkowej widoku rekurencyjnego, więc nowe v jest równe poprzedniemu v w obu przypadkach.
Każdy ciąg znaków z 3 symbolami jest obliczany, ta część zapewnia, że żądanie nie zostanie uruchomione aż do wielkiego kryzysu.
Ponieważ nie ma reguły dotyczącej konstrukcji ciągów, z pewnością powstaną duplikaty. Będąc w widoku rekurencyjnym Oracle interpretuje te duplikaty jako cykle i rzuca błąd, jeśli sprawa nie jest wyraźnie załatwiona.
Zwraca pierwszą reprezentację modułową SNUSP, która ocenia na liczbę dziesiętną wprowadzoną jako parametr: 1
W moich testach ta pierwsza linia jest zawsze jedną z najkrótszych reprezentacji.
W przypadku gdyby twoja baza danych nie działała w ten sam sposób, ostatnia klauzula powinna zostać zastąpiona przez
źródło
JavaScript (ES6), 100 bajtów
Prosty algorytm wyszukiwania brute-force-first.
źródło
t<n
na cośt-n
może zadziałać ...Pyth, 41 bajtów
Zestaw testowy
Jak to działa:
Istnieją dwie części. Funkcja rekurencyjna, która oblicza wartość wyrażenia SNUSP bez trailing
#
, oraz procedura brutalnej siły.Ewaluacja:
Brutalna siła:
źródło
CJam, 58
Brutalna siła, trochę inspirowana odpowiedzią Neila. Wypróbuj online
Wydajna wersja, 107
Wypróbuj online
Wykorzystuje to programowanie dynamiczne.
źródło
Haskell ,
8986 bajtówEDYTOWAĆ:
Kolejne brutalne rozwiązanie, które zakończyło się dużą inspiracją z odpowiedzi Neila. (Chociaż działało to bardziej jak Pyth Isaacga przed wprowadzeniem gry w golfa
l
.)Wypróbuj online!
f
jest główną funkcją, która przyjmuje liczbę całkowitą i zwraca ciąg znaków.l
jest nieskończoną listą krotek(a,b,s)
,s
najpierw najkrótszymi reprezentacjami , wraz z ich wartościąa
i wartościąb
reprezentacji z usuniętym pierwszym znakiem. (jak zauważyli / zauważyli inni, nieszkodliwe jest traktowanie tego ostatniego jako 0#
).l
inne niż pierwszy są generowane rekurencyjnie ze zrozumieniem listy.d
to znak, który należy poprzedzić, abys
wygenerować nową reprezentację na liście, a „c” oznacza odpowiedni przyrost doa
.źródło