Machen Sie weise Zahlen

18

Weise ist eine einfache bitweise Sprache, die ich vor einiger Zeit entworfen habe. Es basiert auf den bitweisen Operationen von Python . Es gibt mehrere Operationen, von denen die meisten mit dem entsprechenden Symbol in Python identisch oder sehr ähnlich sind.

  • : Duplizieren Sie die Oberseite des Stapels

  • ? Drehen Sie die Oberseite des Stapels nach unten

  • ! Drehen Sie die Unterseite des Stapels nach oben

  • [ ] Schleife, während die Oberseite des Stapels nicht Null ist

  • ~ nicht die Oberseite des Stapels (-(n+1) )

  • - negiere die Spitze des Stapels (-n )

  • > Verschieben Sie den oberen Rand des Stapels einmal nach rechts (n//2 )

  • < Verschieben Sie den oberen Rand des Stapels einmal nach links (n*2 )

  • ^xoder die beiden obersten Elemente des Stapels ( wie Python )

  • |oder die beiden obersten Elemente des Stapels ( wie Python )

  • &und die beiden obersten Elemente des Stapels ( wie Python )


Eine Ganzzahl in Wise zu erstellen ist ziemlich einfach. Sie können sie mit Null setzen ::^und inkrementieren, ~-sodass Sie sie ein paarmal zu Null setzen und inkrementieren können. Wenn wir jedoch die -Dinge entfernen, werden sie etwas interessanter.

Wir können immer noch jede Nummer mit den restlichen Operationen machen. Zum Beispiel ist hier 3

~<<~

TIO

Dies funktioniert, weil ~Null, eine unendliche Folge von 0Bits, in negative Eins, eine unendliche Folge von 1Bits, <verwandelt wird , wobei jedes 0Bit an das Ende angehängt wird. Wenn wir fertig sind ~, verwandeln wir jedes Bit in eine Folge von 0s, gefolgt von zwei 1s , oder wie die meisten Leute es nennen 3.


Aufgabe

Schreiben Sie ein Programm, das bei einer positiven Ganzzahl ein Wise-Programm ausgibt, das die Zahl nohne -Quelle erstellt (die Quelle der Ausgabe, die Sie verwenden können)- in Ihrer eigenen Quelle verwenden). Sie können davon ausgehen, dass sich oben auf dem Stapel bereits eine Null befindet.

Dies ist nicht Sie sollten also versuchen, den generierenden Quellcode zu minimieren, nicht unbedingt die Ausgabe.

Beispielausgaben

Diese Liste erhebt keinen Anspruch auf Vollständigkeit. Es handelt sich lediglich um mögliche Ausgaben

1  -> ~<~
2  -> ~<~<
3  -> ~<<~
4  -> ~<~<<
5  -> ~<~:<<|
6  -> ~<<~<
7  -> ~<<<~
8  -> ~<~<<<
9  -> ~<~:<<<|
10 -> ~<~:<<|<
11 -> ~<<~:><<<|
12 -> ~<<~<<
13 -> ~<<~:<<<|>
14 -> ~<<<~<
15 -> ~<<<<~
16 -> ~<~<<<<
Weizen-Assistent
quelle
is 0 included inpositive integers
colsw
4
Nein, 0 ist nicht in positiven ganzen Zahlen enthalten.
Zacharý
Anscheinend :auf einen leeren Stapel aufgetragen, drückt ein 0. Ich denke, dies sollte spezifiziert werden, da es nicht offensichtlich ist, dass das Duplizieren von einem leeren Stapel geben sollte0
Luis Mendo
Sind andere Zeichen Syntaxfehler oder werden sie ignoriert?
xnor
@Luismendo Sie kennen den Inhalt des Stapels nicht anders als das auch, wenn der Stapel eine Null ist
Weizen-Assistent

Antworten:

8

Japt , 10 Bytes

¤d0'<1"~<~

Probieren Sie es online!

Grundidee: Nehmen Sie die binäre Darstellung der Zahl und ordnen Sie 0sie <und 1zu ~<~. Ausgänge für 1-10:

 1: ~<~
 2: ~<~<
 3: ~<~~<~
 4: ~<~<<
 5: ~<~<~<~
 6: ~<~~<~<
 7: ~<~~<~~<~
 8: ~<~<<<
 9: ~<~<<~<~
10: ~<~<~<~<
ETHproductions
quelle
Metagolfing das wäre auch einfach. ~~
Zieh
7

JavaScript (ES6), 34 33 Bytes

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

Funktioniert für jede 32-Bit-Ganzzahl.

Neil
quelle
Ok, ich habe das herausgefunden. Cool! gute Arbeit.
Weizen-Assistent
7

Haskell , 38 Bytes

Ich habe das Gefühl, dass PPCG mein Haskell wirklich verbessert. Streichelt weiße Katze.

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

fnimmt ein Intund gibt ein zurück String.

Probieren Sie es online!

(Ich beziehe mich <$fübrigens darauf. Es speichert einen Charakter über \_->.)

Im FunctorBeispiel für (->) a(Funktionen von Typ a), haben wir: x <$ f = fmap (const x) f = const x . f = const x. Die einzige Einschränkung ist, dass fund das Finale const xdenselben Quelltyp verwenden müssen a. Die Instanz ist komplett faul, daher wird sie niemals ausgewertet f.

Alternativ die gleiche Länge, aber weniger böse ( (l!!)ist eine anonyme Funktion):

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

Probieren Sie es online!

Beide verwenden dieselbe Darstellung wie die Japt-Antwort von @ETHproductions, obwohl insbesondere die erste zu <Beginn einige redundante s enthalten kann.

Der erste berechnet alle Kombinationen von n "<"und"~<~" Zeichenfolgen und indiziert dann in die resultierende Liste.

Die zweite berechnet rekursiv eine unendliche Liste gebildet , indem mit Start ""und dann neue Elemente der Konstruktion durch Anhängen "<"und "~<~"Strings zu jedem Element bereits in der Liste (es war tatsächlich etwas kürzer, auch die lassen ""get verwandelte sich in "<".)

Ørjan Johansen
quelle
1
Wie um alles in der Welt funktioniert das <$f? Irgendeine seltsame Functor-Instanz?
8.
@xnor Mwahahaha Ich denke, ich sollte dann eine Erklärung hinzufügen.
Ørjan Johansen
3

Ruby , 118 116 109 107 105 91 Bytes

2 Bytes gespart dank 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]}

Probieren Sie es online!

Dies ist eine Funktion, die die Ganzzahl als Eingabe verwendet und die Zeichenfolge zurückgibt, die diese Ganzzahl in Wise darstellt. Sie können eine ungolfed Version finden Sie hier , die sich auf alle ganzen Zahlen dieses Programm testet von 1 auf.

Die Grundidee besteht darin, einen "Pool" von Konstanten aufzuzeichnen. Dann werden mit jedem "Schritt" Konstanten für jede mögliche Funktion zum Pool hinzugefügt. Ich habe die Funktionen gewählt ~,< und >, von denen ich glaube, dass sie ausreichen, um jede Zahl darzustellen. (Zumindest jede Zahl unter 10.000.)

Conor O'Brien
quelle
Sie können dupanstelle von cloneiirc
Cyoce
Haben Sie noch brauchen dup? mapändert seinen Empfänger nicht.
Cyoce
@Cyoce Ich denke, es tut
Conor O'Brien
Oh ich sehe jetzt. Ruby mag es nicht, Änderungen während der Iteration vorzunehmen.
Cyoce
3

Python2, 54 52 51 Bytes.

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

Vielen Dank an Wheat Wizard für das Speichern von 2 Bytes und Ørjan Johansen für ein Byte! Dies verwendet dieselbe Idee wie die Japt-Antwort von ETHproduction, jedoch mit unterschiedlichen Ersetzungszeichenfolgen (dh unter Verwendung der binären Darstellung).

Zacharý
quelle
Sie brauchen [ ]den Generator nicht in der Nähe join. joinkann einen Generator als Argument nehmen.
Weizen-Zauberer
Ich denke, ich '>~<~'*int(i)kann dir ein Byte sparen.
Ørjan Johansen
Ich glaube, dass die neueste Punktzahl zuletzt aufgeführt werden soll, zum Vorteil von automatisierten Scoreboard-Ausschnitten und dergleichen.
Ørjan Johansen
Tut mir leid, dass ich zu spät komme.
Zacharý
2

05AB1E , 11 Bytes

bS'<…~<~‚èJ

Probieren Sie es online!

Ähnlich wie die Japt-Antwort von ETHproductions.

4 Bytes gespart dank @Adnan!

Genosse SparklePony
quelle
Hey schön! Sie müssen die Zahlen nicht in Zeichenfolgen konvertieren, da sie in 05AB1E den gleichen Typ haben. Gleiches gilt für die Anzahl Literale (auf die kann man verzichten '). Sie können auch die Indizierung verwenden, die Ihnen 11 Bytes geben sollte :).
Adnan
@Adnan Vielen Dank!
Genosse SparklePony
@Adnan Nur eine kurze Frage, wie funktioniert es hier?
Genosse SparklePony
Zunächst werden die Argumente ausgetauscht, da bei einer normalen Auswertung eine Ausnahme auftreten würde. Nach dem Tauschen wird es 0dem nullten Element und 1dem ersten Element zugeordnet (da es automatisch vektorisiert). Hier ist ein anschaulicheres Beispiel dafür, wie es funktioniert.
Adnan
1

Python 2 , 123 110 Bytes

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)+"<"

Probieren Sie es online!

Auch als 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)+"<"

Probieren Sie es online!

Könnte kürzer sein, aber hier ist meine Lösung. Es nimmt die binäre Darstellung und verwandelt sie in den Code.

Weizen-Assistent
quelle
0

Jelly, 11 bis 10 Bytes

Bị“~<~“<”F

Dies ist eine portierte Version der Japt-Antwort von ETHproductions. Apropos ETHproductions, sie haben mir ein Byte gespart!

Zacharý
quelle
Könnten Sie die Zeichenfolgen vertauschen und so tun, als ob die Indizierung auf 0 basiert?
ETHproductions
Was meinst du? Ich beziehe mich auf die Tatsache, dass ich die binäre Darstellung der Zahl erhöhen muss, um brauchbare Indizes zu erhalten.
Zacharý
Funktioniert nicht, produziert 1 <, die in Wise 0
Zacharý
"Ja wirklich?" Es gibt ~<~für mich
ETHproductions