Aus dem Wikipedia-Artikel :
Die Ortsarithmetik (lateinisch arithmeticæ localis) ist das additive (nicht-positionsbezogene) binäre Zahlensystem, das John Napier in seiner Abhandlung Rabdology (1617) symbolisch und auf einem schachbrettartigen Gitter als Berechnungstechnik erforschte.
Was?
Mit Ortsziffern können Zahlen mit Buchstaben des Alphabets geschrieben werden.
Die Binärnotation war noch nicht standardisiert, weshalb Napier für die Darstellung von Binärzahlen sogenannte Positionsnummern verwendete. Das Napier-System verwendet die Zeichenwertnotation zur Darstellung von Zahlen. Es werden aufeinanderfolgende Buchstaben des englischen Alphabets verwendet, um aufeinanderfolgende Zweierpotenzen darzustellen: a = 2 ^ 0 = 1, b = 2 ^ 1 = 2, c = 2 ^ 2 = 4, d = 2 ^ 3 = 8, e = 2 ^ 4 = 16 und so weiter.
Ein Beispiel
ab
= 1 + 2 = 3 in der Basis 10
aabb
= 1 + 1 + 2 + 2 = 6 in der Basis 10
Beachten Sie, dass aabb
dies bc
durch Ersetzen von 2 Instanzen eines Buchstabens durch eine höhere verkürzt werden kann .
Zusatz
Sie verketten einfach die beiden Zahlen und vereinfachen.
acd
+ bde
= acdbde
= abcdde
= acebe
= abcf
= 39
in der Basis 10
Subtraktion
Entfernen Sie einfach alle Ziffern, die in beiden Teilen der Subtraktion gleich erscheinen. Das Erweitern (Konvertieren b
in aa
) kann erforderlich sein
abde
- ad
= be
= 18 in der Basis 10
Multiplikation
Das ist etwas schwieriger.
Nehmen wir an, wir wollen acd
(13) mit def
(56) multiplizieren . Zuerst ordnen Sie acd
vertikal an:
a
c
d
Dann fügen Sie def
nach dem ersten hinzu a
:
a def
c
d
Jetzt ist c 2 Stellen später im Alphabet als a, also addieren wir 2 Stellen im Alphabet, um def
zu machen fgh
. Das wird zur zweiten Zeile hinzugefügt.
a def
c fgh
d
Schließlich ist d 1 Stelle später im Alphabet als c, also addieren wir 1 Stelle im Alphabet, um fgh
zu machen ghi
. Das wird der dritten Zeile hinzugefügt.
a def
c fgh
d ghi
Dann nimmst du die Summe von rechts: def
+ fgh
+ ghi
= deffgghhi
= deggghhi
= deghhhi
= deghii
= deghj
(728)
Ein weiteres Beispiel für die Multiplikation
Eingang:
bc * de
Zuerst:
b
c
Dann
b ef
c
Dann
b ef
c fg
Beachten Sie, dass wir ef
in der ersten Zeile notiert haben. Das liegt daran, dass es mit bc
beginnt b
und b
der zweite Buchstabe im Alphabet ist. Wir müssen also um einen de
Buchstaben verschieben, damit es wird ef
.
Dann
ef+fg
Ausgabe:
eh
Teilung
Dies ist nicht Teil dieser Herausforderung, da es sehr komplex werden kann.
Deine eigentliche Herausforderung
Ihr Programm oder Ihre Funktion muss Eingaben als Zeichenfolge annehmen, die wie folgt aussieht:
a + b
Und Sie müssen Folgendes ausgeben:
ab
Natürlich muss Ihr Programm oder Funktionsnummern beliebiger Länge unterstützen (bis auf den String oder Eingabegrenze Ihrer Sprache) mit einem der Betreiber +
, -
oder *
. Einige weitere Beispiele:
Eingang:
ab + bd
Ausgabe:
acd
Eingang:
d - ab
Ausgabe:
ac
Eingang:
ab * cd
Ausgabe:
cf
Anmerkungen:
- Die Reihenfolge der Buchstaben in der Ausgabe spielt keine Rolle, aber Sie können immer davon ausgehen, dass die Reihenfolge der Buchstaben in den Zahlen in der Eingabe aufsteigend ist (a vor z).
- Sie können Eingaben mit einem nachgestellten Zeilenumbruch und Ausgaben mit einem nachgestellten Zeilenumbruch vornehmen.
- Sie können nicht Eingabe als eine Liste von nehmen
ab
,*
undbd
fürab * bd
. - Das englische Alphabet wird verwendet (
abcdefghijklmnopqrstuvwxyz
) - Ihre Ausgabe muss vereinfacht werden (
aa
ist nicht erlaubt,b
ist erforderlich) - Die Eingabe wird vereinfacht (
b
+c
, nichtaa
+bb
oderaa
+aaaa
) - Sie können einen Platz benötigen , bevor und den Betreiber (
+
,-
oder*
), oder man kann es keine sein müssen. - Es wird nur einen Operator pro Eingabe geben.
- Sie können davon ausgehen, dass die Ausgabe und die Eingabe niemals über 2 ^ 27-1 (
abcdefghijklmnopqrstuvwxyz
) hinausgehen werden. - Das ist Code-Golf , also gewinnt die kürzeste Antwort in Bytes!
quelle
d is 2 positions later in the alphabet than c
ist das wright sollte es nicht sein1
?That is added to the second row.
im selben Satz, sollte es nicht seinthird
?bc*de==efgh
aberefgh
ist240
nicht144
bc*de
sollte seineh
Antworten:
Jelly ,
2625 BytesVerwendet Jelly Operatoren (
×
statt*
und_
statt-
) in der Eingabezeichenfolge als durch die OP erlaubt .(Benötigt Leerzeichen um die Operatoren)
Probieren Sie es online! oder sehen Sie sich die Testsuite an
Wie?
quelle
Mathematica, 168 Bytes
Meine ursprüngliche Lösung (bevor der Beitrag bearbeitet wurde, um zu verdeutlichen, dass die Ausgabe vereinfacht werden muss) war um
64
Bytes kürzer:Dies änderte gerade diese Lösung, um zu arbeiten. Es ist wahrscheinlich kürzer, die in der Herausforderung beschriebenen Methoden tatsächlich anzuwenden, aber ich wollte das trotzdem ausdrücken.
Erläuterung:
Ersetzt jede Folge von Buchstaben durch die entsprechende Ganzzahl durch eine Zeichencode-Arithmetik, konvertiert die resultierende Zeichenfolge in einen Ausdruck (der sich automatisch in eine Ganzzahl vereinfacht), erstellt dann eine Zeichenfolge mit
a
der gleichen Länge wie diese Ganzzahl und ersetzt schließlich benachbarte identische Zeichen Zeichen mit dem nächsten Zeichencode, bis ein fester Punkt erreicht ist.quelle
JavaScript (ES6),
136134133 BytesDank Luke 1 Byte gespeichert
Testfälle
Code-Snippet anzeigen
quelle
Perl 5 , 95 Bytes
94 Byte Code +
-p
Flag.Probieren Sie es online!
Drei Schritte hier:
-
s/\w/a x 2**(-97+ord$&)/ge;
Konvertiert die Eingabe in eine Zeichenfolge vona
nur.-
s/(.*)-\1|+//;/*/&&($_=$`x length$')
führt den Operator aus (das sind sehr einfache Zeichenfolgena
):+
Ist die Verkettung-
das Entfernen von so vielen aus dem ersten Teil,a
wie es im zweiten Teil gibt, und*
das Duplizieren des ersten Teils, so oft esa
im zweiten Teil gibt Teil.-
1while s/(.)\1/chr 1+ord$1/e
faltet die aufeinanderfolgenden gleichen Buchstaben in den nächsten Buchstaben des Alphabets.quelle
05AB1E , 29 Bytes
Probieren Sie es online! oder als Testsuite
Erläuterung
quelle
C & x86 asm, 340 Bytes
Übersetzen Sie mit -O0
Erläuterung
Da C keine hat
eval()
, habe ich stattdessen eine Tabelle mit x86-Anweisungen verwendet. Ich musste Anweisungen auswählen, die alle die gleiche Länge hatten (oder mit Nops aufgefüllt waren), und die dieselbe Quelle und dasselbe Ziel erwarteten. Besonders ärgerlich war, dass MUL nur in Register schreiben kann und die 1-Byte-MUL-Opcodes nur in EAX schreiben können. Außerdem schien es keinen register-schreibenden SUB-Befehl zu geben, der vom Speicher subtrahierte, anstatt umgekehrt, daher der XCHG.bearbeiten
Da es in den Kommentaren gefragt wurde, würde eine traditionellere Herangehensweise so aussehen:
Aus folgenden Gründen ist es mit 301 Zeichen etwas kürzer: 1. Da viele Funktionen erforderlich sind, kann der Overhead der einzelnen Funktionen mit einigen Präprozessorregeln reduziert werden. 2. Modernes Linux schützt vor der Ausführung auf dem Stack, so dass der Aufruf von mprotect () diese geopferten 34 Bytes deaktiviert. 3. Der XCHG-Aufruf ist sehr suboptimal und kostet weitere 30 Byte. Wäre dies nicht der Fall, würde die x86-Combo etwa 10 bis 20 Byte gewinnen.
Außerdem wurden 2 Bytes von beiden durch Verbessern des islower () -Aufrufs in g gehackt.
quelle
GNU sed + coreutils, 329 Bytes
Ja, ich habe keine Ahnung, was in mich gefahren ist, aber ich kenne sed scripting jetzt ein bisschen besser. Beachten Sie, dass diese Lösung die
e
Erweiterung von GNU sed erfordert , die einen Shell-Befehl ausführt.Ich gehe davon aus, dass es keine Leerzeichen um die Operatoren geben wird. Von meinem Terminal:
Und für diejenigen, die vernünftiger sind als ich: die kommentierte Version!
quelle
sed: file golf.sed line 24: ":" lacks a label
PHP, 168
Ausgabe Aufsteigend bei Verwendung von eval
PHP, 185 Bytes
Ausgabe aufsteigend
Online Version
Erweitert
PHP, 201 Bytes
Ausgang absteigend
Online Version
Erweitert
quelle
Python 3 ,
176167 BytesProbieren Sie es online!
quelle
m>=2**(t+1)
durchm>=2**t*2
und fünf Bytes durch Ersetzena=a.split();m=eval(i(a[0])+a[1]+i(a[2]))
durch etwas Ähnliches abschneidenb,c,d=a.split();m=eval(i(b)+c+i(d))
.2**(ord(i)-97)
durch1<<ord(i)-97
.PHP, 130
erweiterte Version:
renn mit
php -R <code>
.quelle
AWK, 201 Bytes
"(awk '$0="a s"'<<<1)"|getline v
ist der beste Weg , ich mit einem tun einfielevaluate
inAWK
. Ich kann ein wenig "schummeln", um dies nur zu nennenAWK
, da ich einen Befehl ausführe, aber zumindest ist der Befehl auchAWK
:)Ich bin sicher, ich vermisse einen Weg, um die Byteanzahl zu reduzieren, aber ich kann es sicher nicht sehen.
Die Verwendung ist ziemlich normal. Geben Sie beispielsweise den Code ein
FILE
und führen Sie Folgendes aus:Beachten Sie, dass keine Leerzeichen erforderlich sind und alle Nicht-Op- / Nicht-Az-Zeichen stillschweigend ignoriert werden. Könnte durch Ändern der Schleife erweitert werden, um mit Zahlen zu arbeiten, die größer als "abcdefghijklmnopqrstuvwxyz" sind. Um eine Division
/
durchzuführen , fügen Sie einfach das Zeichen zur Operationszeichenfolge hinzu :). Außerdem wird eine leere Zeile gedruckt, wennresult <= 0
.quelle