Jetzt , da wir wissen , wie man richtig Platz und Dreieck eine Zahl ist , werden wir lernen , wie man Parallelogramm. Um eine Zahl zu parallelisieren, ordnen wir sie zunächst als Parallelogramm an, indem wir sie so oft auf sich selbst stapeln, wie es Stellen gibt, und Leerzeichen hinzufügen, um sie zu einem Parallelogramm zu machen. So 123
würde sich bilden:
123
123
123
Nun nehmen wir jede horizontale und vertikale Zahl und addieren sie 123+123+123+1+12+123+23+3
, was gleich ist 531
, was das Parallelogramm von ist 123
.
Deine Aufgabe:
Schreiben Sie ein Programm oder eine Funktion, die bei Eingabe einer Zahl das Parallelogramm der Zahl zurückgibt.
Eingang:
Eine nicht negative Ganzzahl oder eine nicht negative Ganzzahl, die durch eine Zeichenfolge dargestellt wird.
Ausgabe:
Das Parallelogramm der ganzen Zahl.
Testfälle:
1234567 -> 10288049
123 -> 531
101 -> 417
12 -> 39
Wertung:
Dies ist Code-Golf , die niedrigste Punktzahl in Bytes gewinnt!
Antworten:
MATL , 12 Bytes
Die Eingabe ist eine Zeichenfolge. Probieren Sie es online!
Erläuterung
Betrachten Sie die Eingabe
'123'
als Beispiel.Der Code dupliziert die Eingabe (
t
) und erstellt eine Identitätsmatrix (Xy
) mit der doppelten Länge der Eingabe (nE
):dann dreht man es um (
P
):Die Eingabezeichenfolge, die als ASCII-Code der Ziffern interpretiert wird, entspricht dem numerischen Zeilenvektor
Die zweidimensionale Faltung (
Y+
) des obigen Vektors und der Matrix in voller Größe ergibtDie Interpretation dieser Zahlen als ASCII-Codes (
c
) ergibt die folgende Zeichenmatrix, wobei Zeichen 0 als Leerzeichen dargestellt wird:Transposition (
!
) transformiert dies inWenn Sie jede Zeile als Zahl interpretieren (
U
), erhalten Sie den numerischen Spaltenvektorund Summieren es (
s
) ergibt das Endergebnis531
.quelle
Netzhaut , 22 Bytes
Probieren Sie es online! Link enthält Testfälle. Erläuterung: In der ersten Stufe wird die eingegebene Nummer an jeder Stelle aufgeteilt. Dabei werden alle exklusiven Präfixe und Suffixe einschließlich der vertikalen Nummern sowie die ursprüngliche eingegebene Nummer, die für jede Stelle wiederholt wird, mit den horizontalen Nummern angegeben. Die verbleibenden Stufen summieren dann einfach die resultierenden Zahlen.
quelle
05AB1E ,
12 118 BytesIch bin
mir sicher,dass dieseDosenoch weiter ausgebaut werden kann - Tipps willkommen!-1 Byte dank Erik the Outgolfer (keine Zeilenumbrüche, sondern Verkettung)
und dann ...
-3 weitere Bytes dank Adnan (keine Multiplikation mit Länge-1 durch vektorisierte Addition und Subtraktion der Eingabe am Ende)
Probieren Sie es online!
Wie?
quelle
«
um die Suffixe und die Präfixe zu verketten:g<*¹.s¹η«O+
.s¹η++Oα
sollte für 8 Bytes arbeitenHaskell ,
9078767164635957 BytesProbieren Sie es online!
quelle
g x=sum[x+div x a+mod x a|(a,_)<-zip((10^)<$>[1..])$show x]
.g x=sum[x+div x(10^a)+mod x(10^a)|(a,_)<-zip[1..]$show x]
ist noch ein Haar kürzer.g x=sum[x+x`div`10^a+x`mod`10^a|(a,_)<-zip[1..]$show x]
.Husk ,
1312 BytesProbieren Sie es online!
Erläuterung
quelle
Neim , 7 Bytes
In acht nehmen. Enthält Schlangen:
S𝐬𝕤
Probieren Sie es online!
quelle
S𝐬𝕤
" Lol ..𝐗𝔻
Python 3 ,
85-70BytesFür Eingabe 12345:
Summiert die Slices der Eingaben 1 + 2345 + 12345, 12 + 345 + 12345, 123 + 45 + 12345, 1234 + 5 + 12345, indem die String-Indizierung auf index (r) = 1,2,3,4 verwendet wird, bevor sie in eine Ganzzahl umgewandelt werden und addiert sich zu 12345 * 2
Besonderer Dank an:
-14 Bytes @ Jonathan Allen
-1 Byte @ovs
Probieren Sie es online!
quelle
(len(n)+1)
kann zu-~len(n)
(~x
ist-1-x
) golfen werden , und dann kann das ein anderes Byte sparen, indem man verwendet-i(n)*~len(n)
. Dann können Sie alles zu einer anonymen Funktion machen:lambda n,i=int:sum(i(n[:r])+i(n[r:])for r in range(1,len(n)))-i(n)*~len(n)
(74 Bytes)f=lambda n,r=1,i=int:n[r:]and i(n[r:])+i(n[:r])+f(n,r+1)or-i(n)*~len(n)
Japt ,
1511 Bytes-4 Bytes dank @Shaggy.
Übernimmt die Eingabe als Zeichenfolge.
Probieren Sie es online!
Erläuterung
Teilen Sie das Eingabearray in Ziffern (
¬
) und ordnen Sie es mit (£
) der folgenden Funktion zu, wobei Y der Index ist.["1", "2", "3"]
Der (implizite) Eingabewert mit
Y
Leerzeichen (ç
), diei
am Anfang eingefügt ( ) werden. Dies ist zugeordnetU
.["123", " 123", " 123"]
Verketten Sie das mit sich selbst um 90 ° nach rechts gedreht (
1
Zeit). Dann summiere (x
).["123", " 123", " 123", " 1", " 12", "123", "23 ", "1 "]
->531
.quelle
Japt ,
3118 Bytes-13 Bytes dank @ETHproductions
Dieser Ansatz funktioniert mit Japt nicht gut. Justins Lösung ist viel besser.
Erläuterung:
Probieren Sie es online!
quelle
Ul
U
s in den Funktionen, und das mittlere Element im Array kann auf komprimiert werdenUå+ x
, was Sie auf 23 Bytes reduziert.mx x
zuxx
? :-)Rubin ,
6155 + 1 = 56 BytesVerwendet die
-n
Flagge. Eingabe von STDIN.Probieren Sie es online!
quelle
102033
druckt Ihr Programm mit728714
dem korrekten Wert729702
.02033
war das Problem)JavaScript,
7774 Bytes3 Bytes gespart dank Value Ink
quelle
Pyth ,
2019 BytesMein aktueller Präfix-Ansatz (wird hoffentlich weiter Golf spielen).
Test Suite oder versuchen Sie einen alternativen Ansatz mit derselben Byte-Anzahl .
Erläuterung
Um das Konzept besser zu verstehen, nehmen wir zum Beispiel ein Beispiel
"123"
.Wir bekommen zuerst die Präfixe der Eingabe. Das sind
['1', '12', '123']
.Dann erhalten wir die Präfixe der umgekehrten Eingabe, dh:
['3', '32', '321']
und jeweils umgekehrt, daher erhalten wir['3', '23', '123']
.Wir verketten die beiden Listen und konvertieren jedes Element in eine Ganzzahl, so dass wir erhalten
[3, 23, 123, 1, 12, 123]
.Durch Summieren der Liste erhalten Sie das Ergebnis
285
.Das Produkt
P
ist die Länge der Eingabe - 1 (dh2
) multipliziert mit der ganzzahligen Darstellung von (2 * 123 = 246
).Am Ende summieren wir die beiden Ergebnisse:
285 + 246
Also erhalten wir531
, was das richtige Ergebnis ist.Pyth , 20 Bytes
Test Suite.
Erläuterung
Erklärung nach weiterem Golfen zu kommen.Das konnte ich vorerst nicht weiter ausbauen (ich habe aber Ideen).quelle
q / kdb + 34 Bytes
Lösung:
Beispiele:
Erläuterung:
quelle
Jelly , 18 Bytes
Probieren Sie es online!
quelle
Schnelle 3 , 213 Bytes
Kann nicht online getestet werden, da es langsam ist und eine Zeitüberschreitung auftritt. Sie können es in Swift Playgrounds ausprobieren, wenn Sie es testen möchten.
Probelauf
Eingang:
Ausgabe:
quelle
Gelee , 12 Bytes
Probieren Sie es online!
Übernimmt die Eingabe als Zeichenfolge. Erstellt das "Parallelogramm" als eine Matrix von Zeichen und wertet dann jede Zeile und Spalte aus, um die zu summierenden Zahlen zu erhalten.
Erläuterung
quelle
C (gcc) ,
958481 Bytes (78 +-lm
Compiler-Flag)Hallo! Dies ist meine erste Einreichung, ich hoffe, ich habe keine Regel gebrochen.
Probieren Sie es online!
Ungolfed, ohne Vorwarnung:
quelle
-lm
für mathematische Funktionen werden nur einige C-Laufzeiten benötigt, wie zglibc
. Ein Kompilieren zB mit MinGW (unter Verwendung von Microsoftmsvcrt.dll
) wäre nicht erforderlich. Sie sind sich nicht sicher, ob Sie hier etwas hinzufügen müssen? Wie auch immer, wenn Sie es hinzufügen, würde es 3 Bytes machen;)-lm
wird für diepow()
Funktion mit gcc benötigt. Ich habe versucht, ohne es zu arbeiten, konnte aber keine Lösung mit weniger als 6 Bytes finden (pow + das Compiler-Flag). Ich konnte keine Regeln finden, wie Flags in das bytecount aufgenommen werden sollen, und ich weiß, dass ich eine falsche Annahme darüber gemacht habe, dass das-
Zeichen nicht gezählt wird. Ich füge gerade ein +1 Byte hinzu.-lm
wird nicht benötigt,gcc
aber durch die Tatsache, dassglibc
die mathematischen Funktionen in der Hauptbibliothek nicht enthalten sind.msvcrt.dll
Kompilieren unter Windows mitgcc
funktioniert also ohne das-lm
. Das ist ein Trottel und ich bin mir nicht ganz sicher, was die Regeln dazu eigentlich zu sagen haben.Java 8,
147137126116114 Bytes-13 Bytes (137 → 126 und 116 → 114) dank @ OlivierGrégoire .
Erläuterung:
Probieren Sie es hier aus.
quelle
n->{Integer l=(n+"").length(),s=n*l,i=0;for(;++i<l*2;)s+=l.valueOf((n+"").substring(l<i?i-l:0,i<l?i:l));return s;}
. Es ist ein Schiebefenster mit Min-Max, um die Anzahl der teuren Anrufe zu reduzierennew Integer(....substring(...))
Math.max(0,i-l)
zu0>i-l?0:i-l
undMath.min(i,l)
zu wechselti>l?l:i
. Ändern Sie es jetzt. Ah, ich sehe, Sie haben Ihren Kommentar bearbeitet, nachdem ich die 126-Byte-Antwort kopiert hatte. ;)R ,
168162103 Bytes-6 Bytes ohne Verwendung von c ()
-59 Bytes dank @ Giuseppe
Probieren Sie es online!
Übernimmt die Eingabe als Zeichenfolge.
Ich bin mir absolut sicher, dass Verbesserungen vorgenommen werden müssen, vor allem, wenn es darum geht, die Stärken von R zu nutzen.
Edit: Viel besser jetzt, da ich nicht auf eine schlechte Idee iteriere!
quelle
substr
explizite Schleifen erstellen, anstatt sie zu schleifen, wodurch ein paar Bytes gespart würden.Perl 5 , 53 + 1 (-n) = 54 Bytes
Probieren Sie es online!
quelle
Mathematica, 77 Bytes
quelle