Wise to prosty język bitowy, który zaprojektowałem jakiś czas temu. Opiera się na bitowych operacjach Pythona . Ma kilka operacji, większość z nich jest taka sama lub bardzo podobna do równoważnego symbolu w Pythonie.
:
Zduplikuj górę stosu?
Obróć górę stosu na dół!
Obróć spód stosu do góry[
]
zapętlić, gdy górna część stosu nie jest równa zero~
nie szczyt stosu (-(n+1)
)-
zaneguj górę stosu (-n
)>
przesuń bit raz na górę stosu raz w prawo (n//2
)<
przesuń bit raz na górę stosu raz w lewo (n*2
)^
x lub dwa górne elementy stosu ( tak samo jak Python )|
lub dwa górne elementy stosu ( tak samo jak Python )&
i dwa górne elementy stosu ( tak samo jak Python )
Wykonywanie liczb całkowitych w Wise jest dość proste, możesz zrobić zero ::^
i zwiększać je, dzięki ~-
czemu możesz zrobić zero i zwiększać go kilka razy. Jeśli jednak usuniemy, -
rzeczy staną się nieco bardziej interesujące.
Nadal możemy wykonać każdą liczbę przy użyciu pozostałych operacji. Na przykład tutaj jest 3
~<<~
Działa to, ponieważ ~
zamienia zero, nieskończony ciąg 0
bitów, na jeden ujemny, nieskończony ciąg 1
bitów, każdy <
dołącza się 0
nieco do końca, kiedy skończymy, robimy, ~
co zamienia każdy z nich na ciąg 0
s, po którym następuje 1
s lub, jak większość ludzi to nazywa 3.
Zadanie
Napisz program, który po otrzymaniu dodatniej liczby całkowitej wyświetli Mądry program, który utworzy liczbę n
bez żadnego -
źródła w swoim źródle (źródło wyjścia, którego możesz użyć -
we własnym źródle). Możesz założyć, że na górze stosu znajduje się już zero.
Jest to kod-golf nie meta-golf więc należy dążyć do zminimalizowania generowania kodu źródłowego nie koniecznie wyjście.
Przykładowe dane wyjściowe
Ta lista nie jest wyczerpująca, są to po prostu możliwe wyniki
1 -> ~<~
2 -> ~<~<
3 -> ~<<~
4 -> ~<~<<
5 -> ~<~:<<|
6 -> ~<<~<
7 -> ~<<<~
8 -> ~<~<<<
9 -> ~<~:<<<|
10 -> ~<~:<<|<
11 -> ~<<~:><<<|
12 -> ~<<~<<
13 -> ~<<~:<<<|>
14 -> ~<<<~<
15 -> ~<<<<~
16 -> ~<~<<<<
źródło
positive integers
:
zastosowany na pustym stosie wypycha a0
. Myślę, że należy to sprecyzować, ponieważ nie jest oczywiste, że powielanie z pustego stosu powinno dać0
Odpowiedzi:
Japt , 10 bajtów
Wypróbuj online!
Podstawowy pomysł: weź binarną reprezentację liczby i mapuj
0
do<
i1
do~<~
. Wyjścia dla 1-10:źródło
~~
JavaScript (ES6),
3433 bajtyDziała dla dowolnej 32-bitowej liczby całkowitej.
źródło
Haskell , 38 bajtów
Czuję, że PPCG naprawdę ulepsza mój Haskell. Głaszcze białego kota.
f
bierzeInt
i zwraca aString
.Wypróbuj online!
(Nawiasem mówiąc, mówię o tym
<$f
. Zapisuje postać\_->
.)Alternatywnie, ta sama długość, ale mniej zła (
(l!!)
jest funkcją anonimową):Wypróbuj online!
Oba używają tej samej reprezentacji, co odpowiedź Japt @ETHproductions, chociaż szczególnie ta pierwsza może dawać pewne zbędne
<
s na początku.Pierwszy oblicza wszystkie kombinacje
n
"<"
i"~<~"
ciągi, a następnie indeksuje do wynikowej listy.Drugi rekurencyjnie oblicza nieskończoną listę utworzoną przez rozpoczynanie od,
""
a następnie konstruowanie nowych elementów przez dołączanie"<"
i"~<~"
ciągi znaków do każdego elementu znajdującego się już na liście (w rzeczywistości było nieco krócej, aby pozwolić""
się przekształcić"<"
).źródło
<$f
działa? Jakaś dziwna instancja funktora?Rubin ,
11811610910710591 bajtówZaoszczędzono 2 bajty dzięki cyoce!
Wypróbuj online!
Jest to funkcja, która przyjmuje liczbę całkowitą jako dane wejściowe i zwraca ciąg znaków reprezentujący tę liczbę całkowitą w Wise. Można znaleźć ungolfed wersję tutaj , który testuje ten program na wszystkich liczb całkowitych od 1.
Podstawową ideą jest zapisanie „puli” stałych. Następnie z każdym „krokiem” do puli dodawane są stałe dla każdej możliwej funkcji. Wybrałam funkcje
~
,<
oraz>
, które moim zdaniem są wystarczające do reprezentowania każdego numeru. (Przynajmniej każda liczba poniżej 10 000).źródło
dup
zamiastclone
iircdup
?map
nie modyfikuje odbiornika.Python2,
545251 bajtów.Podziękowania dla Kreatora pszenicy za zaoszczędzenie 2 bajtów i Ørjan Johansen za jeden bajt! Wykorzystuje to ten sam pomysł, co odpowiedź Japt ETHproduction, ale z różnymi ciągami zastępującymi (tj. Przy użyciu reprezentacji binarnej)
źródło
[
]
wokół generatora wewnątrzjoin
.join
może wziąć generator jako argument.'>~<~'*int(i)
może ci to uratować bajt.05AB1E , 11 bajtów
Wypróbuj online!
Podobne do Japt odpowiedzi ETHproductions.
Zaoszczędź 4 bajty dzięki @Adnan!
źródło
'
). Możesz także użyć indeksowania, co powinno dać ci 11 bajtów :).0
na element zerowy i1
na pierwszy element (ponieważ wektoryzuje się automatycznie). Oto wyraźniejszy przykład tego, jak to działa.Python 2 ,
123110 bajtówWypróbuj online!
Również jako
lambda
Wypróbuj online!
Może być krótszy, ale oto moje rozwiązanie. Bierze reprezentację binarną i zamienia ją w kod.
źródło
Japt , 23 bajty
Wypróbuj online!
źródło
Galaretka,
1110 bajtówTo jest przeniesiona wersja Japt odpowiedzi ETHproductions. Mówiąc o produkcjach ETH, zaoszczędzili mi jeden bajt!
źródło
<
, co w Wise daje 0~<~
mi to