Hintergrund:
Standardoperationsmathematik wie einfache Addition und Multiplikation in der realen Welt funktioniert folgendermaßen:
12 + 123 = 135
und
12 * 123 = 1476
Das ist nicht interessant und langweilig! Viele Schulen interpretieren dies bereits als Üben, Üben, Üben formaler Algorithmen. Dies impliziert eine ziemlich starre und langweilige mathematische Diät und ist nicht das, was in dieser Herausforderung beabsichtigt ist. Machen Sie sich bereit, um Spaß auf unserer geliebten Seite zu haben.
Betrachten Sie den Vorgang des Addierens zweier positiver ganzzahliger Zahlen und fügen Sie dann alle Ziffern des Ergebnisses erneut hinzu. Wiederholen Sie den Vorgang mit der Addition, bis nur noch eine Ziffer erhalten wird. Zum Beispiel:
- Das Ergebnis von
12 + 123
ist 135. - Addiert man alle Ziffern von 135, so erhält man
1 + 3 + 5 = 9
.
Die Anzahl der Schritte, die erforderlich sind, um bei dieser wiederholten Addition einen einstelligen Wert 9 zu erhalten, beträgt 2.
Wie beim vorherigen Additionsvorgang folgt die Multiplikation zweier positiver ganzzahliger Zahlen demselben Vorgang. Multiplizieren Sie alle Ziffern des Ergebnisses und wiederholen Sie diesen Vorgang, bis nur noch eine einzige Ziffer übrig bleibt. Nehmen Sie das obige Beispiel:
- Das Ergebnis von
12 * 123
ist 1476. - Multiplizieren Sie alle Ziffern von 1476, die wir erhalten
1 * 4 * 7 * 6 = 168
. - Multiplizieren Sie erneut alle Ziffern von 168, die wir erhalten
1 * 6 * 8 = 48
. - Multiplizieren Sie noch einmal alle 48 Stellen, die wir erhalten
4 * 8 = 32
. - Multiplizieren Sie noch einmal alle Ziffern von 32, die wir erhalten
3 * 2 = 6
.
Die Anzahl der Schritte, die erforderlich sind, um bei dieser wiederholten Multiplikation einen einstelligen Wert 6 zu erhalten, beträgt 5.
Um dieser Herausforderung willen und um einen Missbrauch von mathematischen Notationen zu vermeiden, füge ich diese beiden Dummy-Notationen ein: (+)
und (*)
, aber Sie können jede beliebige Notation verwenden , die wie folgt funktioniert:
- Die Operation des wiederholten Additionsprozesses, um einen einzelnen Wert zu erhalten, ist
12 (+) 123 = 9
. - Die Operation des wiederholten Multiplikationsprozesses, um einen einzelnen Wert zu erhalten, ist
12 (*) 123 = 6
.
Herausforderung:
Die Herausforderung besteht darin, entweder ein Programm oder eine Funktion zu schreiben, die beide im Abschnitt "Hintergrund" erläuterten Operationen ausführen kann : (+)
und (*)
.
Eingang:
Die Eingänge des Programms oder der Funktion sind zwei positive ganze Zahlen und eine Operation entweder (+)
und (*)
. Das Format der Eingabe ist eine willkürliche Wahl des Programmierers . Sie können die Eingabeformat zum Beispiel a (+) b
oder F(a, (+), b)
oder ein beliebiges Format Sie wünschen.
Ausgabe:
Die Ausgabe des Programms oder der Funktion muss das Ergebnis der Operation und die Anzahl der erforderlichen Schritte im Freestyle-Format enthalten.
Testfälle (ignorieren Sie das Eingabe- und Ausgabeformat):
81 (+) 31 --> (4 ; 2)
351 (+) 14568 --> (6 ; 3)
21 (*) 111 --> (8 ; 3)
136 (*) 2356 --> (0 ; 2)
Allgemeine Regeln:
- Das ist Code-Golf , also gewinnt die kürzeste Antwort in Bytes die Herausforderung.
Lassen Sie sich nicht von Esolangs davon abhalten, eine Antwort in regulären Sprachen zu veröffentlichen. Genießen Sie diese Herausforderung, indem Sie mit Ihrer Programmiersprache eine möglichst kurze Antwort geben. Wenn Sie eine clevere Antwort und eine klare Erklärung abgeben, wird Ihre Antwort geschätzt (daher die positiven Stimmen), unabhängig davon, welche Programmiersprache Sie verwenden. - Für Ihre Antwort gelten Standardregeln. Daher dürfen Sie STDIN / STDOUT, Funktionen / Methoden mit den richtigen Parametern, vollständige Programme usw. verwenden. Sie haben die Wahl.
- Wenn möglich, kann Ihr Programm große Zahlen richtig verarbeiten. Wenn nicht, ist das in Ordnung.
quelle
Antworten:
Dyalog APL ,
33323029 BytesDies erweitert APL um die Präfixnotation
+/A n₁ n₂
und×/A n₁ n₂
. (Tatsächlich können Sie eine beliebige Operation links von der/A
. Verwenden .) Gibt eine Liste mit {Ergebnis, Wiederholungsanzahl} zurück.TryAPL online! (
⍎
Wurdee
aus Sicherheitsgründen mit emuliert .)Vielen Dank an @ngn für das Speichern eines Bytes.
0 Bytes (im Scherz)
Dyalog APL unterstützt Anastasiyan bereits vollständig. statt
(+)
und(×)
verwendet es+{n←0⋄n,⍺⍺{n+←1⋄⍺⍺/⍎¨⍕⍵}⍣=⍵⍺⍺⍨⍺}
und×{n←0⋄n,⍺⍺{n+←1⋄⍺⍺/⍎¨⍕⍵}⍣=⍵⍺⍺⍨⍺}
.Versuchen Sie
81 +{(⊃,≢)⍺⍺{∪⍵,⍨⍺⍺e¨⍕⊃⍵}⍣≡⍺⍺/⍺⍵} 31
und21 ×{n←0⋄n,⍺⍺{n+←1⋄⍺⍺/e¨⍕⍵}⍣=⍵⍺⍺⍨⍺} 111
.quelle
⎕FR←1287
(dh IEEE 754-2008 128-Bit - Dezimalzahl verwendet F loating Punkt R ePresentation) und⎕PP←34
(dh Einsatz 34 Zeichen P RINT P recision), können Sie unter ganzen Zahlen 10³⁴ verwenden.+{n←0⋄n,⍺⍺{n+←1⋄⍺⍺/⍎¨⍕⍵}⍣=⍵⍺⍺⍨⍺}
und×{n←0⋄n,⍺⍺{n+←1⋄⍺⍺/⍎¨⍕⍵}⍣=⍵⍺⍺⍨⍺}
immer noch einige Bytes? Ich bin verwirrt darüber, wie das 0 Bytes ist ..: S(+)
das Anastasiyan. Dyalog APL unterstützt Anastasiyan-Mathematik, verwendet jedoch ein anderes Mehrzeichen-Glyphen, genau wie es*
die Potenz bedeutet und Sie×
für die Multiplikation benötigen , während es/
Replikation bedeutet und Sie÷
für die Division benötigen .(+)
Sie+{n←0⋄n,⍺⍺{n+←1⋄⍺⍺/⍎¨⍕⍵}⍣=⍵⍺⍺⍨⍺}
als Eingabe haben, aber da OP in der Tat angegeben hat, dass jedes Eingabeformat ausreicht, können Sie die Funktion als Parameter verwenden. Hmm, ich frage mich, ob dies auch in anderen Programmiersprachen möglich ist, die Funktionen als Eingabe unterstützen.Haskell, 108 Bytes
Definiert die Funktion ,
#
die zuerst kommta
undb
dann den Bedienero
. Unterhaltsame Tatsache: Dies funktioniert mit jedem Operator (eigentlich jeder Funktion), den Sie wollen!quelle
Integer
Typ unbegrenzt ist.Pyke, 16 Bytes
Probieren Sie es hier aus!
Nimmt multiplizieren als
B
und addieren alss
. Die beiden numerischen Eingaben sind durch Kommas getrennt.quelle
JavaScript (ES6), 59
Rekursive Funktion, das Eingabeformat ist so angepasst, dass der rekursive Aufruf vereinfacht wird:
Prüfung
quelle
Python 2, 60 Bytes
Die Eingabe ist wie eine Zeichenfolge
81+31
, die Ausgabe ist ein Tupel einer Singleton-Zeichenfolge und eines Zählers (z('4', 2)
. B..Teste es auf Ideone .
quelle
f(['81', '31'],'+')
ein weiteres Byte gespeichert werden, aber das fühlt sich an, als würden die Regeln ein bisschen zu weitoperator.add
oder nichtoperator.mul
;)Pyth, 16
Übernimmt Eingaben wie
"+ 123 12"
zum Addieren und"* 123 12"
zum Multiplizieren. Ausgänge mögenresult<linefeed>steps
.Probieren Sie es hier aus oder führen Sie eine Testsuite aus . Beachten Sie jedoch, dass dies von eval abhängt, sodass im Online-Interpreter nur die Additionsvariante funktioniert. Die Multiplikation funktioniert ordnungsgemäß mit dem Offline-Interpreter.
Dies verwendet die kumulative Reduktionsfunktion, um eine Liste von Zwischenergebnissen zu erstellen, damit
"+ 351 14568"
wir erhalten[14919, 24, 6]
. Dies funktioniert, weil einstellige Zahlen ein fester Punkt bei der Addition und Multiplikation von Anastasiya sind. Dann erhalten wir nur das letzte Element des Arrays sowie die Länge des Arrays.Dies funktioniert für beliebig große Zahlen, zumindest bis Ihnen der Speicher ausgeht.
quelle
R,
175167164140134127126119 BytesUngolfed:
ifelse
ist zurück ! Ja!Nein
Verwendungszweck :
Vielen Dank an @plannapus für die 24 Bytes!
-7 Bytes dank einer guten Idee von @Vlo !
quelle
strtoi
! 4 weitere Bytes hast du mir geschlagen.05AB1E ,
2015 BytesErläuterung
Operator ist 1 für Addition, 0 für Multiplikation.
Probieren Sie es online aus
quelle
Jelly ,
11 bis10 BytesDie Eingabe ist ein Zahlenpaar und entweder
+
oder×
.Probieren Sie es online! oder überprüfen Sie alle Testfälle .
Wie es funktioniert
quelle
ARM-Maschinencode, 48 Byte
Hex-Dump:
Diese Funktion hängt nicht von Systemaufrufen oder Bibliotheksfunktionen ab. Dies ist der Thumb-2-Code, bei dem es sich um eine Befehlscodierung variabler Länge (2 oder 4 Byte) für 32-Bit-ARM handelt. Der maximale Wert, den es verarbeiten kann, ist 2 ^ 32-1. Es könnten 2 Bytes gelöscht werden, wenn es nicht dem AAPCS ( 46 Bytes ) entspricht, da wir zu Beginn keine Register stapeln müssten.
Ungolfed-Assembly (GNU-Syntax):
Testskript in C:
quelle
R,
130124 ZeichenEin etwas anderer Ansatz als bei @ Frédéric :
Eingerückt, mit Zeilenumbrüchen:
Zeile 4 benötigt wahrscheinlich weitere Erklärungen:
Testfälle:
quelle
f
den Funktionsnamen und eines seiner Argumente :)Oktave, 85 Bytes
MATLAB, 123, 114, 105, 94 BytesBeschlossen, dies in Octace zu übersetzen, um die direkte Indizierung zu nutzen und die Fähigkeiten zu erhöhen. Übernimmt die Eingabe in das Formular:,
f(a,operator)
wherea = [number1, number2]
, undoperator==1
gibt das Produkt undoperator==2
die Summe an.Erklärungen:
g={@prod,@sum}{o}
: Wählt die entsprechende Funktion, das Produkt oder die Summe aus und weist sie zug
x=g(a)
Nimmt die Summe oder das Produkt der Eingabeni=1; ... i++
: Inkrementierer zum Zählen der Anzahl der SchritteZwei Zeilenumbrüche, ein Leerzeichen, wurden entfernt und beide Eingabenummern in einem Vektor anstelle von separaten Argumenten platziert. Dies sparte dank pajonk 9 Bytes! Entfernt
k=@(x)...
, um dank Becher weitere 11 Bytes zu speichern =) Zum Schluss haben wir das Ganze in Octave übersetzt, um weitere 9 Bytes zu speichern ...quelle
Java,
164159146 BytesDas erste Argument ist nur der Zähler, immer 0
Das zweite Argument ist die Methode 0 für ADD und 1 für MULTIPLY.
Das dritte Argument ist ein Array von Strings, das die zu addierenden / multiplizierenden Werte enthält.
Ungolfed
danke an @Kevin Cruijssen für das Schneiden einiger Bytes.
danke an @milk für das rasieren von 5 bytes.
Testprogramm
quelle
m==0
kann seinm<1
, undInteger.parseInt
kann seinInteger.decode
.j
var am Ende? Zweimaliges Inlining(r+"")
scheint ein paar Bytes zu sparen.Gelee , 17 Bytes
Probieren Sie es online!
Bei solchen Argumenten
x y 1
wird die Anastasiya-Summe berechnetx (+) y
.Mit solchen Argumenten
x y 0
wird das Anastasiya-Produkt berechnetx (*) y
.Die Ausgabe erfolgt als
[number of steps, result]
.quelle
Python,
160146129 BytesWerde bald eine Erklärung posten.
Die Eingabe erfolgt in der Form
12+12
oder5*35
(mit Normalen+
und*
Vorzeichen) und setzt voraus, dass dies die einzigen beiden Operatoren sind.Es kann Zahleneingaben verarbeiten, die so groß sind, wie es der Arbeitsspeicher Ihres Computers zulässt.
Ich bin fast sicher, dass dies weiter gehen kann.
EDIT:
1631 Bytes dank @Copper gespeichert.quelle
"+" if "+" in s else "*"
zu"*+"["+"in s]
, und dann , anstatt es die Zuordnung zut
, fügen Sie ihn einfach inline imexec
Aufruf.R, 110 Bytes
Verwendung des Splitters von @plannapus.
function(A,F,B){r=Reduce;x=r(F,A,B);y=1;while(x>9){m=nchar(x);x=r(F,x%%10^(1:m)%/%10^(1:m-1));y=y+1};cat(x,y)}
Ausgabe
edit: Ich kann nicht zählen.
quelle
Clojure 126 Bytes
Funktion heißt so:
Hier ist der Code ungolfed:
Denken Sie daran, dass Clojure für mich noch neu ist. Dies ist wahrscheinlich nicht die beste Lösung. Die Herausforderung hat trotzdem Spaß gemacht. Außerdem lief der Code problemlos mit sehr großen Zahlen.
quelle
Perl 6 53 Bytes
Da
( 12, &[+], 123 )
die Eingabe akzeptabel ist, kann ich sie auf 53 Byte reduzieren.(
&[+]
ist eine Abkürzung für&infix:<+>
"Verehrung" für den numerischen Infix-Additionsoperator)Wenn das zweite Argument eine Zeichenfolge
(+)
sein müsste, wären es 87 ByteErläuterung:
Prüfung:
Normale Nutzung:
quelle
Python 2,
10797 BytesEine anonyme Funktion, die Eingaben über ein Argument eines ersten Operanden
a
, eines Operatorso
('+'
oder'*'
) und eines zweiten Operanden entgegennimmtb
und eine Liste des Formulars zurückgibt[result, steps]
.Wie es funktioniert
Die anonyme Funktion erstellt eine Zeichenfolge, indem die Operanden mit dem Operator dazwischen verkettet und dann ausgewertet werden. Dies ist der erste in der Frage beschriebene Schritt. Dieser Wert und der Operator werden dann an die rekursive Funktion übergeben
g
. Hier wird ein Zähler verwendeti
, der für jeden rekursiven Aufruf inkrementiert wird. Ist die Eingabe kleiner als10
, muss eine einzelne Ziffer erreicht worden sein, damit diese undi
zurückgegeben werden. Ist dies nicht der Fall, wird die Eingabe in eine Zeichenfolge konvertiert und jedes Zeichen in dieser Zeichenfolge wird mit dem Operator verknüpft. Dabei wird die gewünschte Berechnung angegeben, die dann ausgewertet und rekursiv an die Funktion übergeben wird.Probieren Sie es auf Ideone
quelle
Groovy, 102 Bytes
Entgolft
Erläuterung
Basiert auf der exzellenten Lösung von @Sean Bean für Java.
p
: Der Verschluss (Funktion, Lambda, was auch immer), der die Lösung implementiertt
: Die aktuelle Aufruftiefe (Anzahl der Iterationen)p
sollte immer mit aufgerufen werdent=1
m
: Die auszuführende Operation0
für "Addieren" und1
"Multiplizieren"d
: Die Liste der Operanden, jeder Operand ist ein String-Objekte
: Die Elemente vond
werden jeweils in eine Ganzzahl umgewandeltr
: Die Summe oder das Produkt vone
, abhängig von der Operationm
r > 9
:r > 9
Zeichen ( ) wird erneut aufgerufen, die Tiefe erhöhtt
undr
in eine Liste von Zeichenfolgen konvertiert (und das Ergebnis zurückgegeben).r
undt
als Liste zurück.Testprogramm
Ergebnisse
quelle
Haskell,
76-70BytesGibt eine Liste mit zwei Elementen mit dem Ergebnis und der Anzahl der Schritte zurück. Funktioniert für beliebige große Zahlen. Anwendungsbeispiel:
(351#14568)(+)
->[6,3]
.Edit: Danke an @BlackCap für 6 Bytes.
quelle
(-48+).fromEnum
mitread.pure
R, 91 Bytes
Unter Verwendung des @ Vlo-Codes, der den @ plannapus-Splitter verwendet, und einiger Ideen, die ich beim Golfen mit @ Frédérics Antwort generiert habe, ist dies die bisher kürzeste R-Antwort. (Eine ungewöhnlich große Anzahl von R-Antworten hier heute ...)
Entscheidend ist, dass die Eingabe für den Operator entweder
sum
für (+) oderprod
für (*) ist. Nach den Regeln der Herausforderung scheint dies in Ordnung zu sein.Mit Einrückung:
Die Hauptunterschiede zu @ Vlos Antwort sind:
Reduce
, verlassen wir uns darauf, dass das Eingabeargument eine Funktion ist, und rufen es einfach explizit auf. (Yay für Funktionen als erstklassige Objekte!)T
, die zuTRUE
(aka1
) ausgewertet werden. Da es sich jedoch nicht um eine reservierte Variable handelt, können wir sie ändern. SoT+T
ist es2
. Also benutzen wir das als unsere Theke.cat
die Ausgabe zurückzugeben, geben wir sie einfach als Vektor mit zurückc
. Die Tatsache, dass die Ausgabe in einen Vektor gezwungen wird, spart nicht nur zwei Bytes, sondern stellt auch sicher, dass die AusgabeT
von Klasse istnumeric
. Wenn wir verwendencat
undT
nicht inkrementiert wurden, erhalten wir eine fehlerhafte Ausgabe wie1 TRUE
.quelle
while
Schleife wie folgt zu ändern ,F
etwas anderes zu vermeiden Namenskonflikte sein:function(A,O,B){x=O(A,B);while({F=F+1;x>9})x=O(x%/%10^(1:nchar(x)-1)%%10;c(x,F)}}
. Es ist erstaunlich, wie viele R-Golf-Tricks wir uns in den letzten Jahren ausgedacht haben :)T
undF
counter in einer Funktion tatsächlich ungültig ist, da die Funktion nur einmal aufgerufen werden kann. Diese Antwort (und einige meiner anderen!) Ist ungültig, es sei denn,rm(T)
am Ende steht eine explizite . Ich werde weiter nach diesem Meta-Post suchen, damit ich sicher sein kann, dass ich es mir nicht nur ausgedacht habe.T
und-F
Trick vollkommen gültig ist, solange Sie nichts ändernT
oderF
in der globalen Umgebung.f=function(){T=T+1;T}
kehrt zum Beispiel konsequent zurück2
. Ich denke, das ist der Meta-Post, auf den Sie verweisen.Ruby, 55 Bytes
Rekursiver Aufruf. Früher war es ein großer Unterschied zur JavaScript-Antwort von @ edc65, aber als ich sie optimierte, wurde sie schließlich zu einem direkten Port, der fast unabhängig von ihrer Antwort entwickelt wurde , was mir erlaubte, ihre Byteanzahl zu übertreffen.
Die Eingabe ist eine Zeichenfolge, die den Operator darstellt, und ein Array, das die Operanden enthält.
Probieren Sie es online aus.
quelle
i=0
und ich vergaß es irgendwie, als ich umgestaltete.Perl, 38 Bytes
Beinhaltet +2 für
-ap
Führen Sie mit der Eingabe von STDIN und Leerzeichen um den Operator Folgendes aus:
Die Ausgabe erfolgt durch Ziffern und Schritte getrennt
+A
amath.pl
:Wenn die Ausgabe der Schritte in Unary in Ordnung ist, funktioniert diese 35-Byte-Version besser:
quelle
Mathematica,
10594 BytesCode.
Verwendungszweck.
Erläuterung.
Die beiden Funktionen
x
(für (+)) undy
(für (*)) werden gleichzeitig durch Ersetzen der Parameterf
undo
in erstelltmit ihren entsprechenden Werten. Denn
x
,f
wird#1 + #2
undo
wirdPlus
; denny
sie werden#1 #2
undTimes
. Umschreiben der Funktionx
für den letzten Teil der Erklärung:quelle
Java 7,
203195192 BytesEs verwendet
long
(maximaler Wert von 2 63 -1). Wenn esint
stattdessen verwenden würde (Maximalwert von 2 31 -1), wäre es nur 1 Byte weniger ( 191 Bytes ):Es kann höchstwahrscheinlich ein bisschen mehr golfen werden. Das Drucken der Schritte sowie der Antwort für beide Operatoren erfordert jedoch einige Bytes.
Verwendet 0 (für
(+)
) und 1 (für(*)
).Ungolfed & Testcode:
Probieren Sie es hier aus.
Ausgabe:
quelle