Herausforderung
Geben Sie bei einer ASCII-Darstellung einer babylonischen Zahl als Eingabe die Zahl in arabischen Ziffern aus.
Babylonisches Zahlensystem
Wie haben die Babylonier gezählt? Interessanterweise verwendeten sie ein Base 60-System mit einem Element eines Base 10-Systems. Betrachten wir zunächst die Einheitenspalte des Systems:
Die Babylonier hatten nur drei Symbole: T
(oder, wenn Sie es rendern können:), 𒐕
die 1 repräsentierten, und <
(oder, wenn Sie es rendern können:), 𒌋
die 10 repräsentierten, und \
(oder, wenn Sie es rendern:), 𒑊
die Null repräsentierten.
Hinweis: Technisch gesehen ist \
(oder 𒑊
) nicht Null (weil die Babylonier keine Null hatten). 'Zero' wurde später erfunden, und \
ein Platzhaltersymbol wurde später hinzugefügt, um Mehrdeutigkeiten zu vermeiden. Für die Zwecke dieser Herausforderung ist es jedoch ausreichend, sie \
als Null zu betrachten
Also addieren Sie in jeder Spalte einfach den Wert der Symbole, zB:
<<< = 30
<<<<TTTTTT = 46
TTTTTTTTT = 9
\ = 0
Es werden niemals mehr als fünf <
oder mehr als neun T
in jeder Spalte sein. \
wird immer alleine in der Spalte angezeigt.
Jetzt müssen wir dies erweitern, um weitere Spalten hinzuzufügen. Dies funktioniert genauso wie bei jeder anderen Basis-Sechzig, bei der Sie den Wert der am weitesten rechts stehenden Spalte mit , den Wert links mit 60 1 , den Wert links mit 60 2 usw. multiplizieren . Sie addieren dann den Wert von jedem, um den Wert der Zahl zu erhalten.
Spalten werden durch Leerzeichen getrennt, um Mehrdeutigkeiten zu vermeiden.
Einige Beispiele:
<< <TT = 20*60 + 12*1 = 1212
<<<TT \ TTTT = 32*60^2 + 0*60 + 4*1 = 115204
Regeln
- Sie können entweder ASCII-Eingaben (
T<\
) oder Unicode-Eingaben (𒐕𒌋𒑊
) akzeptieren. - Die eingegebene Nummer liegt immer unter
- Das
<
s stehtT
in jeder Spalte immer links vom s \
wird immer alleine in einer Spalte angezeigt
Gewinnen
Kürzester Code in Bytes gewinnt.
quelle
<<<<TTTTTT <TTTTTTT <<<<TTTTTT <<<<
"How did the Babylonians count? Interestingly, they used a Base 60 system with an element of a Base 10 system."
Was heute noch in Gebrauch ist; Das babylonische Zahlensystem ist genau das, was wir für Uhren verwenden. Jeweils zwei Dezimalstellen für Sekunden, Minuten und Stunden, 60 Sekunden bis zur Minute, 60 Minuten bis zur Stunde.Antworten:
JavaScript (ES6), 44 Byte
Übernimmt die Eingabe als Array von ASCII-Zeichen.
Probieren Sie es online!
Wie?
Das babylonische Zahlensystem kann als eine 4-Anweisungssprache angesehen werden, die mit einem einzigen Register arbeitet - nennen wir es den Akkumulator.
Beginnend mit modifiziert jedes Zeichen c im Eingabearray a den Akkumulator k wie folgt:k = 0 c ein k
space
: multipliziere mit 60 (implementiert als: addiere 59 k zu k )<
: addiere zu kT
: Inkrement\
: nichts tun; Dies ist dieNOP
Anweisung dieser Sprache (implementiert als: addiere zu k )quelle
C (GCC) ,
140138136 BytesProbieren Sie es online!
quelle
Perl 6 , 39 Bytes
-3 bytes dank nwellnhof
Probieren Sie es online!
Verwendet die Keilschriftzeichen.
Erläuterung:
quelle
{:60[.words>>.&{sum (.ords X%151)X%27}]}
Jelly ,
1312 BytesEin monadischer Link, der eine Liste von Zeichen akzeptiert, die eine Ganzzahl ergibt.
Probieren Sie es online!
Wie?
Weitere 12:
ḲO⁽¡€%:5§ḅ60
(⁽¡€
ist1013
, so dass diese modulos1013
durch dieO
rdinal Werte bekommen53
,5
und1
für<
,T
,\
jeweils dann führt Integer - Division,:
durch5
zu bekommen10
,1
und0
)quelle
05AB1E , 13 Bytes
Probieren Sie es online!
Um nachzuholen, wie faul ich mit meiner Gelee-Antwort gewesen bin, ist hier eine Einreichung in 05AB1E xD.
quelle
8740
?•Yη•
(4 Bytes)1|Ç7%-13%O60β
ist auch 13 - ist es golfbar?Python 2 ,
96938785 BytesProbieren Sie es online!
Gerettet:
quelle
(ord(c)%5/2or 11)-1
8740%ord(c)/4
Excel VBA, 121 Byte
Zu 32-Bit - Office als offenes
^
dient alsLongLong
Typ wörtlichen in 64-Bit - VersionenÜbernimmt Eingaben von der Zelle
A1
und Ausgaben in das VBE-Direktfenster.Ungolfed und Kommentiert
quelle
Dyalog APL ,
3330 BytesProbieren Sie es online!
Edit: -3 Bytes dank ngn
'\ T<'⍳
Ersetzt die Zeichen durch Zahlen (ihre Position in der Zeichenfolgenkonstante) und⌽
kehrt die Eingabe um, sodass die wichtigsten 'Ziffern' die letzten sind. Dies ermöglicht+\2=
es, eine laufende Zählung der gewünschten Leistung von 60 (angewendet von60*
) aufrechtzuerhalten, indem gezählt wird, wie oft ein Leerzeichen (Index 2 in der Zeichenfolge konstant) angetroffen wird.⌊10*⍵-3
gibt für jedes Zeichen die gewünschte Zehnerpotenz an. Die Reihenfolge der Zeichen in der String-Konstante und der -3-Versatz bewirken, dass '\' und Leerzeichen auf negative Zahlen gesetzt werden, was zu Brüchen führt, wenn diese Zeichen auf die Zehnerpotenz angehoben werden⌊
.Jetzt müssen wir nur noch die Zehnerpotenzen mit den 60erpotenzen multiplizieren und das Los mit zusammenfassen
+/
.quelle
' '
:{+/(⌊10*⍵-3)×60*+\2=⍵}'\ T<'⍳⌽
Python 2 , 62 Bytes
Probieren Sie es online!
Dies verwendet die Technik von Arnauld's Antwort .
quelle
Canvas ,
201716 BytesProbieren Sie es hier aus!
Erläuterung:
quelle
APL (NARS ⎕io ← 0), 28 Zeichen, 56 Byte
einige Tests mit Typprüfung:
Jedes Typenergebnis ist eine Zahl.
quelle
JavaScript (Node.js) ,
12211410710683 ByteProbieren Sie es online!
Ich bin ein bisschen besessen von "funktionalen" Array-Operationen, benutze ASCII-Eingabe, soweit ich das beurteilen kann, ist JS nicht sehr gut darin, Zeichencodes golfen zu können
Ich behalte das für die Nachwelt, aber das ist eine naive / blöde Lösung. Ich schlage vor, Sie sehen sich Arnauld's Antwort an, was für die Umsetzung der Herausforderung weitaus interessanter ist
quelle
c<'T'
arbeitet anstelle vonc=='<'
&&
mit|
.for...of
Schleifen: PRetina ,
292623 BytesProbieren Sie es online! Verwendet Zeilenumbrüche, der Link enthält jedoch einen Header, um Leerzeichen zu verwenden. Bearbeiten: 3 Bytes mit Hilfe von @KevinCruijssen gespeichert. Weitere 3 Bytes dank @FryAmTheEggman gespeichert. Erläuterung:
Jeweils
<
durch 10T
s ersetzen .Nehmen Sie die erste Zeile, multiplizieren Sie sie mit 60 und fügen Sie die nächste Zeile hinzu. Dann wiederholen, bis nur noch eine Zeile übrig ist.
Zähle die
T
s.Schnellere 51-Byte-Version:
Probieren Sie es online! Verwendet Zeilenumbrüche, aber der Link enthält Header, um Leerzeichen zu verwenden. Erläuterung:
Ordnen Sie jede Zeile einzeln zu und zählen Sie die Anzahl
T
s und das Zehnfache der Anzahl<
s. Dies wandelt jede Zeile in ihren "stelligen" Basis-60-Wert um.Base 60-Konvertierung, wobei jeweils eine Zeile ausgeführt wird. Die Berechnung erfolgt für die Geschwindigkeit dezimal.
quelle
<
ohne die sein kann+
, es sei denn, ich sehe keine Randbedingung.$&
es sich jetzt immer um ein Zeichen handelt, kann ich das Standardzeichen verwenden und weitere zwei Bytes einsparen!_
Weile$*
in früheren Versionen von Retina standardmäßig1
.<
als einzelne Übereinstimmung genommen und diese 10-mal so lang wiederholt (die Anzahl<
der Übereinstimmungen), und meine vorgeschlagene Änderung wird alle<
10-mal wiederholt (wobei Sie mit der impliziten 1 2 Byte mehr Golf gespielt haben)10*
). Jetzt verstehe ich besser, warum das+
anfangs da war. Ich weiß nicht viel über die Retina-Funktionen, nur über reguläre Ausdrücke, daher meine vorgeschlagene Änderung, da ich sie bereits alle>
10 Male als Wiederholung gelesen habe . ;)Bash (mit sed und dc), 50 Bytes
Übernimmt durch Leerzeichen getrennte Eingaben von
stdin
, Ausgaben bisstdout
Probieren Sie es online!
Erläuterung
Verwendet sed, um die Eingabe mit einer Reihe von Übereinstimmungen mit regulären Ausdrücken zu transformieren, bis beispielsweise die Eingabe
<<<TT \ TTTT
in transformiert wurdeA+A+A+1+1+60*60*1+1+1+1+
. Dann wird diese Eingabe in DC mit dem expliziten Eingangsausführungsbefehl zugeführt?
, mit vorangestelltemz
(drückt die Stapellänge (0) auf den Stapel , so dass wir die Zugabe müssen irgendwo Masse) und gefolgt vonp
(Druck).quelle
J ,
34-30BytesProbieren Sie es online!
quelle
Dyalog APL,
3532 BytesProbieren Sie es online!
31 in dzaima / APL
quelle
Noether , 55 Bytes
Probieren Sie es online!
Gleicher Ansatz wie @Arnauld.
quelle
Holzkohle , 26 Bytes
Probieren Sie es online! Link ist eine ausführliche Version des Codes. Erläuterung:
Löschen Sie das Ergebnis.
Schleife über die eingegebenen Zeichen. Der
≡
Befehl wird in einen Block eingeschlossen, um zu verhindern, dass er einen "Standard" -Block findet.Aktuellen Charakter umschalten ...
Wenn es ein Leerzeichen ist, multiplizieren Sie das Ergebnis mit 60 ...
Wenn es ein ist,
<
dann addiere 10 zum Ergebnis ...Wenn es ein
T
ist, erhöhen Sie das Ergebnis.Drucken Sie das Ergebnis.
quelle
R ,
9881 BytesProbieren Sie es online!
Lächerlich lang wegen String-Analyse.Vielen Dank an Giusppe für das Abschneiden von 16 unnötigen Bytes.Definieren
y
den Bytecode-Wert der Unicode-Eingabe undR = y("T<\") = y("𒐕𒌋𒑊")
Beobachten Sie das
R%%3 = 1,2,0
undR%%6 = 1,5,0
... soR%%3 * R%%6 = 1,10,0
!Der Rest ist einfach: Summe pro Spalte, dann Skalarprodukt mit abnehmender Potenz von 60.
quelle
scan(,"")
automatisch auf Leerzeichen aufgeteilt?/60
kann durch-1
im Exponentenausdruck für ein anderes Byte aus ersetzt werden, plus das<-
kann durch ersetzt werden,=
da alles in Klammern steht.Ruby ,
5046 BytesProbieren Sie es online!
Ein grundlegender Port von Arnauld's Antwort wurde um GB für -4 Bytes verbessert.
quelle
C (gcc) ,
656463 BytesProbieren Sie es online!
quelle
return o
durch werdens=o
weitere 5 Bytes gespeichert.Java 8,
6460 Bytes-4 Bytes dank @ceilingcat .
Probieren Sie es online aus. Erläuterung:
quelle
Perl -F // -E, 39 Bytes
Dieser liest die zu konvertierende Nummer aus STDIN.
Dies ist unbedingt die gleiche Lösung wie bei @Arnauld mit JavaScript.
quelle
F #, 128 Bytes
Probieren Sie es online!
Ungolfed würde es so aussehen:
Seq.mapFoldBack
kombiniertSeq.map
undSeq.foldBack
.Seq.mapFoldBack
Durchläuft die Sequenz rückwärts und führt einen Akkumulatorwert durch die Sequenz (in diesem Falli
).Für jedes Element in der Sequenz wird die babylonische Zahl berechnet (mit
Seq.sumBy
, die jedes Zeichen einer Zahl zuordnet und das Ergebnis summiert) und dann mit multiplizierti
.i
wird dann mit 60 multipliziert, und dieser Wert wird dann an das nächste Element in der Sequenz übergeben. Der Ausgangszustand für den Akku ist 1.Die Reihenfolge der Aufrufe und Ergebnisse
Seq.mapFoldBack
für die Eingabe<<<TT \ TTTT
wäre beispielsweise:Die Funktion liefert ein Tupel von
seq<int>, int
. Diefst
Funktion gibt das erste Element in diesem Tupel und zurückSeq.sum
führt die eigentliche Summierung durch.Warum nicht benutzen
Seq.mapi
oder ähnliches?Seq.mapi
ordnet jedes Element in der Sequenz zu und stellt den Index für die Zuordnungsfunktion bereit. Von dort aus könnten Sie tun60 ** index
(wo**
ist der Netzbetreiber in F #).Aber
**
erfordertfloats
, nichtints
, was bedeutet , dass Sie entweder initialisieren müssen oder werfen alle Werte in der Funktion alsfloat
. Die gesamte Funktion wird ein zurückgebenfloat
, was (meiner Meinung nach) ein wenig chaotisch ist.Die Verwendung
Seq.mapi
kann für 139 Bytes folgendermaßen erfolgen :quelle
Tcl , 134 Bytes
Probieren Sie es online!
In der umgekehrten Liste inkrementiere ich das Ergebnis in einer Schleife in Zählen
<
undT
(mit der-all
Option regexp) und inkrementiere eine natürliche Potenz von 60.Richtige Version (siehe Kommentar)
quelle
regsub {\\} $l0 l
vor der foreach-Schleife eine haben sollen ...APL (Dyalog Extended) , 18 Byte SBCS
Anonyme implizite Präfixfunktion.
Probieren Sie es online!
quelle
05AB1E (Legacy) , 10 Byte
Probieren Sie es online!
05AB1E , 11 Bytes
Probieren Sie es online!
Der gleiche Algorithmus, aber in der modernen Version 05AB1E
O
funktioniert er nicht für Listen mit gemischten Ints und Listen, daher benötigen wir€O
stattdessen.quelle