Twórz mądre liczby

18

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

~<<~

TIO

Działa to, ponieważ ~zamienia zero, nieskończony ciąg 0bitów, na jeden ujemny, nieskończony ciąg 1bitów, każdy <dołącza się 0nieco do końca, kiedy skończymy, robimy, ~co zamienia każdy z nich na ciąg 0s, po którym następuje 1s 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ę nbez ż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 nie 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 -> ~<~<<<<
Post Rock Garf Hunter
źródło
jest 0 uwzględnione wpositive integers
colsw
4
Nie, 0 nie jest ujęte w dodatnich liczbach całkowitych.
Zacharý
Podobno :zastosowany na pustym stosie wypycha a 0. Myślę, że należy to sprecyzować, ponieważ nie jest oczywiste, że powielanie z pustego stosu powinno dać0
Luis Mendo
Czy inne znaki mają błędy składniowe, czy są ignorowane?
xnor
@Luismendo nie znasz zawartości stosu poza tym, że jeśli stos jest zerowy
Post Rock Garf Hunter

Odpowiedzi:

8

Japt , 10 bajtów

¤d0'<1"~<~

Wypróbuj online!

Podstawowy pomysł: weź binarną reprezentację liczby i mapuj 0do <i 1do ~<~. Wyjścia dla 1-10:

 1: ~<~
 2: ~<~<
 3: ~<~~<~
 4: ~<~<<
 5: ~<~<~<~
 6: ~<~~<~<
 7: ~<~~<~~<~
 8: ~<~<<<
 9: ~<~<<~<~
10: ~<~<~<~<
ETHprodukcje
źródło
Metagolfing też byłby łatwy. Wystarczy rozebrać pary~~
Draco18s nie ufa już SE
7

JavaScript (ES6), 34 33 bajty

f=n=>n?f(n&1?~n:n/2)+'<~'[n&1]:''
<input type=number oninput=o.textContent=f(this.value)><pre id=o>

Działa dla dowolnej 32-bitowej liczby całkowitej.

Neil
źródło
Ok, rozgryzłem to. Chłodny! dobra robota.
Post Rock Garf Hunter
7

Haskell , 38 bajtów

Czuję, że PPCG naprawdę ulepsza mój Haskell. Głaszcze białego kota.

f n=mapM(["<","~<~"]<$f)[1..n]!!n>>=id

fbierze Inti zwraca a String.

Wypróbuj online!

(Nawiasem mówiąc, mówię o tym <$f. Zapisuje postać \_->.)

Na Functorprzykład dla (->) a(funkcje od typu a), mamy: x <$ f = fmap (const x) f = const x . f = const x. Jedynym ograniczeniem jest to, że fwersja ostateczna const xmusi używać tego samego typu źródła a. Instancja jest całkowicie leniwa, więc nigdy nawet tego nie ocenia f.

Alternatywnie, ta sama długość, ale mniej zła ( (l!!)jest funkcją anonimową):

(l!!)
l=(++)<$>"":tail l<*>["<","~<~"]

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ć "<").

Ørjan Johansen
źródło
1
Jak do diabła to <$fdziała? Jakaś dziwna instancja funktora?
xnor
@xnor Mwahahaha Chyba powinienem wtedy dodać wyjaśnienie.
Ørjan Johansen
3

Rubin , 118 116 109 107 105 91 bajtów

Zaoszczędzono 2 bajty dzięki cyoce!

->n{o={0=>""}
o.dup.map{|c,k|["~~c","<c*2"].map{|t|o[eval t[1..9]]=k+t[0]}}until o[n]
o[n]}

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).

Conor O'Brien
źródło
Możesz użyć dupzamiast cloneiirc
Cyoce
Czy ty w ogóle potrzebne dup? mapnie modyfikuje odbiornika.
Cyoce
@Cyoce Myślę, że tak
Conor O'Brien
Och, teraz rozumiem. Ruby nie lubi modyfikować podczas iteracji.
Cyoce
3

Python2, 54 52 51 bajtów.

lambda x:'<'.join('>~<~'*int(i)for i in bin(x)[2:])

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)

Zacharý
źródło
Nie potrzebujesz [ ]wokół generatora wewnątrz join. joinmoże wziąć generator jako argument.
Post Rock Garf Hunter
Myślę, że '>~<~'*int(i)może ci to uratować bajt.
Ørjan Johansen
Uważam, że najnowszy wynik powinien być wymieniony na końcu, na korzyść zautomatyzowanych fragmentów tablicy wyników i tym podobnych.
Ørjan Johansen
Przepraszam, że się spóźniłem.
Zacharý
2

05AB1E , 11 bajtów

bS'<…~<~‚èJ

Wypróbuj online!

Podobne do Japt odpowiedzi ETHproductions.

Zaoszczędź 4 bajty dzięki @Adnan!

Towarzyszu SparklePony
źródło
Hej miło! W rzeczywistości nie trzeba konwertować liczb na ciągi, ponieważ są one równymi „typami” w 05AB1E. To samo dotyczy literałów liczbowych (możesz obejść się bez '). Możesz także użyć indeksowania, co powinno dać ci 11 bajtów :).
Adnan
@Adnan Dziękuję bardzo!
Towarzysz SparklePony,
@Adnan Krótkie pytanie, jak tu działa?
Towarzysz SparklePony,
Po pierwsze, zamienia argumenty, ponieważ wpadłby w wyjątek, gdyby został oceniony normalnie. Po zamianie mapuje 0na element zerowy i 1na pierwszy element (ponieważ wektoryzuje się automatycznie). Oto wyraźniejszy przykład tego, jak to działa.
Adnan
1

Python 2 , 123 110 bajtów

def w(x):a=map(int,bin(x)[2:]);return x%2*("~<~:<"+"<".join(":"*e for e in a[-2::-1])+"|"*sum(a))or w(x/2)+"<"

Wypróbuj online!

Również jako lambda

w=lambda x:x%2*("~<~:<"+"<".join(":"*int(e)for e in bin(x)[-2:2:-1])+"|"*sum(map(int,bin(x)[2:])))or w(x/2)+"<"

Wypróbuj online!

Może być krótszy, ale oto moje rozwiązanie. Bierze reprezentację binarną i zamienia ją w kod.

Post Rock Garf Hunter
źródło
0

Galaretka, 11 10 bajtów

Bị“~<~“<”F

To jest przeniesiona wersja Japt odpowiedzi ETHproductions. Mówiąc o produkcjach ETH, zaoszczędzili mi jeden bajt!

Zacharý
źródło
Czy możesz zamienić ciągi znaków i udawać, że indeksowanie jest oparte na 0?
ETHprodukcje
Co masz na myśli? Mam na myśli fakt, że muszę zwiększyć binarną reprezentację liczby, aby uzyskać użyteczne indeksy.
Zacharý
Wypróbuj online!
ETHprodukcje
Nie działa, 1 produkuje <, co w Wise daje 0
Zacharý
Naprawdę? Daje ~<~mi to
ETHproductions