Dowolną dodatnią liczbę całkowitą można uzyskać, rozpoczynając od 1 i stosując sekwencję operacji, z których każda albo „pomnóż przez 3”, albo „podziel przez 2, odrzucając resztę” .
Przykłady (pisanie f dla * 3 ig dla / 2):
4 = 1 *3 *3 /2 = 1 ffg
6 = 1 ffggf = 1 fffgg
21 = 1 fffgfgfgggf
Napisz program o następującym działaniu:
Dane wejściowe : dowolna dodatnia liczba całkowita, poprzez stdin lub na stałe. (W przypadku zakodowania na stałe, numer wejściowy zostanie wykluczony z długości programu.)
Wyjście : ciąg znaków f i g taki, że <input> = 1 <string>
(jak w przykładach). Taki ciąg w odwrotnej kolejności jest również dopuszczalny. NB: Dane wyjściowe zawierają tylko f i g lub są puste.
Zwycięzcą jest pozycja z najmniejszą liczbą bajtów programu plus wyjście, gdy 41 to wejście.
źródło
x mod 3
przypadki: jeślix=3y
skonstruuj y, a następnie zastosujf
; jeślix=3y+1
skonstruuj2y+1
i zastosuj,f
tog
; jeślix=3y+2
to się komplikuje, ale zasadniczo jest rekurencyjne.Odpowiedzi:
GolfScript, wynik 64 (43-2 + 23)
(41 jest zakodowane, więc -2 znaki dla wyniku). Dane wyjściowe to
który ma 23 znaki (bez nowej linii). Dzięki konstrukcji kod gwarantuje, że zawsze zwraca (jedną z) najkrótszych reprezentacji.
źródło
"1 "
nie należy go włączać do wyniku.Brudzimy się, przyjaciele!
JAWA
210 207199 znakównie golfa:
wyjście: w zależności od wiary starych bogów, najkrótszy miałem 30. Zauważ, że wynik musi być odczytany z prawej strony.
234
108
edycja 45
punkty:
318199 + 30 = 229edycja1 (2 * i + 1)% 3 == 0 -> (2 * i)% 3 == 1
Nota Bene, jeśli używasz Java 6, a nie Java 7 podczas gry w golfa, możesz użyć
Struktura 39 znaków zamiast standardowej struktury o długości 53 znaków.
źródło
(2*i+1)%3==0
jest równoważny zi%3==1
if(X){A}else{if(Y){B}else{C}}
jest dłuższy niżif(X){A}else if(Y){B}else{C}
. Możesz także zastąpić swoje==
warunki krótszymi<
.Python, wynik 124 (90-2 + 36)
90 znaków kodu (nowe wiersze jako 1 każdy) - 2 dla zakodowanych cyfr wejściowych + 36 znaków wyjściowych
Wynik:
źródło
m=f=0
, możesz wykonać zewnętrzną pętlęwhile(n!=x)*(m!=x)
i usunąć przerwy. Daje to 95 znaków kodu.n
przez3**f
.print'f'*f+'g'*g
, co dałoby wynik 90-2 + 36 = 124.Python, wynik 121 (87-2 + 36)
źródło
l,n,f=len(t),1,0
, i usunięto'1',
z instrukcji print, Twój wynik będzie 87-2 + 36 = 121.1,
.l,n,f=len(t),1,0
daje taką samą liczbę znaków, prawda? (Dla każdej zmiennej an=
i nowa linia są zastępowane dwoma,
s.)Perl, wynik 89 (63-2 + 28)
Przypuszczenie: jeśli naiwne podejście opisane w moim oryginalnym rozwiązaniu poniżej osiągnie cykl, cykl ten wyniesie [21, 7, 15, 5, 10, 21, ...] . Ponieważ nie ma kontrprzykładów dla 1 ≤ n ≤ 10 6 , wydaje się to prawdopodobne. Aby to udowodnić, wystarczyłoby wykazanie, że jest to jedyny cykl, który może istnieć, co mogę, ale nie muszę, zrobić w późniejszym czasie.
Powyższe rozwiązanie pozwala uniknąć cyklu natychmiast, zamiast zgadywania (błędnie) i unikania go za drugim razem.
Wyjście (28 bajtów):
Perl, wynik 100 (69-2 + 33)
Korzystanie z metody zgadywania i sprawdzania. Łańcuch jest konstruowany przy użyciu operacji odwrotnych (konwersja wartości na 1 zamiast na odwrót), a łańcuch zostaje odpowiednio dublowany, co jest dozwolone w specyfikacji problemu.
Za każdym razem, gdy napotkamy nie wielokrotność trzech, zostanie ona pomnożona przez dwa, dodając jeden, jeśli wynik będzie wielokrotnością trzech. Kiedy napotkamy wielokrotność trzech, zostanie ona podzielona przez trzy ... chyba że wcześniej ta wartość została napotkana, co wskazuje na cykl, a więc zgadnij i sprawdź.
Wyjście (33 bajty):
źródło
J, wynik 103 (82–2 + 23)
* Uwaga: Nazwałem swoje czasowniki
f
ig
, nie należy mylić ich z ciągami wyjściowymif
ig
.Mocno zakodowane:
Funkcje ogólne:
Zrezygnowałem z operowania na blokach liczb binarnych, co było najważniejszą zmianą w zakresie kompaktowania
g
. Zmieniłem nazwy zmiennych i usunąłem trochę białych znaków, ale wszystko funkcjonalnie jest takie samo. (Zastosowanie:g 41
)J, wynik 197 (174 + 23)
Wynik:
ffffffffggggggggfgffggg
f
konwertuje listę wartości logicznych na liczbę, używając 0 jako*3
i 1 jako/2
(ifloor
).#:i.2^i
tworzy tablicę rangi 2 zawierającą wszystkie tablice boolowskie rangi 1 o długościi
.źródło