In dieser Herausforderung werden Sie einen Dolmetscher für eine einfache Sprache schreiben, die ich erfunden habe. Die Sprache basiert auf einem einzelnen Akkumulator A, der genau ein Byte lang ist. Zu Beginn eines Programms ist A = 0. Dies sind die Sprachanweisungen:
!
: Inversion
Dieser Befehl invertiert einfach jedes Bit des Akkumulators. Jede Null wird zu einer Eins und jede wird zu einer Null. Einfach!
>
: Nach rechts verschieben
Diese Anweisung verschiebt jedes Bit in A um eine Stelle nach rechts. Das Bit ganz links wird zu einer Null und das Bit ganz rechts wird verworfen.
<
: Nach links verschieben
Dieser Befehl verschiebt jedes Bit in A um eine Stelle nach links. Das Bit ganz rechts wird zu einer Null und das Bit ganz links wird verworfen.
@
: Swap Nybbles
Dieser Befehl tauscht die oberen vier Bits von A mit den unteren vier Bits aus. Wenn beispielsweise A ist 01101010
und Sie ausführen @
, ist A 10100110
:
____________________
| |
0110 1010 1010 0110
|_______|
Das sind alle Anweisungen! Einfach, richtig?
Regeln
- Ihr Programm muss zu Beginn einmalig Eingaben akzeptieren . Dies wird eine Codezeile sein. Dies ist kein interaktiver Interpreter! Sie können Eingaben nur einmal annehmen und müssen nach Ausführung dieser Zeile nicht zum Anfang zurückkehren.
- Ihr Programm muss diese Eingabe auswerten. Jedes oben nicht erwähnte Zeichen wird ignoriert.
- Ihr Programm sollte dann den Endwert des Akkus dezimal ausgeben.
- Es gelten die üblichen Regeln für gültige Programmiersprachen.
- Standardlücken sind nicht zulässig.
- Dies ist Code-Golf , die kleinste Anzahl von Bytes gewinnt.
Hier sind einige kleine Programme, mit denen Sie Ihre Beiträge testen können. Vor dem Pfeil steht der Code, danach das erwartete Ergebnis:
!
->255
!>>
->63
!<@
->239
!nop!&6*!
->255
Genießen!
quelle
! -> 255
dass wir hier 8 Bits pro Byte verwenden? Die Frage ist nicht explizit.Antworten:
Pyth,
3635 BytesKabelbaum testen
Die interne Darstellung des Akkumulators ist eine ganze Zahl. Diese Ganzzahl wird bei jeder Iteration wie gewünscht um 256 geändert. Die Operationen durchgeführt werden
-G-1
,G/2
,G*2
undG
umgerechnet auf der Basis 16, umgekehrt, und konvertieren zurück zur Basis 10, wobeiG
der Akkumulator ist.Ich habe den Gedanken daran, alles andere zu ignorieren, verpasst. Dies wurde behoben. Danke, @Dennis.
quelle
-G-1
kürzer als~G
in Pyth? Das bezweifle ich etwas.t_G
, wo_
Negation ist undt
ist-1
. In Pyth~
bedeutet das etwas völlig anderes.~
(bitweise NICHT)C 96
Angenommen, ASCII-Eingabe (oder kompatible Eingabe):
Ordentlicher:
Im Grunde ist es nur eine Sammlung verschachtelter ternärer Ausdrücke. Ich inkrementiere den erhaltenen Wert,
getchar()
so dass ein EOF (-1) einen Wert von Null ergibt und das Programm beendet wird.(ideone link)
quelle
!<>
sollte ergeben127
und nicht255
). Definieren Sie entweder Ihra
alschar
, oder verwenden Sie die Liniea&=255
(und verwenden Sie%u
), um den richtigen Effekt zu erzielen. Auch können Sie Ihre Negation verkürzena^255
zu~a
.a>>4&15
ist auch kürzer als deine(a&240)/16
.%u
%hhu
a/16|a*16
anstelle von verwendena/16|(a&15)*16
. Die wenigen Bits oben werden von der entfernt&255
.a*257/16
Ist ein Byte kürzer alsa/16|a*16
.Python 3, 133 Bytes
Verwendet ein Wörterbuch, um einen Mangel an Groß- / Kleinschreibung in Python auszugleichen. Sehen Sie hier mehr .
Der Akkumulator ist eine Zeichenfolge, die am Ende in eine Zahl zur Basis 10 umgewandelt wird.
Beispiel I / O:
quelle
for i in sys.stdin:
:)Javascript (ES6),
809190 BytesSo kurz wie es nur geht. Definiert eine anonyme Funktion, die das Programm als Eingabe verwendet.
!
, nimmtx XOR 255
, als JS~
würdex
eine 32-Bit-Zahl in Betracht ziehen .<
multipliziertx
mit 2 und nimmt das Ergebnis mod 256.>
verschiebt die Bits umx
1 Bit wirklich nach rechts.@
Bödenx/16
und fügt es hinzux%16*16
.Vielen Dank an @vihan, der vorgeschlagen hat
reduce
, ein Byte zu speichern.quelle
<
ca. 4 Bytes speichern. Durch die Verwendung von "Reduzieren" werden möglicherweise auch einige Bytes<
anstelle von==
? Wenn ja, würde das nicht funktionieren, da No-Op-Zeichen eine Operation falsch ausführen würden. Ich habe das in meiner vorherigen 80-Byte-Lösung verwendet.CJam, 37 Bytes
Probieren Sie es online im CJam-Interpreter aus .
Wie es funktioniert
quelle
Java (8),
514483411366359239224229198194187186184182181180177 ZeichenWow, das hat eine Menge Golf gespielt! Vielen Dank an alle, die mir Vorschläge gemacht haben! Ich schätze es sehr!
31 (!) Bytes durch Optimieren des Nibble-Swaps mit bitweisen Operationen im Gegensatz zu langwierigen
Integer.???
Methoden.Golf 72 (!!!!) Zeichen durch Entfernen der unnötigen Zeichenfolge zum Tauschen von Knabbern. Viel besser als zuvor !?
45 (!!) Zeichen durch Entfernen von
java.util.Scanner
und Ablesen vonSystem.in
direkt abgelegt . Beachten Sie, dass jetzt, da der Lambda-Ausdruck nicht mehr vorhanden ist, Java 8 nicht mehr benötigt wird! Einfach nur Java 1 würde reichen!Hat dank @bmarks 7 Zeichen durch Erstellen einer Klasse
(default)
(entferntespublic
Schlüsselwort) erzieltGolfen Sie 120 (!!!!!!!) Zeichen, indem Sie all diese langwierigen
Integer
Klassenoperationen im Bit drehen255 - a
. Das ist jetzt viel kürzer!15 (!) Zeichen durch Konvertieren von Verschiebungen in Multiplikation und Division, Entfernen der geschweiften Klammern aus der while-Anweisung und Lokalisieren
a
innerhalb dermain
Methode.Ungolfed 9 = (Zeichen aufgrund eines Problems mit der Linksverschiebung, bei dem das am weitesten links liegende Byte nicht verworfen wird. Deshalb tue ich das jetzt
mod (256)
. Durch die Rechtsverschiebung wird die resultierende Zahl um ein Bit kürzer als zuvor, sodassmod
bei der Rechtsverschiebung keine Verwendung erforderlich ist . Mein Nibble-Swap-Ding tauscht die letzten 4 Bits und das vorletzte Nibble aus undand (&)
schneidet alle anderen Bits ab. Mein Inversionsprogramm verursacht keine Probleme, wenn die ursprüngliche Zahl kleiner als 256 ist.Golfed
3135 Zeichen dank @Geobits durch Umwandlungswitch
Aussage zu vielen ternären Aussagen und auch Zeichen zu Ints Umwandlung, die Literale zu verkürzen.Golfed 7 Zeichen durch unnötige Entfernung
&240
im knabbern swap ((a&240)>>4
zua>>4
und Umwandlung(a&15)<<4
zua<<4&240
. Die letzte Änderung stammt golfed nur wenn ein Zeichen.Golfed 1 char durch unnötiges Entfernen
=
ina /= 2
, weila = a /= 2
gleichbedeutend mita = a / 2
.Golf 2 Zeichen durch Drehen
println
anprint
.Golf 2 Zeichen durch Entfernen von versehentlich
a=
ina=255-a
(a=a=255-a
entsprichta=255-a
)1 Char durch Drehen
a<<4&240
in Golfa%16<<4
.Golf 1 Zeichen durch Hinzufügen von Klammern an der Außenseite der ternären Anweisung und zu tun
%256
. Auf diese Weise ist das%16
im linken Verschiebungsteil des Knabbertauschs nicht erforderlich. Die Klammern addieren 2 Zeichen und die%16
spart 3 Zeichen.Golfed 3 Zeichen , indem
class
aufinterface
und Entfernenpublic
mit Feature - Methode Java 8 statische Schnittstelle. Danke an @TheNumberOne (kein Kommentar, aber Antwort auf "Tipps zum Golfen in Java"quelle
Integer
Klassenmethoden entfernen .switch
Weile Golf zu spielen. Dercase
/break
sind einfach zu lang. Sie sollten in der Lage sein, einen Haufen zu retten, indem Sie das Ganze zu einem Dreiklang machen. so etwas wiea=i=='!'?255-a:i==62?a/2:i=='<'?a*2%256:i=='@'?(a&240)>>4|(a&15)<<4:a;
Rust,
121115 BytesProbelauf:
Ungolfed:
Überraschend kurz für Rust. Nichts anderes wirklich Interessantes als die Tatsache, dass ich heute mehr Vorrangregeln gelernt habe - wer wusste, dass
(a>>b)|c
es dasselbe ist wiea>>b|c
?Aus einem Byte durch Ändern
n>>=1
von rasiertn/=2
; Dies ist jedoch mit der Multiplikation nicht möglich, da ein arithmetischer Überlauf in Rust eine Panik (dh ein Absturz) ist.quelle
>>
es sich um eine Art Spaltung und|
eine Art Addition handelt.HP 41C / CV / CX (? Bytes, 42 Schritte)
Rein zum Kichern, hier für den HP 41C / CV / CX-Rechner. (Benötigt entweder das Extended Functions-Modul oder einen 41CX für die ATOX-Funktion.) Der Rechner meldet leider keine Programmgrößen in Bytes.
Legen Sie Ihr Programm in das Alpha-Register, was ein wenig schwierig ist, da es keine Möglichkeit gibt, es zu betreten! oder @ direkt von der Tastatur (verwenden Sie XTOA mit den ASCII-Codes 33 bzw. 64, um sie anzuhängen).
In den Schritten 08 und 10 können ungültige Opcodes ignoriert werden. Entfernen Sie sie, um 2 Schritte zu speichern, aber das Programm stürzt bei ungültiger Eingabe ab.
quelle
Python 2, 79 Bytes
Mir ist aufgefallen, dass ich in Python etwas sehr Ähnliches gemacht habe . Dies ist nur ein Teil meiner Ruby-Antwort , aber im Übrigen die kürzeste Python-Antwort: D
Der Unterschied zur Ruby-Version besteht darin, dass diese ungültige Anweisungen beim Durchlaufen der Eingabe nicht ignoriert. Stattdessen nehme ich die Tatsache zunutze , dass Python zurückzukehren neigt
-1
statt ,nil
wenn es keine Übereinstimmung - Der aktuelle Wert dera
an der Rückseite des Ergebnisses Array angehängt wird, so dass alle ungültigen Anweisungen Karten auf den gleichen, unveränderten Wert.quelle
Python 3,
1249493 Bytes"!" ist gleichbedeutend mit Subtrahieren von 255.
"<" ist gleichbedeutend mit Multiplizieren mit 2. Aber 8-Bit-Register bedeutet Mod 256.
">" ist gleichbedeutend mit ganzzahliger Division durch 2.
"@" bedeutet Verschieben der letzten 4 Bits (
a%16
) um 4 Bits (*16
) und Addieren der ersten vier Bits (a/16
).EDIT (schamloses Kopieren lesen)
Sah die andere Antwort in Python (durch Beta-Zerfall). Es ist eine sehr effektive Methode, Schalterfälle mithilfe eines Wörterbuchs zu simulieren. Damit können wir schreiben
Danke, Beta Decay.
quelle
256
oder? Also , warum das nicht am Ende:a={"!":255-a,"<":a*2,">":a//2,"@":(a%16)<<4+a>>4}.get(i,a)%256
. Dies erspart Ihnen sofort ein Byte (weil Sie diesa*2
anstelle von tun werdena<<1
) ... aber @ danieros Antwort zeigt auch, dass wenn Sie es auf diese Weise tun, es(a%16)<<4
auf nur verkürzt werden kanna<<4
, da jedes Bit 16 oder größer eliminiert wird, sobald Sie multiplizieren es um 16 und verkleinere es um mod 256. Schön! Sie können jetzt auch255-a
durch-1-a
... oder besser durch nur ersetzen~a
. Insgesamt sollten Sie mit diesen Vorschlägen 9 Byte einsparen.Haskell, 89 Bytes
Anwendungsbeispiel:
f "!>>"
->63
quelle
Rust, 111 Bytes
Eher ein Kommentar zur Antwort von @ Doorknob, aber ich habe keinen Repräsentanten für Kommentare, da ich gerade ein Konto erstellt habe.
Man kann 10 Bytes seiner Rust-Lösung mit den folgenden Mitteln absparen:
quelle
Python 3, 127 Bytes
Edit: Kurzschluss, danke @Jakube
Edit2: fix, danke @Anachor
quelle
!<
gibt ,510
während es sein sollte254
Ceylon,
297,290Formatiert:
#f
und#f0
Hexadezimalzahlen für die Halbbytes sind,.byte
konvertiert eine Ganzzahl in ein Byte. Ich bin glücklich, dass Bytes.string
Attribut bereits die vorzeichenlose Darstellung eines Bytes verwendet. Ceylon bietet auch eine switch-Anweisung ohne Fall-Through und eine Zeichenfolge ist eine Liste von Zeichen, die iteriert werden kann.Ich habe auch versucht, diese langen Shift-Methodennamen mithilfe eines Aliasing-Imports zu reduzieren, aber dies wird tatsächlich 7 Byte länger:
Formatiert:
Dies kann nützlich sein, wenn wir diese Methoden etwas häufiger benötigen.
quelle
Rubin,
8173 BytesSo viel einfacher - keine Bewertung! Für jedes gültige Zeichen in der Eingabe wertet es jede Anweisung aus und findet die entsprechende Anweisung über den Index von
$&
(das aktuelle Zeichen in der Eingabe).quelle
STATA, 197 Bytes
Ungolfed
Funktioniert nicht mit dem Online-Dolmetscher und erfordert den nicht freien Standard-Dolmetscher. Dies wäre mit tatsächlichen bitweisen Operationen etwas einfacher, aber ich denke nicht, dass sie für die meisten gängigen Anwendungen von STATA zu nützlich sind.
quelle
JavaScript, 104
Verschachtelte ternäre Operatoren werden Anweisungen zugeordnet.
BITWISE AND wird verwendet, um unseren Zahlentyp auf ein einzelnes Byte zu beschränken.
quelle
Julia,
117948673 BytesDies ist eine anonyme Funktion, die eine Zeichenfolge akzeptiert und eine Ganzzahl zurückgibt. Um es aufzurufen, weisen Sie es einer Variablen zu.
Ungolfed:
8 Bytes dank Sp3000 und 13 dank Dennis gespart!
quelle
JavaScript (ES6), 76
81Als unbenannte Funktion, die den Akkumulatorwert zurückgibt
Dies ist eine Portierung der superschlauen Antworten von @daniero (die viel zu wenig positive Stimmen haben)
Bonus: Sie können einen Anfangswert des Akkus übergeben. Wenn nicht bestanden, ist der Startwert 0, wie spezifisch.
Teste das folgende Snippet in einem beliebigen EcmaScript 6-Browser (in Firefox getestet)
quelle
Kristall, 139 Bytes
quelle
C # 193
quelle
using System;
oder so etwas nicht zugreifenConsole.ReadLine
undConsole.Write
ohne dasSystem.
Präfix?byte
für jede Operation besetzen müssen, aber ich könnte mich irren.Lua, 344 char
Inspiriert von der Verwendung eines String-Akkumulators durch @Beta Decay, da lua keinen Bytetyp hat. Könnte wahrscheinlich mit weniger Funktionen mehr Golf spielen.
quelle
R, 194 Bytes
ungolfed
quelle
<-
können alle ersetzt=
werden, wodurch der Code um 7 Byte reduziert wird. Außerdem können Sie möglicherweise dieif
Anweisungsreihe durch einen Aufruf vonswitch
(wie inA=switch(r,"!"=(A+1)%%2, ...)
)b=readline();A=rep(0,8);s=strsplit(b,"")[[1]];for(r in s)A=switch(r,"!"=(A+1)%%2,">"=c(0,A)[1:length(A)],"<"=c(A,0)[-1],"@"=c(A[5:8],A[1:4]),A);print(sum(A*(2^(7:0))))
sind 167 Bytes.RPL, 170,5 Bytes
Die Eingabe sollte als Zeichenfolge auf Ebene 1 eingegeben werden.
quelle
K, 57 Bytes
Es ist ein Anfang:
getestet mit Kona:
In k5 könnte ich es vielleicht besser machen, aber es ist eine komplexe Reihe von Kompromissen - zum Beispiel ist das Konvertieren von Binär in Dezimal so einfach wie
2/
, aber das Verhalten von?
macht es schwieriger, einen Standardfall für die Befehlssuche zu behandeln.quelle
PHP, 189 Bytes
Es ist nicht so, dass es viele Antworten übertreffen würde, sondern nur zum Üben
quelle
HPPPL ,
302294 BytesUngolfed:
Diese Antwort stellt sicher, dass der HP Prime 8-Bit-Ganzzahlen ohne Vorzeichen verwendet, auch wenn der Modus vom Benutzer auf z. B. 64 Bit festgelegt wurde. Wenn der Taschenrechner manuell mit vorzeichenlosen 8-Bit-Dezimalzahlen eingerichtet wurde, kann der
pragma
Befehl weggelassen werden. Wenn die Ausgabe nicht unbedingt dem Format entsprechen muss, kann dasa*1
am Ende einfach seina
. Durch Multiplizieren des Ergebnisses mit 1 wird lediglich sichergestellt, dass die Ausgabe nicht der internen Ausgabe für ganzzahlige Werte folgt. Derprint
Befehl in Zeile 4 kann auch weggelassen werden, wenn das Terminal vor dem Ausdruck des Ergebnisses nicht gelöscht werden muss. Wenn die Übergabe des Programms als String-Argument zulässig ist, kann derINPUT
Befehl auch weggelassen werden.Dies ist die kürzeste Version mit Eingabe und korrekter Ausgabe ohne das Pragma-Argument (wenn der Taschenrechner standardmäßig auf Uint8 eingestellt ist):
243 Bytes:
quelle
Perl 6,
9689 BytesAlte Lösung:
quelle
C #, 119 Bytes
Andere Versionen, die ich ausprobiert habe, aber mehr Bytes benötigen:
quelle
Python 2.7.3, 104 Bytes
Code in Strings zu haben, der ausgewertet werden soll, sieht ziemlich schmutzig aus, funktioniert aber: D
Hier ist die Ausgabe (und Eingabe tatsächlich ..)
Und ja, es läuft wirklich auf einem RaspberryPi :)
quelle