Das letzte Mal, als ich versuchte, etwas Einfaches zu finden, das kein Duplikat war, war es viel zu schwer. Hoffentlich können es diesmal auch Neulinge versuchen.
Eingang:
Ein Array / eine Liste mit Ganzzahlen / Dezimalzahlen. (Oder eine Zeichenfolge, die ein Array mit Ganzzahlen / Dezimalzahlen darstellt.)
Ausgabe:
Durchlaufen Sie die Zahlen und wenden Sie die folgenden fünf mathematischen Operanden in dieser Reihenfolge an:
- Zusatz (
+
); - Subtraktion (
−
); - Multiplikation (
*
oder×
oder·
); - Real / Calculator Division (
/
oder÷
); - Potenzierung (
^
oder**
).
(HINWEIS: Die Symbole in Klammern werden nur zur Verdeutlichung hinzugefügt. Wenn Ihre Programmiersprache für die mathematische Operation ein völlig anderes Symbol als die Beispiele verwendet, ist dies natürlich völlig akzeptabel.)
Fahren Sie fort, bis Sie das Ende der Liste erreicht haben, und geben Sie dann das Ergebnis der Summe an.
Herausforderungsregeln:
- Die Potenzierung um 0 (
n ^ 0
) sollte zu 1 führen (dies gilt auch für0 ^ 0 = 1
). - Es gibt keine Testfälle für die Division durch 0 (
n / 0
), sodass Sie sich nicht um diesen Randfall kümmern müssen. - Wenn das Array nur eine einzelne Zahl enthält, geben wir dies als Ergebnis zurück.
Allgemeine Regeln:
- Das ist Code-Golf , also gewinnt die kürzeste Antwort in Bytes.
Lassen Sie sich von Code-Golf-Sprachen nicht davon abhalten, Antworten mit Nicht-Codegolf-Sprachen zu veröffentlichen. Versuchen Sie, für jede Programmiersprache eine möglichst kurze Antwort zu finden. - Für Ihre Antwort gelten Standardregeln. Daher dürfen Sie STDIN / STDOUT, Funktionen / Methode mit den richtigen Parametern und vollständige Programme verwenden. Ihr Anruf.
- Standardlücken sind verboten.
- Fügen Sie nach Möglichkeit einen Link mit einem Test für Ihren Code hinzu.
Testfälle:
[1,2,3,4,5] -> 0
-> 1 + 2 = 3
-> 3 - 3 = 0
-> 0 * 4 = 0
-> 0 / 5 = 0
[5,12,23,2,4,4,2,6,7] -> 539
-> 5 + 12 = 17
-> 17 - 23 = -6
-> -6 * 2 = -12
-> -12 / 4 = -3
-> -3 ^ 4 = 81
-> 81 + 2 = 83
-> 83 - 6 = 77
-> 77 * 7 -> 539
[-8,50,3,3,-123,4,17,99,13] -> -1055.356...
-> -8 + 50 = 42
-> 42 - 3 = 39
-> 39 * 3 = 117
-> 117 / -123 = -0.9512...
-> -0.9512... ^ 4 = 0.818...
-> 0.818... + 17 = 17.818...
-> 17.818... - 99 -> -81.181...
-> -81.181... * 13 = -1055.356...
[2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2] -> 256
-> 2 + 2 = 4
-> 4 - 2 = 2
-> 2 * 2 = 4
-> 4 / 2 = 2
-> 2 ^ 2 = 4
-> 4 + 2 = 6
-> 6 - 2 = 4
-> 4 * 2 = 8
-> 8 / 2 = 4
-> 4 ^ 2 = 16
-> 16 + 2 = 18
-> 18 - 2 = 16
-> 16 * 2 = 32
-> 32 / 2 = 16
-> 16 ^ 2 = 256
[1,0,1,0,1,0] -> 1
-> 1 + 0 = 1
-> 1 - 1 = 0
-> 0 * 0 = 0
-> 0 / 1 = 0
-> 0 ^ 0 = 1
[-9,-8,-1] -> -16
-> -9 + -8 = -17
-> -17 - -1 = -16
[0,-3] -> -3
-> 0 + -3 = -3
[-99] -> -99
quelle
n ^ 0 = 1
aber0 ^ n = 0
. Der Konflikt wird gelöst, indemn != 0
für beide Regeln Einstellungen vorgenommen werden, die jedoch0 ^ 0
undefiniert bleiben. Es gibt jedoch eine Menge Dinge, die in der Mathematik gut zusammenpassen, wenn dies0 ^ 0
so definiert ist1
. Siehe Wikipedia für einige Details.Antworten:
Gelee , 13 Bytes
Probieren Sie es online! oder überprüfen Sie alle Testfälle .
Wie es funktioniert
quelle
Javascript ES7 49 Bytes
9 Bytes dank Dom Hastings gespeichert, weitere 6 dank Leaky Nun
Verwendet den neuen Exponentiationsoperator.
quelle
Infinity
, kein Fehler?Haskell,
76656462 BytesDanke an @Damien für das Entfernen weiterer zwei Bytes =)
Dies nutzt das
>>
was hier einfach mal die Liste[(+),...]
an sich anhängtlength v
. Der Rest funktioniert noch genauso wie die alten Versionen.Alte Versionen:
Diese Lösungen verwenden die unendlichen Listen, da
cycle[...]
nur die angegebene Liste unendlich oft wiederholt wird. Dann wird es im Grunde genommenzip
mit der Liste der Zahlen bearbeitet, und wir reduzieren die gezippte Liste nurfold
( in anderen Sprachen) über ein Lambda, das die Operatoren auf das Akkumulator- / aktuelle Listenelement anwendet.quelle
foldl(&)u$zipWith(&)v(flip<$>v>>[…])
?import
für&
, das wäre also wieder länger, aber trotzdem danke!uncurry
. Hat nicht geklappt, aber mir ist aufgefallen, dass Sie in der Lage sein sollten, ein weiteres Byte zu speichern, indem Sie$
anstelle von Klammern verwenden.Pyke,
2221 BytesProbieren Sie es hier aus!
quelle
Haskell, 61 Bytes
Erstellt eine Reihe von Transformationen in einer Liste, wie in [Addiere 1, Addiere 2, Subtrahiere 3, ...], beginnend mit 2 Additionen, da wir mit 0 in der Falte beginnen. Als nächstes machen wir das, was ich List Application Fold nenne, oder foldl (Flip-ID), das eine Liste von Homomorphismen in Reihe anwendet. Dies beginnt mit Null, addiert den Anfangswert und führt dann alle oben berechneten Transformationen durch, um ein Endergebnis zu erhalten.
Beachten Sie, dass (Flip-ID) dasselbe ist wie (\ x y-> yx), nur kürzer.
Beispielnutzung:
quelle
flip id
könnten Sie einfach verwenden&
. Oderflip($)
. Wow, ich habe es nie($) = id
&
ist in definiertData.Function
, also brauchst du dasimport
auch. Möglicherweise importiert es ein Online-Interpreter standardmäßig, aber dann müssen Sie angeben, welchen Sie verwenden.TSQL
11611588 BytesDank des Vorschlags von Ross Presser konnte ich dies auf 88 Zeichen reduzieren
Probieren Sie es online aus
quelle
Pyth,
272625 BytesTestsuite.
Pyth verwendet die Präfixnotation:
1+2
wird geschrieben als+1 2
(Leerzeichen zum Trennen von Zahlen).Daher wäre für den ersten Testfall der Ausdruck
(((1+2)-3)*4)/5
, der in Präfixnotation geschrieben würde als/*-+ 1 2 3 4 5
.In Pyth ist float Division
c
statt/
, so wird esc*-+ 1 2 3 4 5
.In Pyth
-100
wird_100
stattdessen auch als geschrieben .Daher wird für den dritten Testfall, das ist
((((((((-8+50)-3)*3)/-123)^4)+17)-99)*13)
, wird es:*-+^c*-+ _8 50 3 3 _123 4 17 99 13
.Geschichte
v:P+*lQ\(ssV+R\)Q*"+-*/p"lQ\p"**"
.vs+_XUtQUQ"+-*c^"m:+;d\-\_
.vs+_XUtQUQ"+-*c^":jdQ\-\_
quelle
Eigentlich 23 Bytes
Probieren Sie es online!
Verwendet tatsächlich die Postfix-Notation für Mathematik, und Operatoren, die immer nur zwei Argumente verwenden (z. B. die Operatoren für Addition, Subtraktion, Multiplikation, Division und Exponentiation), tun nichts, wenn sich nur ein Element auf dem Stapel befindet. Das Umwandeln der Eingabe in tatsächlichen Code ist daher so einfach wie das Umkehren der Eingabe, das Formatieren als Zahlen und das Anhängen der Operationen. Dann kann der resultierende Code ausgeführt werden, was die gewünschte Ausgabe ergibt.
Erläuterung:
Beispiel für übersetzten Code zur Eingabe
1,2,3,4,5
:quelle
s/Actually uses postfix notation/Actually actually uses postfix notation/
Julia,
5350 BytesProbieren Sie es online!
quelle
J, 40 Bytes
Ermittelt die Anzahl der Werte, die zur Verwendung eines Vielfachen von 5 Operatoren erforderlich sind, als Pads mit den Identitätswerten dieser Operatoren. In der angegebenen Reihenfolge
+
ist 0,-
ist 0,*
ist 1,%
ist 1 und^
ist 1, was ein Bitwert00111
oder 7 in Basis 10 sein kann. Anschließend wird diese Liste bearbeitet, während die Operatoren durchlaufen werden.Verwendungszweck
Erläuterung
quelle
Python 2,
816764 BytesInput ist ein Array von Floats. Teste es auf Ideone .
Wie es funktioniert
'*+-*/*'[i::5]
Wählt jedes fünfte Zeichen der Zeichenfolge aus, beginnend mit dem Zeichen am Index i , sodass sich ergibt,**
wenn i = 0 ,+
wenn i = 1 ,-
wenn i = 2 ,*
wenn i = 3 und/
wenn i = 4 . Da der String die Länge 6 hat , ergibt der Ausdruck einen leeren String, wenn i> 5 ist .Wir initialisieren die Variable i auf 10 . Für jede Zahl n im Eingabearray konstruieren wir den String
r<op>=n
, derexec
ausgeführt wird.Anfangs ist i = 10 , also
<op>
die leere Zeichenfolge, und sie initialisiert r mitr+=n
. Nach jedem Schritt inkrementieren wir i modulo 5 miti=-~i%5
, sodass der nächste Schritt den richtigen Operator abruft.Wenn alle Eingabenummern verarbeitet wurden, drucken wir r , das die gewünschte Ausgabe enthält.
quelle
Matlab -
95 9185 Bytes / Oktave - 81 BytesDie Eingabe erfolgt in der folgenden Form:
a = ['1' '2' '3' '4' '5'];
Ich hoffe, dies wird durch "Zeichenfolge, die ein Array mit Ganzzahlen / Dezimalzahlen darstellt" abgedeckt, andernfalls werden zusätzlich 2 num2str benötigt.Jedes Zwischenergebnis wird an die Konsole ausgegeben, da ich dadurch einige Semikolons einsparen kann.
a(1)
wird ausgeführt, damit sein Wert in gespeichert wirdans
. Natürlich ist die Verwendungans
von Code auch eine schlechte Übung.In Octave
'+-*/^'(mod(i+2,5)+1)
funktioniert auch, was weitere 4 Bytes spart, danke Adám und Luis Mendo:Änderungsprotokoll:
quelle
b = '+-*/^'
nachb='+-*/^'
undfor i = 2:length(a)
nach golfenfor i=2:length(a)
(die Leerzeichen entfernen)? Vielleicht sind auch Tipps zum Golfen in MATLAB für Sie interessant. :)'+-*/^'(mod(i+2,5)+1)
gültig?Mathematica,
676665 BytesEinfach
Fold
mit einer Variablen,i
die den Index enthält.quelle
+##
anstatt#+#2
CJam, 18 Bytes
Input ist ein Array von Floats. Probieren Sie es online!
Wie es funktioniert
quelle
R ,
87 7870 BytesProbieren Sie es online!
quelle
do.call
... Ich sollte mich wahrscheinlich erst dann als R-Programmierer bezeichnen, wenn ich es tue!Advanced R
von Hadley Wickam ist ein großer Strand lesen :)do.call
- machte mir klar, dass ich gesucht hatteget
.Haskell - 74
Testfälle:
Es könnte wahrscheinlich kürzer sein; Die Unterstützung von Haskell für unendliche Listen und Funktionen höherer Ordnung macht die direkte Lösung jedoch recht angenehm. Eine Version von
^ :: Double -> Double -> Double
wäre schöner zum Golfen, aber ich konnte keine finden. Zum Glück brauchte ich kein volles Lambda, also hat der sinnlose Stil ein paar Bytes abgeschwächt.quelle
(+)
in die Liste der Operatoren und starten Sie dasfoldl
mit0
vollständig pointfree zu gehen und den Funktionsnamen und Parameter speichern:foldl(\x(o,y)->o x y)0.zip((+):cycle[(+),(-),(*),(/),(**)])
.PowerShell v2 +, 124 Byte
Lange, weil PowerShell keinen
^
oder**
-Operator hat, müssen wir einen separaten Fall berücksichtigen und einen .NET-Aufruf verwenden.Nimmt Eingaben
$n
als Array, setzt unsere Ausgabe$o
auf die erste Ziffer. Wir überprüfen dann.count
das Array und geben es ein, solange es größer als eins istif
. Ansonsten überspringen wir dieif
.Innerhalb der
if
Schleife durchlaufen wir das Array1..$y|%{...}
und setzen bei jeder Iteration$o
einen neuen Wert, das Ergebnis einer anderenif/else
Anweisung. Solange unser Zähler$i++
nicht modulo-5 gleich 4 ist (dh wir sind nicht am^
Operator), nehmen wir es einfach$o
und verketten es mit dem entsprechenden Symbol'+-*/'[$x]
und der nächsten Zahl im Eingabearray$n[$_]
. Wir leiten das aniex
(Alias fürInvoke-Expression
und ähnlich wieeval
) weiter, und das wird wieder in gespeichert$o
. Wenn wir in der^
Vermittlung sind, sind wir in derelse
, also führen wir einen[math]::Pow()
Anruf aus und dieses Ergebnis wird wieder in gespeichert$o
.In beiden Fällen geben wir einfach
$o
in die Pipeline aus und beenden sie, wobei die Ausgabe implizit erfolgt.quelle
Rust,
123, 117 BytesUrsprüngliche Antwort:
blöde lange methodennamen ^^ ahh viel besser
ungolfed
quelle
Perl 6 ,
70 68 6562 BytesErläuterung:
Technisch gesehen
* + *
ist dies ein beliebiges Lambda, aber es ist praktisch dasselbe,&[+]
das für&infix:<+>
die Unterroutinengruppe, die die numerische Addition von Infixen handhabt, kurz ist.Ich habe das nicht zur Multiplikation oder Potenzierung verwendet, da die Art und Weise, wie ich sie so schreibe, mindestens so lang ist wie das, was ich habe (
*×*
oder* * *
und* ** *
).Prüfung:
Teste es auf ideone.com
(nachdem ein Upgrade auf eine Rakudo- Version durchgeführt wurde, die nicht länger als eineinhalb Jahre vor der offiziellen Veröffentlichung der Perl 6- Spektakel liegt )
quelle
Python 3,
8893 BytesEs begann viel kürzer zu sein, aber dann besiegte mich die Operator-Priorität und ich musste viele Klammern einfügen ...
quelle
Oracle PL / SQL,
275254 BytesDie Daten müssen in eine Tabelle eingefügt werden, die
T
mit einer SpalteN
vom Typ aufgerufen wirdNUMBER
Verwendungszweck:
Ausgabe:
275 Bytes Version:
quelle
Java 8,
173172167138137118113 BytesErläuterung:
Probieren Sie es hier aus.
quelle
double r=a[0];
umdouble r=a[0],b;
einige Bytes zu speichern.float
, aber es gibt keineMath.pow
für Schwimmer, daher diedouble
statt. Danke für die,b
. Und miti++<a.length
bekomme ich eine ArrayOutOfBoundsException beib=a[i];
(es sei denn ich tuei++<a.length-1
stattdessen, das ist ein Byte länger statt kürzer).== 4
zu> 3
und== 0
zu wechseln< 1
. Ich bin mir nicht sicher, aber ich denke, Sie könnten ein bisschen sparen, indem Sie eine Variable für erstelleni % 5
.<x
Trick anwenden und die gesamte Funktion auf 137 Zeichen verkleinern.Ein paar Tricks können @ Willmores Ansatz um 23 bis 174 Bytes reduzieren (benötigt PHP 5.6 oder höher). Der sparsamste Teil ist das Entfernen nicht benötigter Klammern (-10 Byte).
Die Verwendung des
**
Operators anstelle vonpow()
ermöglicht jedoch auch die Verwendungeval
mit einem Array für die Operationen. und mit ein paar weiteren Tricks ...PHP> = 5,6, 82 Bytes
Nimmt die Liste von den Kommandozeilenparametern. Laufen Sie mit
php -nr '<code>'
oder versuchen Sie es online .alte Version,
161 157 151 145 144 140 137117 BytesAm effektivsten war es, das Zwischenergebnis direkt in das erste Element zu schreiben - nachdem das vorherige Ergebnis aus dem Array verschoben wurde.
Nervenzusammenbruch
Testsuite
quelle
If the array contains just a single number, we return that as the result.
ist ziemlich klar. Aber danke, dass ich das noch einmal überdenken durfte.PHP ,
135130 BytesDanke @titus, -5 Bytes, plus 0 Groß- / Kleinschreibung!
Probieren Sie es online!
Weniger golfen:
Wurde wirklich verwurzelt, damit array_reduce () dafür funktioniert, erfordert aber zu viele Zeichen, um den aktuell niedrigsten PHP-Score zu übertreffen.
Poste es trotzdem, falls jemand irgendwelche Vorschläge hat!
quelle
$c
trifft0
. Speichern Sie stattdessen zwei Bytes mit einer anonymen Funktionw
.eval('$c'.['/','**','+','-','*'][$i++?$i%5:5].'=$x');return$c;
ist sechs Bytes kürzer und sollte das Null-Problem beheben.Brachylog , 68 Bytes
Das ist lang ... aber es wird kein Bewertungsprädikat verwendet.
Erläuterung
Hauptprädikat
Prädikat 1
quelle
IBM PC 8087 FPU,
6682 BytesVerwendet nur den Intel 8087-Mathe-Coprozessor des IBM-PCs für Berechnungen.
Probieren Sie es offline! (in DOSBox oder was auch immer). Geben Sie Ihrem alten PC mit dem gelangweilten 8087-Chip etwas, das Sie tun können, abgesehen von all den Lotus 1-2-3-Tabellen, die Sie in den Achtzigern verwendet haben.
Ungolfed (nicht zusammengebaut):
Ausgabe:
Die Eingabe erfolgt über ein PROC (x86 entspricht am ehesten einer Funktion), wobei BX ein Zeiger auf ein Array von WORDs im Speicher ist und CX die Anzahl der darin enthaltenen Elemente ist und das Ergebnis in ST zurückgibt.
* Hinweis: Der tatsächliche Code für die Funktion lautet
6682 Bytes. Der Code zum Schreiben einer Gleitkommazahl auf die Konsole (Kochbuchcode) beträgt natürlich 83 Byte. Das Testprogramm und die Daten sind183215 Bytes, wodurch die .COM-Datei ausführbar wird305Insgesamt 380 Byte.quelle
APL (Dyalog Unicode) ,
2927 Bytes SBCSAnomyme implizite Präfixfunktion. Beachten Sie, dass dies
*
die Potenzierung in APL ist.Probieren Sie es online!
Da APL von rechts nach links ausgeführt wird, können wir einfach die Reihenfolge der Argumente der eingefügten Operationen umkehren und den gesamten Ausdruck umkehren. Postfix
⍨
kehrt Argumente um. Nachdem wir eine perfekte Mischung von Zahlen und Operationen durchgeführt haben, müssen wir nur noch Folgendes umkehren, reduzieren und auswerten:≢{
…}⊢
Rufen Sie die folgende Funktion mit Anzahl und tatsächlichen Zahlen als⍺
und auf⍵
:'⍨'
dieser Charakter'+-×÷*',¨
stellen Sie jedes dieser Zeichen davor;["+⍨","-⍨","×⍨","÷⍨","*⍨"]
⍺⍴
verwenden das linke Argument (Anzahl von Zahlen) , um zyklisch r eshape dass⌽
umkehren⍕
Format als flache Zeichenfolge3↓
Füge führende 3 Zeichen ein (ein Leerzeichen und ein Symbol und⍨
)⍎
Als APL-Code ausführenquelle
Japt , 16 Bytes
Probieren Sie es online!
Erläuterung:
quelle
c #,
238, 202 BytesIch habe keine c # -Lösung gesehen, daher werde ich eine geben. Dies ist mein erster Codegolf. Ich habe vor zwei Monaten angefangen, in c # zu schreiben (obwohl ich Java einigermaßen kenne).
Es benutzt Stack
Ungolfed und Testfälle
Ausgabe:
quelle
a, Double.Parse
->a,Double.Parse
;while (s.Count
->while(s.Count
;Pow(l, r)
->Pow(l,r)
). Außerdem können Sie entfernenint
vor demj=
und hinter dem setzenint i=0,j;
. Tolle erste Antwort und noch einmal willkommen. :)PHP,
206,198, 197 BytesUngolfed
In PHP ähnelt die Logik meiner c # -Antwort ( 202 Bytes ) :).
quelle