Eine Zahl ist ausgeglichen, wenn die Summe der Ziffern in jeder Hälfte der Zahl gleich ist, also: 1423
ausgeglichen, weil 1+4 = 2+3
, also: 42615
weil 4+2=1+5
. Beachten Sie, dass die mittlere Ziffer auf keiner Seite (oder auf beiden Seiten) enthalten ist, wenn die Anzahl der Ziffern ungerade ist.
Herausforderung:
Nehmen Sie eine positive ganze Zahl als Eingabe und geben Sie einen Wahrheitswert aus, wenn er ausgeglichen ist, und einen falschen Wert, wenn er nicht ausgeglichen ist.
Testfälle (wahr)
1
6
11
141
1221
23281453796004414
523428121656666655655556655656502809745249552466339089702361716477983610754966885128041975406005088
Testfälle (falsch)
10
12
110
15421
5234095123508321
6240911314399072459493765661191058613491863144152352262897351988250431140546660035648795316740212454
Es wird zum Beispiel keine Zahlen geben, die mit Null beginnen, 00032
anstatt 32
. Sie müssen Zahlen mit bis zu mindestens 100 Stellen unterstützen (also größer als 2^64-1
). Wie immer optionales Eingabeformat, sodass Sie die Zahl bei Bedarf mit Apostrophen umgeben können.
Ë
statt verwenden`Q
?Ë
war ein anderer Befehl als diese Herausforderung gemacht wurde, also leider nicht.> <> ,
3129 BytesProbieren Sie es online!
Zeile 1: Standard-Eingangsschleife
Zeile 2: Verwerfen Sie das -1 oben auf dem Stapel, drücken Sie zwei Nullen und drehen Sie eine bis zum Ende des Stapels (dies stellt sicher, dass Eingaben mit einer Länge von <3 den Stapel später im Programm nicht erschöpfen).
Zeile 3: Wenn die Länge des Stapels> 3 ist, addieren Sie die beiden oberen und unteren Elemente des Stapels.
Zeile 4: Wenn Ober- und Unterseite des Stapels gleich sind, wird ansonsten 1, 0 ausgegeben.
Edit: erkannte, dass es nicht nötig ist, die Zeichen mod 12 zu nehmen, 2 Bytes gespeichert
quelle
Haskell,
6463 BytesEin Byte gespart dank nimi
quelle
b(a:t@(r:s))=a-last t+b(init t);b _=0
Brachylog , 20 Bytes
Probieren Sie es online!
Erläuterung
quelle
Java, 85 Bytes
Hinweis: Die Eingabe wird angegeben,
String
da Java ohne sie nicht umgehen kannBigInteger
(undBigInteger
s mit einem ... erstellt werdenString
).Testen und ungolfed:
quelle
for (; i < l / 2;s += n.charAt(i) - n.charAt(l - ++i));
.Mathematica, 57 Bytes
Erläuterung
Ich hatte wirklich gehofft, dass ich diesen Ansatz in einer Sprache anwenden kann, und in Mathematica scheint er ziemlich gut zu funktionieren. Die Idee ist zu vermeiden, sowohl die vordere als auch die hintere Hälfte zu erhalten, indem die Liste mit ihrer Rückseite kombiniert wird und nur die vordere Hälfte betrachtet wird.
Zuerst wandeln wir die Eingabe in eine Liste von Dezimalstellen um und übergeben das Ergebnis an die unbenannte Funktion auf der linken Seite.
Nun subtrahieren wir die Umkehrung der Liste von der Liste selbst. Wenn die Ziffern sind, wird das Ergebnis sein .
{a1,a2,...,an}
{a1-an,a2-an-1,...,an-a1}
Wir extrahieren die erste Hälfte dieser Liste (ohne die mittlere Ziffer, obwohl das eigentlich keine Rolle spielt, da der entsprechende Unterschied
0
sowieso sein wird).Und dann fassen wir diese Liste zusammen. So das ist:
Neuordnung:
Der Eingang ist ausgeglichen, wenn die beiden Hälften dieselbe Summe haben. Daher ist dieser Ausdruck Null, wenn die Eingabe ausgeglichen ist. Das überprüfen wir also:
quelle
JavaScript (ES6),
5955514442 ByteEs stellte sich heraus, dass ich die falsche Strategie angewendet hatte. Diese Version findet rekursiv die Summe der ersten Hälfte minus der Summe der zweiten Hälfte und gibt dann das logische NICHT des Ergebnisses zurück.
Wenn wir anstelle von truthy und umgekehrt falsy zurückgeben könnten, wären dies 35 Bytes:
Testschnipsel
Code-Snippet anzeigen
quelle
n[i*2]
! Schön.f=([x,...a])=>!(a[0]?x-a.pop()+f(a):0)
?PowerShell v2 +, 85 Byte
Nimmt Eingaben
$a
als Zeichenfolge (erforderlich, um Zahlen zu unterstützen,>2^64-1
ohne in[biginteger]
der Befehlszeile extrem klobig zu werden).Für die Erklärung nehmen wir die Eingabe von an
'1423'
. Wir konstruieren dann eine neue Zeichenfolge. Die beiden Scheiben sind offensichtlich Array ($a[...]
), und das um drei weitere Saiten umgeben ist(
,0)-(
und0)
, eine Reihe von Formulierungschar
s undstring
s. Beachten Sie, dass,
an der Vorderseite die Array-Verkettung und nicht die String-Verkettung erzwungen werden soll.Das gesamte Array wird mit
-join
ed zusammengefügt+
, was zu einer Zeichenfolge wie folgt führt(+1+4+0)-(+2+3+0)
, und Sie können sehen, dass die0
s erforderlich sind, um Syntaxfehler zu vermeiden. Das ist eingespeist in|iex
(kurz fürInvoke-Expression
und ähnlich zueval
), das das mathematische Ergebnis berechnen wird. Solange der String ausgeglichen ist, erhalten Sie0
eine Ausgabe, die wir in Parens einkapseln und für die!(...)
Ausgabe das Boolesche-Nicht davon verwendenTrue
. Wenn es sich um eine Ganzzahl ungleich Null handelt, wird sie ausgegebenFalse
.Testfälle
quelle
Perl, 29 Bytes
Beinhaltet +5 für
-lpF
Gib die Nummer bei STDIN an
balanced.pl
:quelle
C #, 83 Bytes
Probieren Sie es online!
Vollständige Quelle, einschließlich Testfall:
Der BigInteger-Datentyp erlaubt eine beliebige Länge. Wenn die Zahl zu groß ist, beschwert sich der Compiler ( Fehler CS1021: Integrale Konstante ist zu groß ), sodass stattdessen die Methode BigInteger.Parse (String) verwendet wird.
Die Lösung kann auf 72 Byte reduziert werden, wenn die Eingabe eine Zeichenfolge ist (und das Programm entsprechend aktualisiert wird):
quelle
t[l-++i]
anstelle vont[l-1-i++]
undreturn !r
anstelle von tunreturn r==0
?Python 3,
10710276 Bytes-26 Bytes von @Rod !
quelle
floor(l/2)
mitl//2
undceil(l/2)
mit ersetzenl//2+l%2
, um 7 Bytes zu sparen, und dann den Mathe-Import entfernen, um weitere 180
ann[0:l//2]
und könntest esn[l//2+l%2:]
einfach seinn[-(l//2):]
. Oder Sie könnten die//2
zu bewegenl=len(n)//2
und verwendenn[:l]
undn[-l:]
Ruby, 63 Bytes
Hinweis: arg
s
muss ein String sein.Testen (mindestens 5+ erforderlich):
quelle
Haskell, 55 Bytes
Bei der rekursiven Funktion
g
wird eine Zahlenfolge von beiden Enden abgewickelt, indem der Kopf wiederholt und dann umgekehrt wird. Es subtrahiert das rekursive Ergebnis vom Kopf, wodurch sich die Koeffizienten +1 und -1 abwechseln, wobei +1 auf die erste Hälfte und -1 auf die zweite Hälfte angewendet wird.Es wird also die Summe der ersten Hälfte minus der Summe der zweiten Hälfte berechnet. Dies hat das Problem, dass bei einer ungeraden Anzahl von Ziffern die Mitte nach links
(<*"xx")
abweicht , die Hauptfunktion jedoch das Problem behebt, durch das jedes Zeichen, dh "12345", zu "1122334455" verdoppelt wird. Auf diese Weise wird die mittlere Ziffer gleichmäßig auf beiden Seiten aufgeteilt und annulliert.quelle
Retina,
6444 BytesProbieren Sie es online aus
In der ersten Stufe wird die Zeichenfolge in der Mitte aufgeteilt, wobei das mittlere Zeichen weggelassen wird, sofern es eines gibt (
entnommen und geändert von hier .Mit freundlicher Genehmigung von Martin.). Ersetzen Sie dann die Ziffern durch ihre unäre Darstellung und passen Sie an, ob die beiden Hälften gleich lang sind.quelle
(.)*?
(jede Iteration schiebt ein Capture auf Stapel 2). Dann versuchen wir das Ende zu erreichen, indem wir erneut mit(?<-2>.)*$
(nach einer optionalen mittleren Ziffer) vom Stapel springen. Das erste Mal ist dies möglich, wenn wir genau die Hälfte der Ziffern (abgerundet) in Gruppe 2 erfasst haben.JavaScript (ES6),
7467...5950 BytesSummiert rekursiv die Differenz zwischen der ersten und der letzten Ziffer, bis weniger als zwei Ziffern übrig sind:
quelle
(s-=i<0?v:-v)
.Math.sign()
.R,
10596 BytesEs stellt sich heraus, dass R sehr ausführlich ist. Nimmt die Eingabe als Zeichen.
Schön formatiert:
Erläuterung
y<-as.numeric(unlist(strsplit(x,"")))
Teilen Sie die Eingabe (eine Zeichenfolge_, und konvertieren Sie sie in einen Vektor anstelle einer Liste. Wandeln Sie sie dann wieder in Ganzzahlen um.sum(tail(y,
:tail
nimmt die letzten n Elemente, gefunden von:length(y)%/%2))
, wobei%/%
Ganzzahldivision ist, um die Decke des Quotienten zu erhalten, wobei die Länge ungerade ist.sum(head(y,length(y)%/%2))
: liketail
,head
nimmt die ersten n Elemente des Vektors, die auf die gleiche Weise gefunden wurden.Bearbeitungen
=
statt<-
, gespeichert noch zwei Bytes.quelle
length(y)%/%2
irgendwie an eine Variable binden und diese in den Aufrufen vontail
und verwendenhead
?Brain-Flak ,
410206204178 + 3 = 181 BytesHier ist eine 178-Byte-Version, die das
-a
Flag verwendet.26 Bytes von DJMcMayhem abgespielt
Probieren Sie es online
Hier ist eine längere 410-Byte-Version, die das
-a
Flag nicht verwendet .Probieren Sie es online
Erläuterung
Hier ist eine Erklärung der kürzeren Lösung
Zu Beginn wird die Zahl durch das
-a
Flag in alle ihre ASCII-Werte konvertiert .Wir schieben die Stapelhöhe (dh die Anzahl der Stellen) und teilen durch zwei.
Für jede Zahl, die kleiner als die Zahl ist, die wir gerade gedrückt haben, verschieben wir eine Ziffer auf den anderen Stapel
Wenn die Stapel unterschiedliche Höhen haben, entfernen wir den obersten Gegenstand vom aktuellen Stapel
Wir wollen die Differenz zwischen den Summen jedes Stapels. Daher verwenden wir den folgenden Algorithmus, um jeden Stapel zu summieren.
Dies setzt voraus, dass keine Ziffer einen ASCII-Wert von Null hat, was eine gültige Annahme ist.
Wir führen dies für beide Stapel durch und nehmen den Unterschied (Der
<(())>
ist für den nächsten Teil notwendig.Wir wollen jetzt die Summe negieren. Wenn die Summe Null ist, springt das Oberteil ab und zeigt das zuvor geschobene an. Andernfalls werden sowohl die Zahl als auch das Oberteil entfernt und eine Null darüber platziert.
quelle
([]){[{}]{}([])}{}
um jeden Stapel zu summieren?({{}})
sollte einwandfrei funktionieren, und da Sie ASCII-Eingaben vornehmen, müssen Sie sich keine Sorgen machen, dass 0 die Schleife ruiniert.Eigentlich
1716 BytesDiese Antwort ist inspiriert von ElPedros Python 2-Antwort und ihrer zu verwendenden Idee
[-b:]
. Golfvorschläge sind willkommen. Probieren Sie es online!Ungolfing
quelle
Perl 6 ,
42 3933 BytesProbier es aus
Probier es aus
Teste es (von Jo King )
Erläuterung:
quelle
..
mit Nicht-Ganzzahlen). Wie wäre es stattdessen mit 33 BytesJavascript, 73 Bytes
Gute alte ES5-Loops
Was passiert hier?
quelle
Python 2, 73 Bytes
Tests sind bei ideone
Wir müssen
str()
statt `` verwenden, dan
es außerhalb des Bereichs von signed int liegen kann.quelle
Python 2,
83-77BytesBEARBEITEN
Mit Hilfe von @Rod auf 77 reduziert
Beispiele:
quelle
map(int,input())
stattdessen verwenden[int(h)for h in raw_input()]
,len(g)/2
wird immer int sein, keine Notwendigkeit zu konvertieren, und istor b==0
nicht wirklich notwendigb==0
ist das für erforderlichlen=1
, aber Sie können es zu verkürzenb<1
PHP,
73676057 BytesBenötigt PHP 7.1 für negative String-Offsets:
Lauf:
Vorherige Version
Hinweis: Benötigt PHP 7 für den Raumschiff-Operator.
Laufen Sie wie folgt:
Erläuterung
Iteriert über die Ziffern in der Nummer. Überprüft, ob die Ziffer zur ersten oder zweiten Hälfte gehört (oder die mittlere Ziffer ist), indem der Index der Ziffer mit der Länge der Eingabe verglichen wird (
2 * $x <=> $l - 1
). Dann multiplizieren Sie das mit der Ziffer, nehmen Sie die Summe aller Ziffern. Wenn es eine ausgeglichene Zahl ist, wird die Summe sein0
.Beispiel mit Eingabe
15324
:Optimierungen
$d
, sondern iterieren Sie die Länge der Eingabe. 5 Bytes gespeichert.null
muss nicht umgewandelt werden, damitint
PHP ihn interpretiert0
. 1 Byte gespeichert.$argn
quelle
Clojure,
6664 BytesUpdate:
str
Aus dermap int
Funktion genommen.Dies wäre gekürzt worden, wenn das Eingabeformat flexibler gewesen wäre. Jetzt musste ich die Ganzzahl zunächst einer Folge von ASCII-Werten zuordnen. Der innere
map
berechnet paarweise Wertunterschiede zwischen den beiden Hälften und prüft, ob die Summe der Deltas Null ist.((comp f g h) x y z)
=(f (g (h x y z))
.Tatsächlich hat dies dieselbe Länge wie das Mapping innerhalb von a
let
und definiert nur eine einzige Funktion.quelle
sed (165 + 1 für -r) 166
Ausgabe:
1 für wahr
0 für falsch
Probieren Sie es online!
quelle
Python 2.7,
10292 BytesFor-Schleife funktioniert besser: /
Dieselbe Idee, benutze einfach die Länge - ich, um die andere Seite zu bekommen. Es wird niemals die Mitte einer ungeraden Zahl erreichen.
Alter Code
Ruft die Eingabe ab
Speichert die Länge der Eingabe.
Rekursive Funktion zum Abrufen der Stringsumme.
Vergleichen Sie die erste Halbsumme mit der zweiten Halbsumme
Der Versuch, es unter 100 zu bekommen, aber es ist schwer: /
quelle
C-Funktion, 74
Ideone.
quelle
#include"string.h"\n
, wodurch Ihre Punktzahl um 19 erhöht wird .char *n
l;i;t;f(char*n){..return!t;}
-2 BytesSchläger 204 Bytes
Ausführliche Version:
Testen:
Ausgabe:
quelle
Pyke, 20 Bytes
Probieren Sie es hier aus!
quelle
not [0]
war 0 nicht 1Mathematica, 69
quelle
...;;]]&@*IntegerDigits
@*
ist eine Abkürzung fürComposition
.f@*g
istf[g[##]]&
.