Wir sind daran gewöhnt, dass der Ausdruck "Quadrieren" n die Berechnung von n 2 bedeutet . Wir sind auch mit dem Begriff „cubing“ verwendet n bedeuten n 3 . Abgesehen davon, warum konnten wir nicht auch eine Zahl dreiecken?
Wie dreiecke ich eine Zahl?
Zunächst einmal, lassen Sie uns eine Nummer wählen,
53716
.Positionieren Sie es in einem Parallelogramm, dessen Seitenlänge der Anzahl der Ziffern der Zahl entspricht und dessen zwei Seiten diagonal positioniert sind (siehe Abbildung unten).
53716 53716 53716 53716 53716
Jetzt wollen wir es, richtig? Beschneiden Sie dazu die Seiten, die nicht in ein rechtwinkliges Dreieck passen:
5 53 537 5371 53716
Nehmen Sie die Summen jeder Zeile, für dieses Beispiel ergibt sich
[5, 8, 15, 16, 22]
:5 -> 5 53 -> 8 537 -> 15 5371 -> 16 53716 -> 22
Summiere die Liste
[5, 8, 15, 16, 22]
, was ergibt66
. Dies ist das Dreieck dieser Zahl!
Spezifikationen und Regeln
Die Eingabe ist eine nicht negative ganze Zahl n ( n ≥ 0, n ∈ Z ).
Sie können die Eingabe und Ausgabe mit jedem zulässigen Mittel vornehmen .
Die Eingabe kann als Ganzzahl, als Zeichenfolgendarstellung der Ganzzahl oder als Ziffernliste formatiert werden.
Standardlücken sind nicht zulässig.
Das ist Code-Golf , also gewinnt der kürzeste Code in Bytes!
Weitere Testfälle
Eingabe -> Ausgabe 0 -> 0 1 -> 1 12 -> 4 123 -> 10 999 -> 54 100000 -> 6 654321 -> 91
Inspiration. Erklärungen sind erwünscht!
quelle
645321 -> 91
?645321
statt654321
.Antworten:
Haskell , 13 Bytes
Probieren Sie es online!
Übernimmt die Eingabe als Ziffernliste. Berechnet die kumulativen Summen und summiert sie dann.
quelle
Husk ,
42 BytesDanke @ H.PWiz für die
-2
Bytes!Probieren Sie es online!
"Ungolfed" / Erklärt
quelle
Brain-Flak ,
65, 50,36 BytesProbieren Sie es online!
Nach vielen Überarbeitungen bin ich jetzt sehr stolz auf diese Antwort. Ich mag den Algorithmus und wie schön er sich in Brain Flak ausdrücken lässt.
Der größte Teil der Byteanzahl stammt aus der Verarbeitung von Nullen in der Eingabe. Wenn wir davon ausgehen könnten, dass die Eingabe keine Nullen enthält, wäre dies eine sehr kurze 20-Byte-Antwort:
Probieren Sie es online!
Aber leider ist Brain-Flak für die schlechte Behandlung von Randfällen berüchtigt.
Erläuterung
Erstens eine Beobachtung von mir:
Wenn die Eingabe n Ziffern lang ist, erscheint die erste Ziffer n- mal im Dreieck , die zweite Ziffer erscheint n-1- mal und so weiter bis zur letzten Ziffer, die einmal erscheint. Wir können das ausnutzen, da es wirklich einfach ist zu berechnen, wie viele Stellen der Eingabe in Brain-Flak verbleiben, nämlich
So funktioniert der Code.
quelle
Pyth -
64 BytesProbieren Sie es hier online aus .
Schönes 6-Byte-Laufwerk ohne eingebautes Präfix:
quelle
s.e*bhk_
MATL , 3 Bytes
Probieren Sie es online!
Übernimmt die Eingabe als Ziffernliste.
quelle
Gelee , 3 Bytes
Probieren Sie es online! Verwendet dieselbe Technik wie meine Japt-Antwort: kumulative Addition, dann Summe.
quelle
Haskell , 25 Bytes
Übernimmt die Eingabe als Ziffernliste
Probieren Sie es online!
Haskell , 41 Bytes
Übernimmt die Eingabe als Zeichenfolgendarstellung
Probieren Sie es online!
quelle
Japt ,
764 BytesProbieren Sie es online!
Erläuterung
Alte Lösung:
Probieren Sie es online!
Erläuterung
quelle
Brain-Flak , 28 Bytes
Probieren Sie es online!
14 Bytes, wenn wir keine Nullen unterstützen müssen (was wir auch tun)
Probieren Sie es online!
DJMcMayhem hat hier eine coole Antwort , die du dir ansehen solltest. Leider wollte ich ihn nicht in seiner eigenen Sprache gewinnen lassen: P
Wie funktioniert es?
Beginnen wir mit der einfachen Version.
Die Hauptaktion hier ist
({}<>{})<>
, dass der obere Teil des linken Stapels und der obere Teil des rechten Stapels hinzugefügt werden. Durch Schleifenbildung dieser Operation addieren wir den aktuellen Stapel (bis er eine Null erreicht) und legen die Summe auf den Off-Stapel. Das ist ziemlich banal, der interessante Teil ist, dass wir die Ergebnisse all dieser Läufe als unser Ergebnis zusammenfassen. Dadurch wird der gewünschte Wert berechnet. Warum? Schauen wir uns ein Beispiel an123
. Beim ersten Zupacken bekommen wir nur 1, also ist unser Wert 1Beim nächsten Zupacken geben wir 1 plus 2 zurück
Beim letzten Lauf haben wir alle drei zusammen
Siehst du das dreieck Die Summe aller Läufe ergibt das "Dreieck" der Liste.
Ok, aber jetzt brauchen wir es, um für Nullen zu arbeiten. Hier habe ich den gleichen Trick wie DJMcMayhem verwendet, plus ein paar ausgefallene Schritte. Anstatt zu schleifen, bis wir eine Null erreicht haben, schleifen wir, bis der Stapel leer ist.
Ich benutzte dann diesen Tipp , der von niemand anderem als Ihrem geschrieben wurde, um weitere 2 Bytes abzuspielen.
Und da haben wir es. Ich wäre überrascht, wenn es eine kürzere Lösung gäbe, aber dann sind wieder seltsamere Dinge passiert.
quelle
Unfortunately for him I wasn't about to let him win at his own language :P
Ich erwarte nichts weniger von dir. : DJavaScript (ES6), 28 Byte
Übernimmt die Eingabe als Ziffernliste.
quelle
Python 3 , 37 Bytes
Probieren Sie es online!
quelle
len
umsum
als gut, obwohl ich glaube nicht , dass irgendetwas hilft.sum([])
0 ist, aber nichts kam ganz zusammen ... es könnte aber einen Weg gebenC # (.NET Core) , 59 Byte
Probieren Sie es online!
Erheblich anders als die anderen C # -Antworten. Die Eingabe ist eine Liste von Ziffern. Alle im TIO-Link enthaltenen Testfälle.
Könnte eine Menge Bytes speichern, wenn Eingabe als rückwärts gerichtete Ziffernliste mit führender 0 zulässig ist.
quelle
number
?Python 3 , 35 Bytes
Mir ist nur aufgefallen, dass dies letztendlich nur ein kleiner Teil der Antwort von Business Cat ist !
Probieren Sie es online!
quelle
J , 7 Bytes
Probieren Sie es online! Nimmt eine Liste von Ziffern auf, wie z
f 6 5 4 3 2 1
.Erläuterung
Ein bisschen zutreffender wäre das ursprüngliche Problem
[:+/@,]/
, dass "sum" (+/
) die abgeflachten (,
) Präfixe der Eingabe (]\
) ist.quelle
Vim ,
605932 TastenanschlägeVielen Dank @CowsQuack für den Tipp mit dem rekursiven Makro und dem
h
Trick, das hat mir 27 Bytes erspart !Probieren Sie es online!
Ungolfed / Erklärt
Dies wird das Dreieck wie beschrieben bilden (nur dass es linksbündig bleibt):
Der Puffer sieht nun so aus:
Füge alle Zeilen zu einer zusammen und erstelle daraus einen auswertbaren Ausdruck:
Das
"
Register enthält jetzt die folgende Zeichenfolge (Anmerkung: 0 fehlt):Wir müssen also nur eine Null anhängen und auswerten:
quelle
&
(das gesamte Spiel) anstelle des\1
ErsatzbefehlsqqYp$xq:exe"norm".col('.')."@q"⏎
werden kannqqYp$xh@qq@q
. Bei diesem rekursiven Makro tritt ein Unterbrechungsfehler auf, wenn sich ein Zeichen in der Zeile befindet. Danach wird es angehalten.:s/./&+/g
. Auch:%j⏎
können sichV{J
. UndDi
kann werdenC
(ich habe dies bereits in einer anderen Ihrer Vim-Antworten kommentiert). Probieren Sie es online!Python 2 ,
4945 Bytes-4 Bytes dank Mr. Xcoder.
Probieren Sie es online!
Übernimmt die Eingabe als Ziffernliste.
quelle
Bash + GNU-Dienstprogramme,
3224Eingang von STDIN gelesen.
Update: Ich sehe, die Eingabe kann als Ziffernliste erfolgen. Meine Eingabeliste ist durch Zeilenumbrüche getrennt.
Probieren Sie es online aus .
Erläuterung
quelle
APL, 4 Bytes
Dies nimmt die Eingabe als eine Liste von Ziffern, zB:
Erläuterung
quelle
Taxi , 1478 Bytes
Probieren Sie es online!
Nicht golfen:
quelle
Perl 5 , 19 + 1 (
-p
) = 20 BytesProbieren Sie es online!
Wie?
$ \ enthält die kumulative Summe, $ p die Summe der Ziffern in der aktuellen Zeile. Jede Zeile des Parallelogramms ist einfach die vorherige Zeile mit der nächsten Ziffer der angehängten Nummer. Daher ist es die Summe der vorherigen Zeile plus der neuen Ziffer. Dies iteriert über alle Ziffern und berechnet die Summen, wie es geht. Die tatsächliche Substitution ist irrelevant; Es ist nur ein Mittel, um die Ziffern zu durchlaufen, ohne eine tatsächliche Schleife zu erstellen. Am Ende wird $ \ implizit durch die
-p
Option ausgegeben.quelle
Python 2 , 56 Bytes
Probieren Sie es online!
quelle
Gelee ,
54 BytesEin monadischer Link, der eine Liste mit Dezimalstellen erstellt und das Dreieck der Zahl zurückgibt, die in der Liste aufgeführt ist.
Probieren Sie es online!
Wie?
quelle
€
würde immer noch funktionieren. Schade ...Retina , 13 Bytes
Probieren Sie es online! Link enthält Testfälle. Erläuterung: Die erste Stufe generiert alle Präfixe der ursprünglichen Nummer, die zweite Stufe konvertiert jede Ziffer in eine unäre und die dritte Stufe berechnet die Summe.
quelle
Mathematica, 49 Bytes
quelle
#.Range[Length@#,1,-1]&
#.Range[Tr[1^#],1,-1]&
Tr@*Accumulate
Neim , 3 Bytes
Erläuterung:
Probieren Sie es online!
Alternative Antwort:
Erläuterung:
Probieren Sie es online!
quelle
Java 8, 53 Bytes
Ich habe für jeden akzeptablen Eingabetyp ein Lambda implementiert. Sie durchlaufen jeweils die Ziffern der Zahl und addieren jeweils das richtige Vielfache zu einem Akkumulator.
Ganzzahl als Eingabe (53 Bytes)
Lambda von
Integer
bisInteger
:Stringdarstellung als Eingabe (72 Bytes)
Lambda von
String
bisInteger
:Ziffernfeld als Eingabe (54 Byte)
Lambda aus
int[]
(von Ziffern, größter Stellenwert zuerst) bisInteger
:quelle
Pyt ,
96 BytesErläuterung:
quelle
Python 3,
945854 BytesVielen Dank an Herrn Xcoder, der mir geholfen hat, einige Bytes zu sparen!
Probieren Sie es online!
Übernimmt die Eingabe als Zeichenfolge. Es multipliziert einfach jede Ziffer mit der Anzahl der Additionen und gibt ihre Summe zurück.
quelle
0
. Wennp
immer sein muss0
, sollten Sie dasp
mitp=0
in derlambda
Deklaration ersetzen . Sie können jedoch nurp
vollständig entfernen , um 54 Bytes zu erhaltenSNOBOL4 (CSNOBOL4) , 79 Bytes
Probieren Sie es online!
Eingabe von stdin, Ausgabe nach stdout.
quelle
Common Lisp,
5352 BytesEingabe als Ziffernliste.
Probieren Sie es online!
-1 Byte dank @ceilingcat.
quelle
apply
auf sehr lange Listen angewendet werdencall-arguments-limit
.