Listen Sie eine Nummer auf

19

Wandeln Sie eine reelle Zahl in eine Liste von Listen um, wobei das negative Vorzeichen (falls vorhanden) eine leere Liste, der ganzzahlige Teil eine Liste von Ziffern und der gebrochene Teil (falls vorhanden) eine Liste von Ziffern ist. Die Ziffern müssen tatsächliche Zahlen sein, keine Zeichenfolgen.

Beispiele

0[[0]]

123[[1,2,3]]

-123[[],[1,2,3]]

123.45[[1,2,3],[4,5]]

0.45[[0],[4,5]]

-0.45[[],[0],[4,5]]

-123.45[[],[1,2,3],[4,5]]

Adam
quelle
Dürfen die Ziffern im Array einzelne Zeichenfolgen sein?
Dzaima
Ich werde das hinzufügen.
Adám
Kann die Zahl als Zeichenfolge verwendet werden?
Uriel
@Uriel Wenn Sie eine Eingabe von STDIN erhalten, dann ja (es gibt keinen Unterschied). Wenn als Argument nein, denke ich. Was auch immer Meta-Konsens ist.
Adám
2
@Quelklef Ja, in der Tat. Es war das Ergebnis einer Diskussion langen Entwurfs Sie hier sehen können über den l(listify) Befehl von totallyhuman ‚s WIP Sprache, Intrnt .
Adám

Antworten:

7

C #, 60 66 Bytes

using System.Linq;s=>s.Split('-','.').Select(p=>p.Select(c=>c-48))

Probieren Sie es online!

TheLethalCoder
quelle
Es sind keine äußeren Klammern sichtbar. Sind Ihre Ergebnisse tatsächlich Listen?
Adám
@ Adám Yeah ( IEnumerable<char[]>) Es ist nur der
Druckcode
@TheLethalCoder Die Anforderungen besagen, dass der erforderliche Rückgabetyp eine Liste von Ziffern als Zahlen ist, keine Zeichenfolgen oder Zeichen, die diese Zahlen anzeigen.
Kamil Drakari
@KamilDrakari Oh habe nicht gesehen, dass die Spezifikation aktualisiert wurde ...
TheLethalCoder
@KamilDrakari Behoben, danke, dass ich über das Update informiert wurde.
TheLethalCoder
7

JavaScript (ES6), 33 44 43 41 Byte

Übernimmt die Eingabe als Zeichenfolge. Opferte 11 bis 10 Bytes, die die Elemente in der Ausgabe in Zahlen umwandelten, nachdem die Herausforderungsspezifikation aktualisiert wurde.

s=>s.split(/\D/).map(a=>[...a].map(eval))
  • Dank Arnauld 's Vorschlag, ein Byte zu verwenden, wurde ein Byte gespeichert eval.

Probier es aus

console.log((
s=>s.split(/\D/).map(a=>[...a].map(eval))
)("-123.45"))


Erläuterung

s=>

Anonyme Funktion, die die Zeichenfolge als Argument über den Parameter verwendet s.
"-123.45"

s.split(/\D/)

Verwenden Sie RegEx, um die Zeichenfolge für alle nicht-stelligen Zeichen in ein Array aufzuteilen - dh -und.
["","123","45"]

.map(a=>)

Ordnen Sie über dem Array zu und übergeben Sie jeden String per Parameter an eine Funktion a.

[...a]

Aufteilen in ein Array einzelner Zeichenfolgen.
[[],["1","2","3"],["4","5"]]

.map(eval)

Ordnen Sie über dem Subarray und evaljeder Zeichenfolge zu, die es in eine Ganzzahl konvertiert.
[[],[1,2,3],[4,5]]

Zottelig
quelle
2D-Array von Zeichenfolgen? Wie sieht der JSON aus?
Adám
Ziffern müssen Zahlen sein.
Adám
@Adám: Aktualisiert, zu einem Preis von 11 Bytes.
Shaggy
5

Jelly ,  13  10 Bytes

ŒṘµ<”/œpV€

Ein monadischer Link, der eine Nummer aufnimmt und die resultierende Liste von Nummernlisten zurückgibt.

Probieren Sie es online! (In der Fußzeile wird nur die Python-Darstellung gedruckt, um alle aktuellen Listen anzuzeigen .)
... oder sehen Sie sich die Testsuite an .

Wie?

ŒṘµ<”/œpV€ - Link: number
ŒṘ         - Python representation (yields a string representation of the number)
  µ        - monadic chain separation (call that s)
    ”/     - literal '/' character
   <       - less than? (vectorises) ('.' and '-' are, digit characters are not)
      œp   - partition s at truthy indexes of the resulting list discarding the borders
        V€ - evaluate €ach (list of characters) as Jelly code (vectorises)
Jonathan Allan
quelle
Und wieder ist Jelly besser als 05AB1E!
Erik der Outgolfer
4

05AB1E , 12 11 Bytes

Vielen Dank an Riley für das Speichern eines Bytes. Code:

'-'.:'.¡εSï

Verwendet die 05AB1E- Codierung. Probieren Sie es online!

Erläuterung:

'-'.:            # Replace "-" by "."
     '.¡         # Split on "."
        ε        # Apply to each element..
         S       #   Split into a list of characters
          ï      #   Convert back to int
Adnan
quelle
Benötigen Sie das technisch ï?
Magic Octopus Urn
@ MagicOctopusUrn OP sagteThe digits must be actual numbers, not strings.
Dzaima
1
Das ist eine Schande, dachte ich: „-.S€¡für 6, aber wenn sie ints sein müssen ... unsicher.
Magic Octopus Urn
3

Python 2 , 59 Bytes

lambda a:[[]]*(a<0)+[map(int,n)for n in`abs(a)`.split('.')]

Probieren Sie es online!

-5 Bytes von Felipe Nardi Batista

Mego
quelle
in Ihrer dritten Ausgabe [[[1, 2, 3], [4, 5]]]gibt es eine zusätzliche äußere Liste
Felipe Nardi Batista
Behoben und benutzt immer noch 64 Bytes Link
Felipe Nardi Batista
1
Sie können zu 59 Bytes erhalten, wenn Sie Ihr Äußeres mapmit Listenverständnis ändern : Link
Felipe Nardi Batista
2

Eigentlich 23 Bytes

'.@;)A$s⌠♂≈⌡M[[]]+@s~@t

Probieren Sie es online!

Erläuterung:

'.@;)A$s⌠♂≈⌡M[[]]+@s~@t
'.                       push "."
  @;)                    make a copy of the input and move it to the bottom of the stack
     A$s                 absolute value of input, stringify, split on periods
        ⌠♂≈⌡M            convert integer and fractional parts to lists of digits
             [[]]+       prepend an empty list
                  @s~    bitwise negation of sign of input (1 -> -2, 0 -> -1, -1 -> 0)
                     @t  elements in the list starting at that 0-based index (drops the leading empty list if the input was positive)
Mego
quelle
2

SOGL V0.12 , 11 Bytes

Ζ-.ŗ .Θ⌡č¹r

Probieren Sie es hier aus!

Ausgaben an den Anfang des Stapels (weil SOGL ihn in einen mehrzeiligen String konvertiert, weil er für ASCII-Kunst gemacht ist). Um das Ergebnis anzuzeigen, schauen Sie in der Konsole nach `r`@10:(die äußeren Klammern sind die Stack-Arrays) oder hängen Sie einfach οø∑nach dem Code an

Ζ-.ŗ         replace "-" with "."
     .Θ      split on "."s
       ⌡     for each
        č      chop into characters (casts to strings :/)
         ¹   wrap in array (this + for each is like map())
          r  reverse types, vectorizing
dzaima
quelle
2

Japt (v2.0a0), 12 10 8 Bytes

Übernimmt die Eingabe als Zeichenfolge.

q\D ®¬®n

Test it ( -QFlag nur zu Visualisierungszwecken.)

  • 2 Bytes gespart dank Justin .
  • Dank ETH 2 Bytes gespart.

Erläuterung

Implizite Eingabe eines Strings U.

q\D

Verwenden Sie RegEx, um ( q) für alle nicht-stelligen Zeichen in ein Array zu teilen .

®

Karte über das Array.

¬

Teilen Sie jede Zeichenfolge in ein Array einzelner Zeichen auf.

®

Karte über das Array.

n

In Ganzzahl konvertieren.

Zottelig
quelle
2
Könnten Sie nicht aufteilen \D, da die einzigen nicht-Ziffern werden .und -?
Justin Mariner
Das Beste ist, Sie brauchen nicht einmal die /s :-)
ETHproductions
@ETHproductions: Nun, das ist ziemlich süß. Ich dachte, ich hätte das Closing möglicherweise weglassen können, /indem ich mehrzeilig geworden wäre. Ich habe nie daran gedacht, beide wegzulassen.
Shaggy
1

Oktave , 54 Bytes

@(x)cellfun(@(c){c-48},strsplit(num2str(x),{'-' '.'}))

Anonyme Funktion, die eine Zahl als Eingabe verwendet und ein Zellenarray numerischer Vektoren erzeugt.

Probieren Sie es online!

Erläuterung

@(x)cellfun(@(c){c-48},strsplit(num2str(x),{'-' '.'}))

@(x)                                                    % Function with input x
                                num2str(x)              % Convert x to string
                       strsplit(          ,{'-' '.'})   % Split at '-' or '.'. Gives a
                                                        % cell array of substrings
    cellfun(          ,                               ) % To each substring apply
                                                        % the following function
            @(c){c-48}                                  % Subtract 48 from each char
                                                        % and pack into a cell
Luis Mendo
quelle
1

C (gcc) , 170 164 152 146 144 Bytes

Sollte in der Lage sein, dies ein bisschen runter zu spielen ...

#define P printf
#define V *v[1]
main(c,v)char**v;{for(V^45?P("[[%c",V++):P("[[],[%c",V++,V++);V;V^46?P(",%c",V++):P("],[%c",V++,V++));P("]]");}

Probieren Sie es online!

Cleblanc
quelle
Ich denke, Sie können ein paar Bytes sparen, #define P printf(indem Sie die Klammern in den PAufrufen
weglassen
1

Gelee , 12 Bytes

ŒṘ⁾-.yṣ”.V€€

Probieren Sie es online!

Erik der Outgolfer
quelle
Ja, das habe ich auch versucht, momentan habe ich nur 13 (ich werde das posten, aber denke, es muss kürzer sein können) 0.45Renditen [[],[4,5]statt [[0],[4,5]](es kollidiert mit -45)
Jonathan Allan
@ JonathanAllan Oh ja, in der Tat ... nicht sicher, woher ich das habe? Oh warte, es ist ! Fixing ... ok behoben. Wer würde erwarten, dass Jelly das 0und .45von 0.45separat parst ... und es auch als Ausgabe hat.
Erik der Outgolfer
1

Eigentlich 16 Bytes

$'.'-(Æ'.@s⌠♂≈⌡M

Probieren Sie es online!

Erläuterung:

$'.'-(Æ'.@s⌠♂≈⌡M Implicit eval'd input
$                Convert to str
 '.              Push '.'
   '-            Push '-'
     (           Rotate stack left
      Æ          Pop a, b, c; push c.replace(b, a)
       '.        Push '.'
         @       Pop a, b; push b, a (swap)
          ⌠♂≈⌡   Push function ♂≈
           ♂       Map
            ≈        Convert to int
              M  Map
Erik der Outgolfer
quelle
1
Hat den Schöpfer überrumpelt, nett.
Zacharý
@ Zacharý Es ist nur eine Frage der Wahl des Algorithmus.
Erik der Outgolfer
Und es ist Mego Sie schlagen, nicht Dennis natürlich :)
Zacharý
@ Zacharý Nun, zweimal in dieser Herausforderung, um fair zu sein ...
Erik der Outgolfer
1

R, 51 47 72 Bytes

x=RG::s(strtoi(s(gsub('-','.',scan()),on='\\.')))
x[is.na(x)]=list(NULL)

Ich liebe die RGBibliothek.

Musste 26 Bytes hinzufügen, um sicherzustellen, dass die leere Liste tatsächlich leer war.

               gsub('-','.',scan())             # replace - with . in input; also converts to string
             s(                    ,on='\\.')   # split string on '.'
      strtoi(                                )  # convert to numeric
RG::s(                                        ) # convert to lists of digits

    x[is.na(x)]=list(NULL)                      # converts list of `NA` to empty list

Beispielausgabe:

> x=RG::s(strtoi(s(gsub('-','.',-123.45),on='\\.')))
> x[is.na(x)]=list(NULL)
> x
[[1]]
NULL

[[2]]
[1] 1 2 3

[[3]]
[1] 4 5
BLT
quelle
na gibt es numeric(0)denn eine leere nummerische liste oder list()oder NULL?
Giuseppe
Ich habe eine Lösung gefunden, um es zu schaffen, NULLaber jetzt bin ich sicher, dass es eine golferischere Möglichkeit gibt. Vielleicht komme ich darauf zurück.
BLT
1

Perl 5 , 56 54 + 1 (-p) = 55 Bytes

$_="[[$_]]";s/\D\K\./0./;s/\d(?=\d)/$&,/g;s/-|\./],[/g

Probieren Sie es online!

Zwei Bytes gespart, weil Dom mich an $ & erinnert

Erläuterung:

$_="[[$_]]";        # Add opening and closing to ends of strings
s/\D\K\./0./;       # handle the case of .45 or -.45 by inserting 0 before
                    # the decimal.  Otherwise, .45 & 45 would be ambiguous.
s/\d(?=\d)/$&,/g;   # Put a comma between numbers.
s/-|\./],[/g        # Turn - and . into separators between lists
Xcali
quelle
Habe ein bisschen damit gespielt und fand es etwas kürzer, es zu zerlegen. Sie sind sich nicht sicher, ob Sie es basierend auf meiner kombinieren können, um Ihre zu verkleinern? 😊 Probieren Sie es online!
Dom Hastings
1
Verwendet $ & von Ihnen. Ich denke, die beiden sind jetzt im Grunde gleich, mit der Ausnahme, dass meine den Fall ".45" vs. "45" behandelt.
Xcali
Ahhh, ja, ich habe das verpasst!
Dom Hastings
1

Perl 6 , 23 Bytes

+«*.split(/\D/)».comb

Probier es aus

Erweitert

\            # numify each of the following (possibly in parallel)
*\             # WhateverCode lambda (this is the input)
.split(/\D/)\  # split on non-digits ( . and - )
».comb         # split each of those into individual characters

Beachten Sie, dass dies …».combeine höhere Priorität hat als+«…

Brad Gilbert b2gills
quelle
0

Perl 6 , 22 Bytes

{m:g/^\d*|\d+/».comb}

Probieren Sie es online!

Die Elemente in der zurückgegebenen Liste sind Zeichenfolgen, aber wie es für Perl normal ist, können sie als Zahlen verwendet werden und werden implizit konvertiert. Sie sind "tatsächliche Zahlen" für alle praktischen Zwecke. Um zu erzwingen, dass sie in ihrer unmittelbarsten Darstellung Zahlen sind, muss man dem Inhalt des Codeblocks lediglich "+" voranstellen, um drei weitere Bytes zu erhalten.

Sean
quelle
In der Aufforderung heißt es ausdrücklich: „ Die Ziffern müssen tatsächliche Zahlen sein, keine Zeichenfolgen. ”, Also sollte das wohl enthalten sein.
Brad Gilbert b2gills
0

RUBIN, 75 Bytes

->(x){(x<0?[[]]:[])+x.abs.to_s.split('.').map{|y|y.chars.map{|z|z.to_i}}}

Probieren Sie es online!

Gregory
quelle
1
Können Sie all diese Leerzeichen entfernen?
TheLethalCoder
Ja, du hast recht, fertig!
Gregory
Das gleiche gilt für einige Syntax-Optimierungen: Probieren Sie es online aus! (Übrigens, wenn Sie bei TIO Kopf- und Fußzeile verwenden, entspricht die auf der rechten Seite des Codes angezeigte Größe der tatsächlichen Größe der Lösung.)
manatwork
Behoben, danke für alle Infos.
Gregory
Sie können .map{z|z.to_i}für.map &:to_i
Cyoce