Sie können sich in der ersten oder zweiten Klasse daran erinnern, wie Sie in erweiterter Form den Stellenwert von Zahlen gelernt haben. Es ist einfacher, mit einem Beispiel zu erklären, also überlegen Sie sich die Zahl 123
. In erweiterter Form wird es als dargestellt 100 + 20 + 3
, was einem jungen Geist hilft, den Wert eines Ortes zu visualisieren. Es erinnert daran, wie Sie es sagen: einhundert (plus) zwanzig (plus) drei.
Wir können dies über die Einheitsstelle hinaus mit Dezimalstellen erweitern: 2.718 => 2 + 0.7 + 0.01 + 0.008
Ihre Herausforderung besteht darin, ein Programm oder eine Funktion zu schreiben, das / die eine positive Gleitkommazahl oder Null annimmt (vorausgesetzt, es ist so groß oder genau, wie Ihre Sprache es verarbeiten kann; es wird nicht in wissenschaftlicher Notation geschrieben) oder eine Zeichenfolge und es in erweiterter Form auszudrucken / zurückzugeben wie oben erklärt.
Sie brauchen weder ein Leerzeichen zwischen dem +
's noch der Null vor dem Dezimalpunkt, also könnte das obige Beispiel sein 2+.7+.01+.008
. Werte, die gleich Null wären, müssen weggelassen werden ( 101.01 => 100 + 1 + 0.01
), es sei denn, die Eingabe ist Null (siehe unten).
Werte sollten nicht mehr als eine führende Null vor dem Dezimalpunkt oder nachfolgende Nullen (no-no's:) enthalten 0060, 0000.2, 30., 30.000, .0400
. Der Eingang wird auch diesem entsprechen.
Da Erstklässler nur eine kurze Aufmerksamkeitsspanne haben, muss Ihr Code so kurz wie möglich sein.
Testfälle
0 => 0
6 => 6
0.99 => 0.9 + 0.09
24601 => 20000 + 4000 + 600 + 1
6.283 => 6 + 0.2 + 0.08 + 0.003
9000000.0000009 => 9000000 + 0.0000009
quelle
Antworten:
CJam,
3326 BytesDies funktioniert mit dem Java-Interpreter nicht. es druckt schwebt anders. Probieren Sie es mit dem CJam-Interpreter aus .
Der letzte Testfall wird gedruckt
9000000+9e-7
, der von @NinjaBearMonkey als gültig eingestuft wurde .Danke an @ jimmy23013 für das Golfen mit 7 Bytes!
Wie es funktioniert
quelle
r_ee\'0fe<f{\~t~}{},'+*0e|
.JavaScript (ES7), 102 Byte
Erläuterung
Erfordert die Eingabe der Nummer als Zeichenfolge ohne führende Nullen (es sei denn, die Nummer ist
0
natürlich).Hinweis: Aufgrund der Fließkomma-Verrücktheit kommen einige Zahlen (wie
.3
) falsch heraus, aber theoretisch funktioniert dies für jede Zahl.Prüfung
Testverwendung
Math.pow
statt aus**
Gründen der Browserkompatibilität.Code-Snippet anzeigen
quelle
Math.floor
=>0|
...?1
sie unterbrochen wird, wirdMath.log10(n)
eine negative Zahl zurückgegeben und|0
anstelle von Flooring auf Null gerundet.0|Math.log10(n),p-=p<0
anstelle von verwendenMath.floor(Math.log10(n))
?n<1
weil die0|
machenp
gleich0
für beide0.1
und-0.1
. Der kürzeste Weg, den ich mir vorstellen kann, istp=Math.log10(n),p=p-(p<0)|0
der, der genauso lang ist wie die VerwendungMath.floor
. :(n=0.1
.Retina ,
867775 BytesDie Byteanzahl setzt voraus, dass die Quelle als ISO 8859-1 codiert ist.
Der Zeilenvorschub am Ende ist signifikant.
Probieren Sie es online aus.
Erläuterung
Wir beginnen damit, die Eingabe in eine separate Zeilenvorschubliste von Komponenten umzuwandeln, obwohl nur die führende (oder nachfolgende) Ziffer korrekt ist. Dies geschieht durch den Missbrauch einer geteilten Stufe. Anstatt die Eingabe zu teilen, passen wir sie alle an, sodass die verbleibenden Segmente alle leer sind. Wir entfernen diese leeren Segmente mit der
_
Option. Der Haken ist, dass geteilte Stufen auch die Werte aller einfangenden Gruppen zurückgeben. Daher verwenden wir bei jedem Match einen Lookahead, um den richtigen Teil des Strings zu erfassen: Zuerst versuchen wir, einen.
linken Teil des Matches zu finden. In diesem Fall erfassen wir alles aus dem.
Bis einschließlich der Ziffer, die wir gerade abgleichen. Andernfalls müssen wir uns im ganzzahligen Teil der Eingabe befinden, damit wir alle Zahlen nach der Übereinstimmung erfassen (einschließlich der Übereinstimmung). Wir müssen auch den Dezimalpunkt selbst loswerden, sodass die zweite Erfassung optional ist. Wenn keine\d
zu erfassenden Elemente vorhanden sind , wird die Übereinstimmung einfach aus der Eingabe entfernt.Jetzt verwenden wir eine Transliterationsstufe, um alle bis auf die führenden / nachfolgenden Ziffern in Nullen umzuwandeln. Wir passen entweder eine Komponente an, die kleiner als 1 ist, mit
\..+\B
der\B
sichergestellt wird, dass die Übereinstimmung um eine Ziffer vor dem Ende(?<=^\d).+
abgebrochen wird , oder wir passen einen ganzzahligen Teil an, mit der der LookBehind sichergestellt wird, dass eine Ziffer in der Zahl beginnt. Die Transliterationsstufe ersetzt dann alle Ziffern (d
) durch Nullen innerhalb der Übereinstimmungen.Jetzt sollte das eigentliche Ausgabeformat
+
keine Zeilenvorschübe als Trennzeichen verwenden. Das¶
entspricht einem Zeilenvorschub, um diese Ersetzung durchzuführen. Während wir gerade dabei sind, entfernen wir auch Zeilen, die nur0
s und.
s enthalten.In der vorherigen Phase wird weder ein führendes
0
noch ein nachfolgendes Element entfernt (da davor und danach kein Zeilenvorschub vorhanden ist). Daher werden diese explizit entfernt.quelle
Python 2,
216210196175 BytesHier ist ein leicht golfener Code, den ich weiter spielen werde, wenn ich Zeit habe. Es wird eine String-Analyse verwendet.
Erläuterung
Die Eingabe ist also in einen ganzzahligen und einen dezimalen Teil unterteilt. Dann gibt es ein Verständnis für for-Schleifenlisten. Im ganzzahligen Teil wird die Länge des Strings nach einem Zeichen in der Dezimalzahl mit "0" multipliziert, um am Ende dieses Zeichens so viele Nullen zu erhalten.
Für den Dezimalteil ist der Index des aktuellen Zeichens die Anzahl der vorangestellten Nullen, sodass dieser Teil einfach ist.
Das try und except wird verwendet, um zu bestimmen, ob es einen Dezimalteil hat oder nicht (unter Verwendung eines Fehlers).
Das Endergebnis wird mit Pluszeichen verbunden.
Probieren Sie es hier aus!
quelle
o if o else ["0"]
kann seino or["0"]
.o=[(...)] for
,e(I) if
,e(i[1]) if
,print "+"
, und die äußere Klammer ino=[(...)
als auch, eigentlich. Schließlich können Sie die endgültige Bedingung wieprint"+".join(o)or"0"
folgt aus der Join-Funktion entfernen: Da der Join eine leere Liste zurückgibt, wenn dieseo
leer ist, wird die Bedingung auf die gleiche Weise ausgewertet, mit der Sie ein Byte sparen.Pyth, 30 Bytes
Testsuite
Die grundlegende Lösung besteht darin, alle Ziffern in der Eingabe durch zu ersetzen
0
, dann jede Ziffer an der richtigen Stelle einzufügen, auszuwerten, die Nullen herauszufiltern und Pluszeichen zu setzen. Leider akzeptiert Pyths Eval-Funktion derzeit keine führenden Nullen. Ich werde daran arbeiten, dies zu beheben.Um dieses Problem zu umgehen, habe ich eine Hilfsfunktion hinzugefügt
y
, die die Auswertung rekursiv wiederholt, bis kein Fehler mehr auftritt. Dabei wird jedes Mal die erste Ziffer entfernt. Beachten Sie, dass diese Funktion bei ungültiger Eingabe eine Endlosschleife ausführt.Auch für die Eingabe wurde ein Sonderfall benötigt
0
.Alles in allem finde ich den Code ziemlich gut, aber die Sprachausstattung könnte besser sein. Wer will Fehler?
quelle
Python 3, 138
Dies basiert lose auf TanMath / Ogadays Ansatz, die Zahl als Zeichenfolge zu lesen und auf diese Weise zu analysieren. Ich muss die Sternzuweisung verwenden
i
, damit Ganzzahlen korrekt verarbeitet werden.quelle
Python,
141132128 BytesDieser ist noch relativ gut lesbar. In Zeichenfolge konvertieren und die
>1
Ziffern getrennt von den<1
Ziffern behandeln. Wir haben auch einen Sonderfall für Null. Ich könnte zwei Leerzeichen weiter unten entfernen, aber ich mag es, es hübsch zu halten.Der Nachteil ist, dass es für Floats mit mehr als 9 Dezimalstellen aufschlüsselt.
Unten ist das Original. Die erste Änderung bestand darin, den Sonderfall Null zu verkürzen, die zweite Änderung bestand darin, die 0 vor der Dezimalstelle zu entfernen, und die dritte darin, zusätzliche Klammern und Leerzeichen zu entfernen.
Erläuterung:
quelle
Mathematica, 81 Bytes
Testfall:
quelle
CJam, 44 Bytes
Probieren Sie es hier aus.
Es schlägt den letzten Testfall fehl und gibt Folgendes aus:
Aber sagen wir, es ist zu genau, dass CJam nicht damit umgehen kann.
Erläuterung
quelle
Python 3,
187180173154 BytesDank der obigen Vorschläge von @Thomas Kwa und der
result or['0']
Neuordnung einiger Algebra- Elemente ( 154 Bytes ) konnten gut 19 Bytes weniger golfen werden :Mein bisher bester Versuch( 173 Bytes ). Basierend auf einem neuen Ansatz, siehe unten im Beitrag:hat mein Original auf 180 Bytes abgespielt :
Ich habe heute ein neues Sprachfeature dazu gelernt! Bedingungen über Boolesche Indizierung. Ich habe es vielleicht etwas übertrieben.
Ich habe versucht, das Verständnis zu abstrahieren, aber ich konnte es nicht kürzer machen ( 196 Bytes ):
(Das Umkehren von Sequenzen ist teuer!)
Während meine für den Moment kürzer ist, denke ich, dass TanMath seine Daunen so spielen kann, dass sie meiner entsprechen: Durch Verwenden
e=enumerate
, Ersetzenpass
durch0
und Verwenden'0'
anstelle['0']
der return-Anweisung sollten 4 + 3 + 2 = 9 Bytes gespart werden! Ich bin sicher, dass noch ein paar Bytes irgendwo abgeschabt werden können ...edit Neuer Ansatz ( 156 Bytes ). Es kann jedoch nur mit einer Genauigkeit von bis zu 6 dpi umgehen, die dem CJam-Eintrag von @ jimmy23013 ähnelt, sodass der endgültige Test fehlschlägt. Ich konnte es nicht erzwingen, mehr Nullen zu drucken, vielleicht kann es jemand anderes. Stattdessen habe ich es als Grundlage für meinen bislang besten Versuch verwendet (siehe oben). (Dieser Ansatz gibt auch die 0 vor der Dezimalstelle aus, aber das scheint auch gültig zu sein.) Nahm den
try:... except:...
Ansatz von TanMath:quelle
pure bash, 210
oder
Prüfung:
quelle
Python, 131 Bytes
Eine wirklich, wirklich chaotische rekursive Funktion, wahrscheinlich nicht der beste Weg, dies zu tun. Eingabe wie
f("10.0203")
.quelle
C
155153161 Bytes+2 zum Verknüpfen in der Mathematikbibliothek (Quelle selbst ist 159).
Ungolfed
quelle
Dyalog APL , 47 Bytes
Nimmt Nummer in Zeichenvektorform, z
'123'
.Beispiele:
Anmerkungen:
○ Der Grund für das modifizierte letzte Beispiel ist, dass APL, wie einige der anderen Einreichungen, für solche extremen Zahlen standardmäßig auf wissenschaftliche Notation umschaltet.
○ Die Phrase
↑⍕¨f¨,¨
wird nur benötigt, um alle Beispiele gleichzeitig zu verarbeiten.quelle
Netzhaut, 113 Bytes
Derzeit viel länger als Martins Lösung , verwendet aber eine andere Methode, sodass ich mich entschied, sie zu posten.
Probieren Sie es hier online aus.
quelle
Perl, 132 Bytes
131 +1 für
-p
Schalter.Dies basiert auf meiner vorherigen
sed
Antwort :Testsuite:
quelle
Powershell -
172166193 BytesAlles in einer Zeile:
Ungolfed:
Testfälle plus ein weiteres:
quelle
$args = 0
. Hier ist eine einfache Fehlerbehebung, die auch 3 Bytes spartPerl, 248 Bytes
Ew, ich bin bei Perl Golf noobish.
Probieren Sie es hier aus.
quelle
5
ihn eingebe, kehre ich zurück50
.Java,
284244243 BytesLeider konnte ich keinen kürzeren Weg finden, um sich wiederholende Strings zu erstellen als:baue einechar[]
der benötigten längeVerwenden SieArrays.fill
, um die Zeichen einzustellenVerwendennew String
Sie diese Option, damit sie verkettet werden kannMit der Inspiration von @Khaled A Khunaifer konnte ich 40 Bytes abschneiden.
Edit:
indexOf
nimmt einen int, so konnte ich ersetzen'.'
mit46
. Leider scheint dies mit nicht möglich zu seinreplace
.quelle
.replace('\0','0')
funktion ersetze erwarteString
nichtchar
, es sollte sein.replace("\0","0")
Python, 125 Bytes
Nachdem ich meine erste Antwort (sry!) Gelöscht hatte, die aufgrund von Maschinen-Epsilon-Problemen keine kleinen Zahlen verarbeiten konnte, fand ich eine andere Lösung. Es behandelt sowohl float als auch ganze Zahlen, folgt Nullen (!) Und wird als Funktion geschrieben.
Vielen Dank an @ogaday für die nützlichen Hinweise und für das kompakte '0'-Update!
Golf gespielt:
Ungolfed:
Verwendungszweck:
quelle
f('0')
Testfall jedoch fehl , und wenn ich direkt in meinen Interpreter kopiere und einfüge, erhalte ich die wissenschaftliche Notation (die ich für gut halte). Auchlist(c)
ist kürzer. Wenn Sie das verketten,'.'
bevor Sie es in eine Liste verwandeln, müssen Sie auch nichts hinzufügen[]
. Wenn Siefind
anstelle des Indexes den String verwenden, bevor Sie ihn in eine Liste umwandeln,'.'
sparen Sie nach dem Hinzufügen auch ein Byte. Wenn Sie die Ungleichung neudef f(x):x+='.';i=x.find('.');z=list(x);del z[i];return"+".join([str(int(o)*10**(i-j-1))for j,o in enumerate(z)if"0"<o])or'0'
CoffeeScript, 144 Bytes
Einfache Lösung:
Ausführbar:
Code-Snippet anzeigen
quelle
Stax , 18 Bytes
Führen Sie es aus und debuggen Sie es
Ausgepackt, ungolfed und kommentiert sieht es so aus.
Führen Sie dieses aus
Wie die vielen anderen Lösungen, die veröffentlicht wurden, wird
9000000+9e-7
für den letzten Testfall produziert. Laut etabliertem Präzedenzfall ist dies zulässig, da der Testfall für die Sprache zu genau ist.quelle
Lua, 350 Bytes
Ich denke, es gibt zwei Möglichkeiten, weiter zu golfen:
Ich könnte es gebrauchen
macro.define
, um einige der allgemeinen Ausdrücke zu ersetzen (kann derzeit nicht testen und bin mir nicht sicher, ob ich dadurch einige Bytes gewinnen würde)Verwenden Sie "Aufteilen auf den Punkt", anstatt die gesamte Zeichenfolge zu iterieren. Auch hier bin ich mir nicht sicher, ob es die Größe dieser Funktion verringern würde, da das Manipulieren von Strings in lua ziemlich schmerzhaft ist.
Erklärungen
Sie können lua online testen und den folgenden Quellcode verwenden, um es mit einigen Testfällen auszuführen
quelle
C 253 Bytes
Hinweis:
putchar(8)
Sollte eine Rücktaste ausführen.Ausführlich , versuchen Sie es hier
quelle
sed,
136128 bytesReduziert um 8 Zeichen durch Ablegen von Leerzeichen und unbrauchbar
0
.Testfälle:
quelle
JavaScript (ES7), 114 Byte
Funktioniert mit Zahlen beliebiger Länge, da durchgehend Zeichenfolgenmanipulation verwendet wird.
Ohne das Array-Verständnis (122 Bytes):
Ungolfed:
quelle
R - 133 Bytes
Robust, ignoriert Machine Epsilon und arbeitet auch mit nachgestellten Nullen.
a) Golf gespielt:
Ungolfed:
Verwendungszweck:
quelle