Implementieren Sie einen skriptfähigen Taschenrechner mit einer einfachen Ganzzahloperation.
Konzept
Der Akku startet bei 0 und wird bedient. Am Ende des Programms wird der Wert des Akkus ausgegeben.
Operationen:
+
fügt1
dem Akkumulator hinzu-
subtrahiert1
vom Akkumulator*
multipliziert den Akku mit2
/
dividiert den Akku durch2
Beispielskript
Die Eingabe ++**--/
sollte die Ausgabe geben 3
.
Beispielimplementierung
def calc(s)
i = 0
s.chars.each do |o|
case o
when '+'
i += 1
when '-'
i -= 1
when '*'
i *= 2
when '/'
i /= 2
end
end
return i
end
Regeln
- Dies ist Codegolf . Die niedrigste Antwort in Byte gewinnt, ist jedoch nicht ausgewählt.
- Kreative Umsetzungen sind erwünscht.
- Standardlücken sind verboten.
- Sie erhalten das Programm über stdin oder Argumente und können die Antwort über den Rückgabewert oder stdout ausgeben.
- Habe Spaß.
- Division wird abgeschnitten, da es sich um eine Ganzzahldivision handelt.
- Das Programm
-/
kehrt zurück-1
.
Testfälle
*///*-*+-+
-1
/*+/*+++/*///*/+-+//*+-+-/----*-*-+++*+**+/*--///+*-/+//*//-+++--++/-**--/+--/*-/+*//*+-*-*/*+*+/+*-
-17
+++-+--/-*/---++/-+*-//+/++-*--+*+/*/*/++--++-+//++--*/***-*+++--+-*//-*/+*/+-*++**+--*/*//-*--**-/-*+**-/*-**/*+*-*/--+/+/+//-+*/---///+**////-*//+-+-/+--/**///*+//+++/+*++**++//**+**+-*/+/*/*++-/+**+--+*++++/-*-/*+--/++*/-++/-**++++/-/+/--*/-/+---**//*///-//*+-*----+//--/-/+*/-+++-+*-*+*+-/-//*-//+/*-+//+/+/*-/-/+//+**/-****/-**-//+/+-+/*-+*++*/-/++*/-//*--+*--/-+-+/+/**/-***+/-/++-++*+*-+*+*-+-//+/-++*+/*//*-+/+*/-+/-/*/-/-+*+**/*//*+/+---+*+++*+/+-**/-+-/+*---/-*+/-++*//*/-+-*+--**/-////*/--/*--//-**/*++*+/*+/-+/--**/*-+*+/+-*+*+--*///+-++/+//+*/-+/**--//*/+++/*+*////+-*-//--*+/*/-+**/*//+*+-//+--+*-+/-**-*/+//*+---*+//*/+**/*--/--+/*-*+*++--*+//+*+-++--+-*-*-+--**+/+*-/+*+-/---+-*+-+-/++/+*///*/*-+-*//-+-++/++/*/-++/**--+-////-//+/*//+**/*+-+/+/+///*+*///*-/+/*/-//-*-**//-/-+--+/-*--+-++**++//*--/*++--*-/-///-+/+//--+*//-**-/*-*/+*/-*-*//--++*//-*/++//+/-++-+-*/*-+++**-/-*++++**+-+++-+-***-+//+-/**-+/*+****-*+++*/-*-/***/-/*+/*****++*+/-/-**-+-*-*-++**/*+-/*-+*++-/+/-++*-/*-****-*
18773342
code-golf
math
number
arithmetic
dkudriavtsev
quelle
quelle
/
sich um Nicht-Ganzzahlen handeln kann.-/
zurückkehren?Antworten:
Python 2, 48 Bytes
Does
+2
,-2
,*2
, oder/2
. Indem+2
und-2
anstatt+1
und-1
ausführen, arbeiten wir in doppelten Einheiten, sodass die endgültige Ausgabe halbiert werden muss. Ausgenommen, die Floor-Division muss/
nun auf ein Vielfaches von 2 abgerundet werden, womit fertig ist&-2
.quelle
0q{2\~-2&}/2/
(2\~
Evaliert den Operator mit dem zweiten Operanden2
,-2&
ist das bitweise UND,2/
ist die endgültige Division durch zwei. Istq{...}/
ein Foreach über der Eingabe und0
ist nur der Anfang Wert.)Haskell, 51 Bytes
Anwendungsbeispiel:
foldl(#)0 $ "++**--/"
->3
.quelle
Jelly ,
1817 BytesProbieren Sie es online!
Wie es funktioniert
Die ersten sechs Zeilen definieren Hilfslinks mit Indizes zwischen 1 und 6 ; sie inkrementieren, tun nichts, dekrementieren, tun nichts, halbieren (Bodenbelag) und verdoppeln.
Der Hauptlink -
O0;ṛĿ/
- konvertiert die eingegebenen Zeichen in ihre Codepunkte (O
), stellt dem Array von Codepunkten eine 0 (Anfangswert ) voran0;
und reduziert das generierte Array wie folgt.Der Anfangswert ist das erste Element des Arrays, dh die vorangestellte 0 . Der Quicklink
ṛĿ
wird für jedes folgende Element im Array aufgerufen, wobei der letzte Rückgabewert als linkes Argument und das aktuelle Element als rechtes Element angegeben werden. Es überprüft sein rechtes Argument (ṛ
) und bewertet die Verknüpfung mit diesem Index monadisch (Ŀ
), wendet also die gewünschte Operation an.quelle
Python 2, 54 Bytes
Die Eingabe wird als Zeichenfolgenliteral interpretiert.
~ord(c)%5%3
Ordnet die Operatoren den entsprechenden rechten Operanden zu.Zuvor habe ich verwendet,
hash(c)%55%3
was nicht zu konsistenten Ergebnissen zwischen verschiedenen Versionen von Python führte. Dies ermutigte mich, andere Formeln zu erforschen.quelle
hash
ist Python-Version spezifisch - Ideone verwendet 2.7.10, was[1, 1, 2, 2]
als die vier Zuordnungen gibt, während ich lokal am 2.7.12[2, 0, 1, 0]
SILOS ,
133211 BytesÜbernimmt die ASCII-Codes von Operatoren.
Probieren Sie es online mit Testfällen:
-/
++**--/
*///*-*+-+
quelle
-/
sollte -1 zurückgeben , nicht 0 .Turing Machine - 23 Zustände (684 Bytes)
Probieren Sie es hier aus - Permalink
Die Eingabe sollte kein '*' enthalten, da es sich um ein Sonderzeichen im Turing-Maschinencode handelt. Verwenden Sie stattdessen 'x'. Gibt die Antwort binär aus.
Freier Code
Erklärung der Staaten:
Initialisierung:
Diese Zustände werden zu Beginn jedes Laufs, beginnend mit init2, einmal besucht
Anweisungen zum Lesen:
Diese Zustände werden während des gesamten Programms mehrmals besucht
readop: Bewegt sich ganz nach rechts, bis ein Operator oder das '.' Wenn es einen Operator trifft, wechseln Sie in den entsprechenden Status (+, -, x, /). Wenn ein '.' Angezeigt wird, wechseln Sie in den Status 'fin'.
return: Gibt den Kopf in den leeren Bereich zwischen der laufenden Summe und den Operatoren zurück. Dann wechselt er zu 'readop'.
Operationen:
Diese Operationen erledigen die eigentliche Drecksarbeit
+: Bewegen Sie sich nach links, bis der Kopf ein Nicht-Leerzeichen liest. Wenn dieses Zeichen ein "-" ist, bewegen Sie sich nach links und wechseln Sie zu "dec". Andernfalls wechseln Sie zu 'inc'.
-: Ähnlich wie '+', außer dass 'inc' geändert wird, wenn es ein '-' und andernfalls 'dec' gibt.
inc: Wenn die Ziffer unter dem Kopf eine 0 (oder ein Leerzeichen) ist, ändern Sie sie in 1 und dann in 'Null'. Wenn die Ziffer eine 1 ist, ändern Sie sie in 0 und wiederholen Sie den Vorgang bei der nächsten Ziffer.
dec: Ähnlich wie inc, außer dass 1 zu 0 geht, 0 zu 1 geht und wenn der Kopf ein Leerzeichen liest, zu 'neg' wechseln.
x, x0, x1: Verschieben Sie die Nummer eins nach links. Wechseln Sie zu "Zurück".
/, //, div, div0, div1: Bewegen Sie sich ganz nach rechts von der Zahl, und verschieben Sie dann die Bits um eins nach rechts. Wenn ein '-' angezeigt wird, wechseln Sie zu 'inc'. Dies simuliert das Abrunden negativer Zahlen. Andernfalls ändern Sie auf "Null"
neg: Platziere ein '-' nach der Zahl und ändere sie in 'readop'
zero, zero1, zero2: Entferne führende Nullen und wechsle zu 'readop'
Aufräumen: Macht die Ausgabe präsentierbar
quelle
Perl 6 ,
5352 BytesErläuterung:
Verwendung:
quelle
C
636257 BytesWandbox
quelle
05AB1E , 20 Bytes
Vielen Dank an Enigma für die
-/
Fehlerbehebung!Für 16 Bytes , wenn es nicht ganzzahligen Division ist:
Î"+-*/""><·;"‡.V
.Erläuterung:
Verwendet die CP-1252- Codierung. Probieren Sie es online!
quelle
-/
sollte -1 zurückgeben , nicht 0 .Î…+-*"><·"‡'/"2÷":.V
der negativen Zahlenteilung konnte bei gleicher Bytezahl behoben werden .JavaScript ES6,
8068 BytesDank Neil konnten satte 12 Bytes eingespart werden!
quelle
"c"+
und schreiben"c+1 c-1 c*2 c/2|0".split
usw.o=>c=[c+1,c-1,c*2,c/2|0]["+-*/".indexOf(o)]
Sie für die erste Antwort, warum nicht , oder ich denke, Sie können dann mit ein weiteres Byte speicherno=>c={"+":c+1,"-":c-1,"*":c*2,"/":c/2|0}[o]
.k=>[...k].reduce((c,o)=>+{"+":c+1,"-":c-1,"*":c*2,"/":c/2|0}[o],0)
könnte noch kürzer}
und Zeichen mit der Breite Null[o]
, das ist also eigentlich nur 66 Bytes lang. Auch das OP wurde geklärt;-/
sollte -1 zurückgeben , nicht 0 .Ruby,
484442 + 1 = 43 Bytes+1 Byte für
-n
Flag. Übernimmt die Eingabe für STDIN.Sieh es auf ideone (wird verwendet,
$_
da ideone keine Befehlszeilenflags akzeptiert): http://ideone.com/3udQ3Hquelle
PHP 76 Bytes
quelle
Python 2,
5856 Bytes-2 Bytes dank @Lynn
Die ordinals der Charaktere
+-*/
sind43,45,42,47
Modulo - 11 sind diese10,1,9,3
Modulo - 3 sind diejenigen1,1,0,0
, 2 weniger diejenigen sind ,1,1,2,2
geben die Beträge , die wir für jede Operation benötigenr=r+1
,r=r-1
,r=r*2
, undr=r/2
Bisherige:
quelle
2-ord(c)%11%3
es ?Mathematica,
837370 Bytes10 Bytes aufgrund von @MartinEnder gespeichert .
Anonyme Funktion. Nimmt eine Liste von Zeichen als Eingabe und gibt eine Zahl als Ausgabe zurück. Golfvorschläge sind willkommen.
quelle
SILOS ,
175 bis164 BytesProbieren Sie es online!
Gesunde Eingabemethode. Korrekte Ganzzahlteilung (rund gegen -unendlich).
quelle
C #,
8781 BytesUngolfed:
Die Eingabe wird als gültig angenommen. Die Division durch zwei erfolgt durch Verschieben um ein Bit nach rechts, da die reguläre Division immer in Richtung Null rundet und die Bitverschiebung immer abrundet. Inkrementieren und Dekrementieren Sie den Abstand 1 zwischen den ASCII-Codes für
+
und-
.quelle
int f(string s)=>s.Aggregate(0,(i,c)=>c<43?i*2:c<46?i+44-c:i>>1);
(65 Bytes)Javascript (ES6), 57 Byte (Array) / 60 Byte (Ganzzahl)
Ein Array aller Zwischenergebnisse zurückgeben:
Beispielsweise wird die Ausgabe für
"++**--/"
sein[1, 2, 4, 8, 7, 6, 3]
.Rückgabe nur des Endergebnisses:
Wie es funktioniert
Beide Lösungen basieren auf derselben Idee: Verwenden der perfekten Hash-Funktion
eval(2+c+3)&3
, um die verschiedenen Operatorzeichenc
in abzubilden[0, 3]
.quelle
JavaScript (ES6), 57
Hinweis: Der Anfangswert des Akkumulators ist die Programmzeichenfolge, die bei der ersten Verwendung mithilfe von Bitoperationen (~, >>, <<, |) in 0 konvertiert wird.
Als Randnotiz, die clevere Antwort von @xnor würde 40 Punkte ergeben, die auf Javascript portiert sind:
(wenn dir das gefällt, stimme für ihn)
Prüfung
quelle
Java, 77 Bytes
Verwendet Java 8-Streams.
quelle
r >> 1
zur>>1
und speichern 2 Bytes?s->s.chars().reduce(0,(r,c)->c<43?r*2:c<46?r+44-c:r>>1);
GNU sed,
655957 BytesEdit: 2 Bytes kürzer dank Toby Speights Kommentaren
Lauf:
Ausgabe:
Das
sed
Skript bereitet die Eingabe für dendc
Shell-Aufruf am Ende vor, wobei letzterer die Eingabe in umgekehrter polnischer Notation akzeptiert . Wenn die Zahl bei der Division negativ ist (d0>
), wird der[1-]
im Register gespeicherte Dekrementierungsbefehl@
aufgerufen. Umrechnungsbeispiel:+ - * /
->1+ 1- 2* d0>@2/
.quelle
[1-]
Muster übereinstimmen ...s
mitS
. Ich habe vergessen, dass es nicht den Stack des Registers ersetzt, sondern darauf drückt und den gegenteiligen Effekt hat, den ich wollte (da ich es für alle verwendet habe/
). Die Anführungszeichen werden weiterhin benötigt, da Sie/
Symbole enthalten, die die Zeichenfolge als Dateipfad interpretieren. Ich habe 1 Byte mehr rasiert, indem ich das Leerzeichen nach dem entfernt habe-e
.-e
als Dateinamen, Sie brauchen also keine Anführungszeichen für die/
- probieren Sie es aus! Ich halte es für vernünftig, dass ein Code-Golf verlangt, dass das aktuelle Arbeitsverzeichnis keine Dateien enthält, die mit01s@
oder beginnen0-s@
.-e
Bezug auf/
, aber die Anführungszeichen sind immer noch erforderlich, wie ich gerade gesehen habe. Das>
wird direkt von der Shell als Redirect-Operator interpretiert, denke ich, da ich diesen Fehler bekommen habe:cannot create @2/d0: Directory nonexistent
>
. Sie brauchen doch Zitate. Entschuldigung für die Irreführung! Und obwohl das Hinzufügen eines Backslashs wie ein Zeichen aussieht, muss es in einems///
Ersatz verdoppelt werden , sodass es keinen Nutzen bringt ...PHP, 75 Bytes
Hierbei wird eine modifizierte Version der Antwort von Jörg Hülsermann verwendet .
Die Verwendung eines einfachen regulären Ausdrucks (
~.~
) ist stark von der Ersetzung von Zeichenfolgen abhängig .Die Variable
$s
wird mit dem neuen Wert für jedes Zeichen neu zugewiesen. Am Ende gibt es das Ergebnis aus.Hinweis : Dies soll mit dem
-r
Flag ausgeführt werden .Probieren Sie es hier aus:
Code-Snippet anzeigen
Oder probieren Sie an: http://sandbox.onlinephpfunctions.com/code/7d2adc2a500268c011222d8d953d9b837f2312aa
Unterschiede:
echo$s
benutze ichsprintf($s)
. Beide führen dieselbe Aktion für Zahlen aus. Da dies nur zum Testen ist, ist es in Ordnung.++*+
als erstes Argument übergeben hätten, was angezeigt werden sollte5
.quelle
e
Modifikator ist zurück! : De
, der durch einen ersetzt wurdepreg_replace_callback
und für den es missbräuchlich sein könnte ... aber das ist nicht ganz so.Batch, 61 Bytes
Übersetzung von @ xnors xcellent Python-Antwort.
quelle
Pyke,
2422 BytesProbieren Sie es hier aus!
Oder 12 Bytes (nicht konkurrenzfähig)
Probieren Sie es hier aus!
translate
Knoten hinzufügen - im Grunde genommen mehrere Suchen und Ersetzen.quelle
PHP,
10410282 BytesErste Version mit Auswertung:
Zweite Version mit ternären Operatoren:
Nimmt die Eingabezeichenfolge als erstes Argument von der Befehlszeile.
Dies funktioniert "nur" für Eingabezeichenfolgen, die kürzer als 10.000 Zeichen sind - das sollte ausreichend sein. Getestet mit allen Testfällen, kann die Initialisierung am Anfang leider nicht speichern.Die zweite Version funktioniert mit Strings beliebiger Länge und ohne Initialisierung. :-)Das Hauptelement ist die Auswertungsfunktion, die
$i
auf der Grundlage einer Karte von arithmetischen Operationen manipuliert wird , die mit Ausnahme der Teilung ziemlich einfach sind. PHP gibt bei der Verwendung ein Float zurück/
undintdiv
ist zu groß, also machen wir das eine Rechtsverschiebung .Aktualisierung
$i=$i>>1
auf$i>>=1
für Ganzzahldivision .quelle
Python 3,
986660 BytesVielen Dank, Tukkax!
Nicht so golfen wie die andere Antwort, aber ohne Plagiat kann ich nicht mit ihnen mithalten.
Außerdem habe ich auch eine rekursive Lambda-Lösung
7367 Bytes (verbessert!)quelle
i=0 for c in input():i+=[1,-i//2,-1,i][ord(c)%23%4] print(i)
. (Natürlich nicht richtig formatiert). Außerdem sollten Sie erwähnen, dass Sie Python3 verwenden. In Python2input()
würde auswertenint(raw_input())
.+-
tut 1)R, 201 Bytes
Golf gespielt
Kommentiert
Strategie ist es, die
+, -, %
Betreiber zu verfeinern . Teilen Sie die Zeichenfolge auf und analysieren Sie sie in eine lange Liste von Funktionen, die eingespeist werden sollenReduce()'s
Akkumulator eingegeben werden sollen.Konnte nicht mehr Golf spielen. Wenn jemand
b=body<-
zur Arbeit kommen kann, kann dies zu Einsparungen von einigen Bytes führen (jede Funktion mitb
after verfeinern"-"="+"="/"="*"
). Anfänglich wurde versucht, eval zu ersetzen und zu analysieren, aber die Reihenfolge der Operationen und Klammern war erschreckend.quelle
f, ...
der Definition derReduce
Funktion und dem Loswerden vonstdin()
in entfernen,scan
aber ich habe es nur mit Naivität versucht Ansatz, bei dem zwei weitere Bytes verloren gingen, indem die Funktionen etwas anders definiert wurden. tio.run/##XcvLCsMgEAXQrwnO6Gge29B/…Lex + C,
78,74, 73 BytesDas erste Zeichen ist ein Leerzeichen.
Liest aus
stdin
, gibt das Ergebnis zurück.Kompiliere mit
lex golfed.l && cc lex.yy.c main.c -lm -lfl
, test main:quelle
Javascript (ES5), 127 Byte
Ungolfed:
quelle
Pyth, 23 Bytes
Ein vollständiges Programm, das Eingaben als Zeichenfolge akzeptiert und das Ergebnis ausgibt.
Dies ist eine Portierung von @ xnors Python-Antwort .
Probieren Sie es online aus
Wie es funktioniert
quelle
u@[yGhG0tG0/G2)CHQ0
19 BytesPHP, 79 Bytes
quelle
1
; Sie müssen teilen und multiplizieren mit2