Die Leute sagen mir immer wieder, dass das Quadrat einer Zahl die mit sich selbst multiplizierte Zahl ist. Das ist offensichtlich falsch. Die richtige Methode, eine Zahl zu quadrieren, besteht darin, sie in ein Quadrat zu verwandeln, indem sie so oft auf sich selbst gestapelt wird, wie sie Ziffern hat, und dann alle Zahlen aus dem resultierenden Quadrat horizontal (von bis) abzulesen nur von links nach rechts) und vertikal (nur von oben nach unten) und addieren sie dann. Für die Zahl 123 erstellen Sie also zunächst das Quadrat:
123
123
123
Dann nehmen Sie alle Zeilen und Spalten aus dem Quadrat und addieren sie:
123+123+123+111+222+333
Welches gibt uns ein Ergebnis von 1035
.
Bei negativen Zahlen stapeln Sie normal (denken Sie daran, dass Sie nur die Anzahl der Stellen zählen , damit das negative Vorzeichen nicht in der Länge enthalten ist), lesen die horizontalen Zahlen normal (mit negativen Vorzeichen) und ignorieren dann die negativen Vorzeichen für die vertikalen Zahlen. Also, für die Zahl -144
bekommen wir das Quadrat:
-144
-144
-144
Was gibt uns -144-144-144+111+444+444
, was ist gleich567
Bei Zahlen mit nur einer Ziffer entspricht das Quadrat immer der doppelten Zahl (einmal horizontal und einmal vertikal lesen). So 4
gibt es uns
4
Was gibt uns 4+4
, was ist gleich 8
.
Stapeln Sie Zahlen mit Dezimalstellen normal (denken Sie daran, dass nur Ziffern gezählt werden, wenn Sie die Zahl stapeln, und daher der Dezimalpunkt nicht gezählt wird) und ignorieren Sie die Dezimaltrennzeichen, wenn Sie die vertikalen Zahlen lesen. Zum Beispiel 244.2
gibt uns die Nummer
244.2
244.2
244.2
244.2
Was gibt uns 244.2+244.2+244.2+244.2+2222+4444+4444+2222
, was ist gleich 14308.8
.
Bruchteile oder komplexe Zahlen können nicht quadriert werden.
Deine Aufgabe:
Ich habe es satt, die Zahlen von Hand zu quadrieren, deshalb habe ich beschlossen, den Vorgang zu automatisieren. Schreiben Sie mir ein Programm oder eine Funktion, die je nach Belieben einen Gleitkommawert oder einen String als Eingabe verwendet und das Ergebnis der Quadratur auf meine Weise zurückgibt.
Beispiele:
123 -> 1035
388 -> 3273
9999 -> 79992
0 -> 0
8 -> 16
-6 -> 0
-25 -> 27
-144 -> 567
123.45 -> 167282.25
244.2 -> 14308.8
2 -> 4
-0.45 -> 997.65
0.45 -> 1000.35
Wertung:
Meine Hände werden eng, weil ich all diese Quadrate ausgeschrieben habe, und mein Computer unterstützt das Kopieren / Einfügen nicht. Daher gewinnt der Eintrag mit der geringsten Codemenge, die ich eingeben kann (gemessen in Byte aus irgendeinem Grund?)!
244.2
ist keine Gleitkommazahl. Es kann nicht in die Zeichenfolge konvertiert werden"244.2"
.Antworten:
05AB1E , 7 Bytes
Probieren Sie es online!
Erläuterung
quelle
Jelly ,
1312 BytesEine monadische Verknüpfung, die eine Liste von Zeichen akzeptiert (eine wohlgeformte Dezimalzahl, wobei die einzelne führende Null eine Voraussetzung für -1 <n <1 ist ) und eine Zahl zurückgibt.
Probieren Sie es online!
14 Bytes zu übernehmen und Rücklaufnummern (Eingangs beschränkt auf +/- 10 -5 durch
ŒṘ
)ŒṘfØDẋ€L$ŒV+⁸S
.Wie?
quelle
+€
mit+
-1 in 15-Bit - Version.Haskell,
5956 BytesDie Eingabe wird als Zeichenfolge verwendet.
Probieren Sie es online!
Wie es funktioniert
quelle
Japt v2 , 16 Bytes
Testen Sie es online!
Erläuterung
quelle
C # (.NET Core),
150141133 Bytes9 Bytes dank @TheLethalCodergespeichert Weitere 8 Bytes dank @TheLethalCoder gespeichert
Probieren Sie es online!
Nimmt einen String als Eingabe und gibt die quadrierte Zahl als Gleitkommazahl aus.
Dieser Code folgt dem folgenden Algorithmus:
Erstellen Sie eine neue Zeichenfolge aus der Eingabe, jedoch ohne die Dezimalstellen und Symbole, damit wir unsere Länge und die Zahlen für die Spalten von dort abrufen können.
Berechnen Sie die Eingabe mal die Länge der Zeichenfolge, die wir unter Punkt 1 erstellt haben.
Erstellen Sie für jede Spalte in unserem "Quadrat" eine neue Zeichenfolge mit der Spaltennummer und der Zeilenlänge und fügen Sie sie unserem Ergebnis hinzu.
Beispiel:
Eingang:
-135.5
1355
mit der Länge von4
.-135.5 * 4 = -542
.1111
,3333
,5555
,5555
.Wenn wir diese Zahlen zusammenfassen, erhalten wir
15012
genau das, was unser Programm ausgibt.quelle
string.Replace()
, aber ich denke, das ist der einzige Weg, wie es funktioniert!i
undl
Schweben zu sparen ..Length
kann nicht implizit in Float konvertiert werden.a=>{var c=a.Replace(".","").Replace("-","");int i=0,l=c.Length;var r=float.Parse(a)*l;for(;i<l;)r+=int.Parse(new string(c[i++],l));return r;}
141 Bytes. Könnte in der Lage sein, zu speichern, indem Sie Eingaben alsfloat
und Casting auf eine Zeichenfolge mit,n+""
aber ich habe nicht überprüft.Brachylog , 23 Bytes
Probieren Sie es online!
Brachylog passt nicht gut zu Schwimmern ...
Erläuterung:
quelle
Schale , 15 Bytes
Nimmt einen String und gibt eine Zahl zurück. Probieren Sie es online!
Erläuterung
Es ist ein bisschen ärgerlich, dass die eingebaute Parsing-Funktion
r
bei ungültigen Eingaben Analysefehler ausgibt, anstatt einen Standardwert zurückzugeben, was bedeutet, dass ich die Spalten, die aus Nicht-Ziffern bestehen, explizit herausfiltern muss. Wenn es bei fehlerhaften Eingaben 0 zurückgibt, könnte ichfΛ±
3 Bytes löschen und sparen.quelle
Python 3 ,
95 94 87 8584 BytesTest Suite .
Python 3 , 78 Bytes
Test Suite.
Der zweite Ansatz ist eine Portierung auf Python 3, die von der @ officialaimm-Lösung inspiriert wurde.
quelle
Python 2 ,
8174 Bytes-7 Bytes dank @Mr. Xcoder :
'/'<i
Probieren Sie es online!
Erläuterung:
Sprich
123.45
wird als Input gegeben.[i for i in`x`if"/"<x]
gibt eine Liste von Ganzzahlen['1','2','3','4','5']
(die auch istz
). Nun iterieren wir durch,[x]+z
dh[123.45,'1','2','3','4','5']
multiplizieren jedes Element mitlen(z)
hier5
und konvertieren jedes in ein Float (so dass auch Strings entsprechend konvertiert werden), was ergibt[617.25,11111.0,22222.0,33333.0,44444.0,55555.0]
. Schließlich berechnen wir diesum(...)
und erhalten167282.25
.quelle
i.isdigit()
durch"/"<i<":"
i.isdigit()
mit ersetzen"/"<i
, da beide.
und-
niedrigere ASCII-Codes als Ziffern haben, und adn dazwischen/
istJavaScript,
7562 BytesProbieren Sie es online aus
-2 Bytes dank Arnauld
-5 Bytes dank Shaggy (obwohl die Funktion eine Zahl erhalten muss, sehe ich jetzt, dass viele andere Antworten auch einen String erhalten)
quelle
Perl 5 ,
3733 + 1 (-p) =3834 BytesProbieren Sie es online!
Benutzte einige Tricks aus Doms Code, um 4 Bytes zu rasieren
Erklärt:
quelle
-n
und-p
buchstäblichwhile(){...}
um den Code herum, also}{
bricht es aus. Dies wird deaktiviert,$_
aber wenn Sie es$\
als Variable verwenden, wird es trotzdem gedruckt, da$\
es an jeden Ausdruck angehängt wird. Bedeutet, dass Sie Zahlen oder Ähnliches darin speichern und ignorieren können$_
. Ich bin mir nicht sicher, ob das eine großartige Erklärung war, aber ich bin mir sicher, dass dies die Tipps zum Golfen in Perl- Thread besser erklären wird! Ich bin froh, dass ich dir geholfen habe!Gelee , 17 Bytes
Probieren Sie es online!
quelle
Pyth, 18 Bytes
Probieren Sie es hier aus.
quelle
Pyth ,
2120 BytesTestsuite.
Verwendet einen völlig anderen Ansatz als als die Antwort @ EriktheOutgolfer , die mir geholfen hat, 1 Byte im Chat von 22 auf 21 zu spielen.
Erläuterung
quelle
Oktave ,
10082 BytesVielen Dank an @TomCarpenter, dass Sie mir beigebracht haben, dass Zuweisungen einen Rückgabewert haben und mir
18
Bytes ersparen !Probieren Sie es online!
Ungolfed / Erklärung
Das funktioniert so, dass wir im Grunde genommen die Zahl selbst
n
und dann die Summe der Spalten addieren müssen. Durch Summieren wirds' * logspace(0,n-1,n)
die Summe der Spalten erreicht, beispielsweise wennv=-123.4
diese Matrix wie folgt lautet:Also müssen wir es einfach machen
sum
und wir sind fertig.quelle
@(v)(n=nnz(s=strrep(num2str(abs(v)),'.','')-'0'))*v+sum(sum(s'*logspace(0,n-1,n)))
. Probieren Sie es online!Swift 4 ,
139134 BytesTest Suite.
Erläuterung
func f(s:String)
- Definiert eine Funktionf
mit einem expliziten String-Parameters
.let k=s.filter{"/"<$0}
- Filtert die Ziffern: Mir ist aufgefallen, dass beide-
und.
kleinere ASCII-Werte als alle Ziffern haben und/
zwischen.
,-
und liegen0
. Daher habe"/"
ich, wie in meiner Python-Antwort , nur überprüft, ob das Zeichen kleiner als das aktuelle ist.print(...)
- Druckt das Ergebnis.Float(s)!*Float(k.count)
- Wandelt sowohl den String als auch die Anzahl der Stellen in Float um und multipliziert sie (Swift erlaubt keine Float- und Int-Multiplikation :()). Also addiert es die Anzahlx
mal, wox
ist die Anzahl der Ziffern, die es enthält.k.map{Int(String(repeating:$0,count:k.count))!
-k.map{}
Karten vorbeik
den aktuellen Wert zu$0
.String(repeating:$0,count:k.count)
Nimmt jede Ziffer, erstellt einen String mitx
identischen Ziffern undFloat(...)!
wandelt ihn in eine Gleitkommazahl um..reduce(0,+)
- Erhält die Summe der obigen Liste.Und zum Schluss
+
die beiden Ergebnisse.Nehmen wir ein Beispiel!
Sagen wir, unsere Saite ist
"0.45"
. Zuerst filtern wir die Ziffern, damit wir übrig bleiben0, 4, 5
. Wir wandeln"0.45"
auf Float und vermehren sich durch die Anzahl der Stellen:0.45 * 3 = 1.35
. Dann nehmen wir jede Stelle und machen es zu einem String zu wiederholen , dass die Ziffer , bis sie die Breite des Platzes füllt (wie viele Stellen gibt es):0, 4, 5 -> 000, 444, 555
. Wir fassen dies000 + 444 + 555 = 999
. Dann fügen wir nur die Ergebnisse zusammen:1.35 + 999 = 1000.35
.quelle
C #,
139137 Bytes2 Bytes gespart dank @Ian H.
Probieren Sie es online!
Voll / Formatierte Version:
quelle
var d=(n+ ...
anstelle von verwendenvar d = (n ...
.Mathematica, 107 Bytes
quelle
PHP,
7888 +1 BytesAls Rohr mit laufen lassen
-nR
.Kann in PHP 7.1 zu Warnungen führen. Repace
$c,$e
mit$c>0?$c:0,$e
zu beheben.quelle
Python 3 , 68
707377BytesProbieren Sie es online!
Durchläuft jedes Ziffernzeichen und wiederholt es um die Gesamtzahl der Ziffernzeichen, macht daraus eine Ganzzahl und fügt diese hinzu
n
. Auf diese Weisen
wirdd
mal der horizontale Teil der Summe addiert , zusammen mit der Ziffernwiederholung, die der vertikale Teil ist. Ursprünglich verwendet, hatstr.isdigit
aber>"/"
dank anderer in diesem Thread eine Menge Bytes gespart. Spart zwei Bytes, indem esn
als String verwendet wird, aber die Ausgabe ist unordentlicher.Probieren Sie es online!
quelle