Schau Mama! Ich habe mein eigenes (Basis 10) Zahlensystem erstellt! [geschlossen]


21

Wir haben es alle geschafft, na ja, vielleicht auch nicht, aber das Erstellen einer eigenen fremden Sprache und eines eigenen Nummerierungssystems ist eine Grundvoraussetzung für besonders fantasievolles Schreiben, aber meistens nur eine unterhaltsame Aktivität.

Die Aufgabe ist einfach, nehmen Sie zwei Eingaben:

  1. Eine geordnete Liste enthält 10 [zehn] eindeutige 'Ziffern' (beliebige druckbare ASCII-Zeichen) und interpretiert diese nacheinander als die Werte 0, 1, 2, 3, ..., 9

    + Es gibt Ausnahmen von dem, was hier eine Ziffer sein kann. Arithmetische Operatoren (+, -, *, /), Klammern und Leerzeichen können nicht als eine der Ziffern verwendet werden.

  2. Ein arithmetisches Problem, bei dem nur diese 'Ziffern' verwendet werden

Und das äquivalente ganzzahlige Ergebnis in der angegebenen Form ausgeben.

Hier ist ein Beispiel:

INPUT

abcdefghij

bcd + efg + hij
OUTPUT

bdgi

Im Beispiel entspricht die Eingabeliste (Sie können wählen, in welcher Form die Liste angezeigt wird) von 'abcdefghij' '0123456789', genau wie 'hjkloiwdfp' auch 1 zu 1 mit '0123456789' entsprechen würde, wobei anstelle von 'a' eine Zuordnung zu erfolgt Null, "h" tut. Die folgende Arithmetik 'übersetzt' zu 123 + 456 + 789, was 1368 entspricht. Dies muss dann in der Form ausgegeben werden, die wir ihm gegeben haben, also b (die 1 darstellt) d (für 2) g (für 6) und i (für 8).

TESTFÄLLE

abcdefghij
abc + def - ghij

-gedc
qwertyuiop
qwerty / uiop

e
%y83l;[=9|
(83l * 9) + 8%

y9|8

MEHR REGELN

  • Standardlücken sind verboten!
  • Dies ist Codegolf, also gewinnt die kürzeste Antwort in Bytes.
  • Muss ein vollständiges Programm oder eine vollständige Funktion sein, die die Ein- und Ausgänge in dem für Sie am besten geeigneten Format verwendet. (Nur können keine zusätzlichen Informationen in die Eingaben eingefügt werden, nur 'Ziffern' und der Ausdruck.
  • Verwenden Sie eine beliebige Sprache (sofern sie anderen Regeln entspricht)

9
Der 2. Testfall legt nahe, dass die endgültige Ausgabe gerundet ist, andernfalls wäre das Ergebnis q.ioiopewioyetqorw.... Wenn ja, welche Art von Rundung sollte angewendet werden?
Arnauld

2
Um @ SriotchilismO'Zaics Punkt zu ergänzen, haben wir auch einen Sandkasten zu Ihren und unseren Gunsten; Die Community soll helfen, Herausforderungen zu verfeinern, bevor sie veröffentlicht werden. Gute Idee für eine Herausforderung!
Giuseppe

3
Verschiedene Sprachen bewerten wahrscheinlich die gleiche Gleichung unterschiedlich. Ich bin mir nicht sicher, ob es einen Ausweg gibt. Zum Beispiel können T-SQL kehrt 1für 5/3nicht 2aufgrund ganzzahlige Teilung (nicht Rundung). Dies macht die Herausforderung nicht ungültig, aber Sie müssen möglicherweise unterschiedliche zulässige Antworten für denselben Testfall zulassen (siehe meine T-SQL-Antwort unten).
BradC

2
@ Giuseppe Wow, ich habe diesen Stapel eine lange Zeit durchsucht und wusste nie davon! Wäre auf jeden Fall hilfreich gewesen, vor allem als erstes Poster (langjähriger Zuhörer), das ich bin. Ich werde es mir für das nächste Mal merken! Vielen Dank für Ihren Kommentar und Ihre Antwort.
Bill W

2
Eine interessante Variation davon wäre eine, die eine beliebige Zahlenbasis unterstützt, abhängig von der Länge der ersten Zeichenfolge in der Eingabe ...
Darrel Hoffman,

Antworten:


11

05AB1E , 10 9 Bytes

žh‡.Eò¹Åв

(Jetzt) ​​Ausgabe als Liste von Zeichen.

Probieren Sie es online aus oder überprüfen Sie alle Testfälle .

Erläuterung:

          # Transliterate the second (implicit) input, replacing every character of 
           # the first (implicit) input with:
žh         # The builtin "0123456789"
   .E      # Then evaluate it as Elixir code
     ò     # Round it to the nearest integer
      ¹Åв  # And change it back by using a custom base-conversion with the first input as
           # base (which results in a character list)
           # (after which that result is output implicitly)

Die neue Version von 05AB1E wurde in Elixir erstellt . Die .EFunktion ruft auf call_unary(fn x -> {result, _} = Code.eval_string(to_string(x)); result end, a), wo das Code.eval_stringElixier eingebaut ist .

Beachten Sie, dass die ältere Version von 05AB1E hierfür nicht funktioniert, da sie in Python erstellt wurde. Die Zahlen mit führenden Nullen werden nicht ausgewertet:
Alle Testfälle in der ÅвVorgängerversion anzeigen (die die 10-Byte-Version verwendet, da die integrierte Version neu ist).


8

R , 58 Bytes

function(d,s,`[`=chartr)'0-9'[d,eval(parse(t=d['0-9',s]))]

Probieren Sie es online!

Verwendet die Zeichenübersetzung chartr, um die Ziffern, parses und evals den Ausdruck und dann chartrs zurück zu den ursprünglichen Ziffern zu tauschen .

Wenn eine Rundung auf die nächste Ganzzahl erforderlich ist, ist dies

R , 65 Bytes

function(d,s,`[`=chartr)'0-9'[d,round(eval(parse(t=d['0-9',s])))]

Probieren Sie es online!


Die Verwendung [eines kürzeren Namens für eine Funktion mit 3 Parametern ist sehr sinnvoll. Gut gemacht.
Robin Ryder

6

T-SQL, 117 Bytes

DECLARE @ CHAR(99)
SELECT @='SELECT TRANSLATE('+TRANSLATE(e,c,'0123456789')+',''0123456789'','''+c+''')'FROM t
EXEC(@)

Zeilenumbrüche dienen nur der Lesbarkeit.

Die Eingabe erfolgt gemäß unseren IO-Regeln über eine bereits vorhandene Tabelle t mit Textspalten c (Zeichen) und e (Gleichung) .

Verwendet die SQL 2017-Funktion TRANSLATE, um zwischen Zeichen zu wechseln und eine Zeichenfolge zu generieren, die nicht nur die Gleichung, sondern auch den Code enthält, der in die ursprünglichen Zeichen zurückübersetzt werden soll:

SELECT TRANSLATE(123 + 456 + 789,'0123456789','abcdefghij') 

Diese Zeichenfolge wird dann mit ausgewertet EXEC().

Möglicherweise gibt es einige Zeichen (z. B. ein einfaches Anführungszeichen '), die diesen Code beschädigen. Ich habe nicht alle möglichen ASCII-Zeichen getestet.

Je nach Herausforderung bewerte ich den Ausdruck als gegeben, abhängig davon, wie meine Sprache diese Operatoren interpretiert. Daher gibt der zweite Testfall aufgrund der Ganzzahldivision 1 ( w) und nicht 2 ( e) zurück.


4

Perl 6 , 38 Bytes

{*.trans($_=>^10).EVAL.trans(^10=>$_)}

Probieren Sie es online!

Ich bin mir nicht sicher, wie die Rundung funktionieren soll. Wenn es am Ende rundet, kann ich .roundfür +6 Bytes hinzufügen . Wenn das Verhalten von /anders sein sollte, kann es länger sein. Nimmt Eingaben wie gewohnt entgegen f(arithmetic)(numerals)(arithmetic).

Erläuterung:

{                                    }  # Anonymous codeblock
 *                                      # Returning a whatever lambda
  .trans($_=>^10)       # That translates the numerals to digits
                 .EVAL  # Evaluates the result as code
                      .trans(^10=>$_)   # And translates it back again

3

Stax , 74 66 65 Bytes

┼ö8Q#xóπcM~oÖ÷╦├mî☼yº─▐4ç≥e╘o▄ê‼ø_k╜ø8%N╫ ╗e<.╗P[─╛èA±!xêj«w╠°{B♪

Führen Sie es aus und debuggen Sie es

Stax geht es hier nicht gut, es fehlt eine echte "Eval" -Anweisung. Es hat eine, die in den Dokumenten als "eval" bezeichnet wird, funktioniert jedoch nur mit Literalwerten, nicht mit vollständigen Ausdrücken.


Dies entspricht möglicherweise nicht der Bedienerpräzision. Sie sind sich nicht sicher, ob dies erforderlich ist? staxlang.xyz/…
dana

@ Dana: Guter Punkt. Das habe ich nicht bedacht. Ein Fix kostet wahrscheinlich einige Bytes, daher warte ich auf eine Klärung, bevor ich versuche, dieses Verhalten zu ändern.
rekursiver

3

Bash, 97 Bytes

IFS=''
read S
read O
A=`echo "$O"|tr "$S" 0-9`
printf %0.f `bc<<<"(${A[@]##0})+0.5"`|tr 0-9 "$S"

Könnte weniger sein, wenn wir kürzen könnten, als rund. Es ist auch schwierig, mit führenden Nullen umzugehen (wie in Testfall 2), da Bash Zahlen, die mit 0 beginnen, als Oktal interpretiert.


Was ist der Konsens über die Verwendung von Dienstprogrammen wie "bc" und "tr" zum Golfen?
Spuck

1
Ich bin kein Experte, aber ich denke, diese Art von Antworten werden normalerweise als "bash + coreutils" eingereicht
Giuseppe

@ Giuseppe trist ein Teil des coreutils, bcist es aber nicht. Trotzdem bcist ein sehr verbreitetes Werkzeug. Jeder andere Befehl in dieser Antwort ist bash.
Rexkogitans

-7 Bytes aus der Antwort von @ CM gestohlen, Reduzierung von '0123456789' auf '0-9'
9.

Das Definieren von T ist nicht länger vorteilhaft: $TIst nur ein Byte kürzer als 0-9, verwenden Sie es nur zweimal und geben Sie 8 Bytes aus, um es zu definieren.
Ruds

2

Bean , 94 90 Bytes

Hexdump

00000000: 53d0 80d6 d800 d3d0 80a0 1f20 8047 53a0  SÐ.ÖØ.ÓÐ. . .GS 
00000010: 1753 d080 d3d0 80a0 5e20 800a a181 8100  .SÐ.ÓÐ. ^ ..¡...
00000020: 40a0 5f52 cac3 4da0 6580 53d0 80a0 5d20  @ _RÊÃM e.SÐ. ] 
00000030: 8089 205f a065 205f 2080 0aa1 8181 0123  .. _ e _ ..¡...#
00000040: 0058 0020 800a a181 8102 40a0 6550 84a0  .X. ..¡...@ eP. 
00000050: 5d20 652e dce2 b02b dc64                 ] e.Üâ°+Üd

JavaScript

`${Math.round(
  eval(
    b.replace(
      /./g,
      c => ~(i = a.indexOf(c)) ? i : c
    ).replace(
      /\b0+/g,
      ''
    )
  )
)}`.replace(
  /\d/g,
  i => a[i]
)

Erläuterung

Dieses Programm weist implizit die ersten und zweiten Eingabezeilen als Strings auf die Variablen aund bjeweils.

Jedes Zeichen cin der Zeile bwird durch den jeweiligen Index ides in der Zeile gefundenen Zeichens aoder durch sich selbst ersetzt, wenn es nicht gefunden wird.

Anschließend wird jede Sequenz von einer oder mehreren 0Zeichenfolgen, denen eine Grenze vorangestellt ist, aus der resultierenden Zeichenfolge entfernt. Dies soll verhindern, dass eval()eine Ziffernfolge, die mit 0einem oktalen Literal beginnt, ausgewertet wird .

Nach eval()und Math.round()wird das Ergebnis wieder in eine Zeichenfolge umgewandelt, und jedes Ziffernzeichen iwird durch das entsprechende Zeichen aus ader Indexzeile ersetzt i.

Testfälle

Demo

abcdefghij
abcd + efg + hij

bdgi

Demo

abcdefghij
abc + def - ghij

-gedc

Demo

qwertyuiop
qwerty / uiop

e

Demo

%y83l;[=9|
(83l * 9) + 8%

y9|8

2

Perl 5 -p , 63 Bytes

$p=<>;eval"y/$p/0-9/";s/\b0+\B//g;$_=int.5+eval;eval"y/0-9/$p/"

Probieren Sie es online!

Übernimmt den Ausdruck in der ersten Eingabezeile und die Übersetzungsliste in der zweiten.


1

Perl 5 , 130 Bytes

sub f{eval sprintf"'%.0f'=~y/%s/%s/r",eval(eval(sprintf"\$_[1]=~y/%s/%s/r",@r=map"\Q$_",$_[0],'0123456789')=~s,\b0,,gr),reverse@r}

Probieren Sie es online!

Vielleicht kann dieses Double-Eval in etwas verwandelt werden s/.../.../geer.


1

Holzkohle , 14 Bytes

⍘UV⭆η⎇№θι⌕θιιθ

Probieren Sie es online! Link ist eine ausführliche Version des Codes. Hinweis: Der Ausdruck wird gemäß der Python 3-Semantik ausgewertet, sodass beispielsweise führende Nullen bei Zahlen ungleich Null unzulässig sind. Erläuterung:

   ⭆η           Map over expression's characters and join
        ι       Current character
      №θ        Count matches in first input
     ⎇          If non-zero
         ⌕θι    Replace with position in first input
            ι   Otherwise keep character unchanged
 UV             Evaluate as Python 3
⍘            θ  Convert to base using first input as digits

Leider 0funktionieren führende s nicht in Python, was in den Testfällen vorhanden ist.
Jonathan Allan

0

Python 3 , 137 Bytes

Ein nicht regulärer Ansatz, bei dem die Zeichen durch str.translateund str.maketransersetzt werden. Ich habe viele Zeichen verloren, als ich die führenden Nullen abgeschnitten habe ...

lambda s,t,d='0123456789',e=str.translate,m=str.maketrans:e(str(round(eval(' '.join(c.lstrip('0')for c in e(t,m(s,d)).split())))),m(d,s))

Probieren Sie es online!



0

Wolfram Language (Mathematica) , 121 Byte

Ich definiere eine reine Funktion mit zwei Argumenten. Da einige Funktionen wiederholt werden, speichere ich sie in einer Variablen, um einige Zeichen zu speichern. Dieser Code ersetzt einfach einige Zeichenfolgen und ToExpressionwertet dann den Ausdruck mit dem Wolfram-Kernel aus.

(r=Thread[StringPartition[#,1]->(t=ToString)/@Range[0,9]];u[(u=StringReplace)[#2,r]//ToExpression//Round//t,Reverse/@r])&

Probieren Sie es online!


0

Lua , 162 151 150 Bytes

  • -11 Bytes dank meiner Idee, loadanstelle vonfunction(...) end
  • -1 Byte durch Weglassen von Newline
l,p=...print(((math.ceil(load('return '..p:gsub('.',load'n=l:find(...,1,1)return n and n-1'))()-0.5)..''):gsub('%d',load'c=...+1 return l:sub(c,c)')))

Probieren Sie es online!

Nicht die kürzeste Sache auf der Welt (Lua zwingt Sie dazu, ziemlich scharf zu sein, besonders bei großen Stichwörtern), aber es hat Spaß gemacht, sie zu erstellen. Vollständiges Programm, das Eingaben als Argumente verwendet und das Ergebnis druckt.

Erläuterung

Einführung

l,p=...

Weisen Sie Variablen Werte aus Argumenten zu. Unser Wörterbuch ist lund Ausdruck ist p.

Der folgende Ausdruck ist ziemlich schwer zu verstehen, da er eine seltsame Ausführungsreihenfolge hat. Deshalb erkläre ich ihn Schritt für Schritt:

Umwandlung in normale Zahlen

p:gsub('.',
load'n=l:find(...,1,1)return n and n-1')

Ersetzen Sie die Ausdruckszeichenfolge: Nehmen Sie jedes Symbol und übergeben Sie es der Funktion ( loaderwies sich hier als kurzgeschlossen als normale Deklaration).

Die Funktion findet die Position des Vorkommens in der diktierten Zeichenfolge für das übergebene Symbol mit find. ...Dies ist das erste (und einzige) Argument, da wir uns in der Vaarg-Funktion befinden (jede beliebige loadist dies), die unser aktuelles Symbol ist. Die folgenden Argumente sind erforderlich, um findspezielle Symbole zu ignorieren (dies 1ist nur ein kurzer Wert, der als trueboolescher Wert ausgewertet wird ): Startposition (hier ist eine Standardeinstellung) und plaindie tatsächliche Deaktivierung der Musterbehandlung. Ohne diese Programme scheitert der dritte Testfall an %der Besonderheit.

Wenn eine Übereinstimmung gefunden wird, subtrahieren Sie eine, da Lua-Zeichenfolgen (und auch Arrays) auf 1 basieren. Wenn keine Übereinstimmung gefunden wird, wird nichts zurückgegeben, was dazu führt, dass kein Ersatz erfolgt.

Lösen

math.ceil(load('return '..ABOVE)()-0.5)

Stellen Sie returnunseren Ausdruck vor, damit er das Ergebnis zurückgibt , berechnen Sie ihn, indem Sie ihn als Lua-Funktion kompilieren und aufrufen, und runden Sie ihn ( dies wurde umgekehrt, um ihn kürzer zu machen).

Am Ende erhalten wir eine numerische Lösung für unser Problem, nur die Rückkonvertierung bleibt erhalten.

Mach es wieder verrückt

(ABOVE..'')
:gsub('%d',load'c=...+1 return l:sub(c,c)')

Die erste Zeile ist ein kurzer Weg, um eine Zahl in einen String umzuwandeln. Jetzt können wir String-Methoden auf kurze Weise aufrufen. Lass es uns tun!

Jetzt gsubwird nochmal gerufen, alles wieder auf Wahnsinn zu setzen. Diese Zeit %dwird anstelle eines .Ersatzmusters verwendet, da unsere Funktion möglicherweise nur Zahlen verarbeiten muss ( .was zu Fehlern bei negativen Zahlen führen würde). Diese Zeitfunktion ( loaderneut 1bearbeitet, um Bytes zu speichern) fügt zuerst ihr erstes (und einziges) Vaargument hinzu, konvertiert es in eine Position in einer diktierten Zeichenfolge und gibt dann an dieser Position ein Zeichen aus.

Hurra, fast da!

Dramatisches Finale oder Warum Brackets wichtig sind

print((ABOVE))

Nun, warum eigentlich zwei Paar Klammern? Es ist Zeit, über Parallelen zu sprechen ... wie, mehrfache Rückkehr in Lua. Eine Funktion kann nur wenige Werte von einem Aufruf zurückgeben ( weitere Beispiele finden Sie in dieser Meta-Frage ).

Hier wurden zuletzt gsubzwei Werte zurückgegeben: die Antwortzeichenfolge, die wir benötigen, und die Anzahl der durchgeführten Ersetzungen (Anzahl der Stellen tatsächlich, aber wen interessiert das?). Wenn es kein internes Paar gäbe, würden sowohl die Zeichenfolge als auch die Nummer gedruckt, was uns fertig macht. Also opfern wir hier zwei Bytes, um das zweite Ergebnis wegzulassen und schließlich das Produkt dieser Wahnsinnsfabrik zu drucken.


Nun, ich habe es genossen, fast so viel zu erklären wie das Golfen an erster Stelle, ich hoffe, Sie haben verstanden, was hier los ist.


Hinweis: Es besteht alle Testfälle, rundet aber möglicherweise in anderen Fällen falsch. Wenn Sie einen finden können, werde ich ihn reparieren.
Val sagt Reinstate Monica
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.