Listez un nombre

19

Étant donné un nombre réel, convertissez-le en une liste de listes, le signe négatif (le cas échéant) devenant une liste vide, la partie entière devenant une liste de chiffres et la partie fractionnaire (le cas échéant) devenant une liste de chiffres. Les chiffres doivent être des nombres réels et non des chaînes.

Exemples

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
la source
les chiffres du tableau peuvent-ils être des chaînes à caractère unique?
dzaima
@dzaima Non. J'ajouterai cela.
Adám
le nombre peut-il être pris comme une chaîne?
Uriel
@Uriel Si vous obtenez des informations de STDIN, alors oui (il n'y a pas de différence). Si comme argument, non, je pense. Quel que soit le consensus Meta.
Adám
2
@Quelklef Oui, en fait. Il est le résultat d'une longue discussion de conception que vous pouvez voir ici à propos de la lcommande de (listify) totallyhuman langue WIP de, Intrnt .
Adám

Réponses:

7

C #, 60 66 octets

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

Essayez-le en ligne!

TheLethalCoder
la source
Il n'y a pas de supports extérieurs visibles. Vos résultats sont-ils réellement des listes?
Adám
@ Adám Ouais ( IEnumerable<char[]>) c'est juste que le code d'impression ne les ajoute pas.
TheLethalCoder
@TheLethalCoder Les exigences stipulent que le type de retour requis est une liste de chiffres sous forme de nombres, et non des chaînes ou des caractères qui affichent ces nombres.
Kamil Drakari
@KamilDrakari Oh n'a pas vu que la spécification avait été mise à jour ...
TheLethalCoder
@KamilDrakari Fixed, merci de m'avoir informé de la mise à jour.
TheLethalCoder
7

JavaScript (ES6), 33 44 43 41 octets

Prend l'entrée sous forme de chaîne. Sacrifié 11 10 octets convertissant les éléments de la sortie en nombres après la mise à jour de la spécification de défi.

s=>s.split(/\D/).map(a=>[...a].map(eval))
  • Sauvegardé un octet grâce à la suggestion d 'utilisation d' Arnauldeval .

Essaye-le

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


Explication

s=>

Fonction anonyme prenant la chaîne en argument via un paramètre s.
"-123.45"

s.split(/\D/)

Utilisez RegEx pour diviser la chaîne en un tableau sur tous les caractères non numériques - c'est-à-dire, -et.
["","123","45"]

.map(a=>)

Mappez sur le tableau, en passant chaque chaîne à une fonction via un paramètre a.

[...a]

Fractionner en un tableau de chaînes de caractères individuelles.
[[],["1","2","3"],["4","5"]]

.map(eval)

Mappez sur le sous-tableau et evalchaque chaîne, ce qui le convertit en entier.
[[],[1,2,3],[4,5]]

Hirsute
la source
Tableau 2D de chaînes? À quoi ressemble le JSON?
Adám
Les chiffres doivent être des nombres.
Adám
@ Adám: mise à jour, au coût de 11 octets.
Shaggy
5

Gelée ,  13  10 octets

ŒṘµ<”/œpV€

Un lien monadique prenant un numéro et renvoyant la liste résultante de listes de numéros.

Essayez-le en ligne! (le pied de page imprime simplement la représentation python pour afficher toutes les listes réelles)
... ou consultez la suite de tests .

Comment?

ŒṘµ<”/œ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
la source
Et encore une fois, Jelly est meilleur que 05AB1E!
Erik the Outgolfer
4

05AB1E , 12 11 octets

Merci à Riley d' avoir enregistré un octet. Code:

'-'.:'.¡εSï

Utilise l' encodage 05AB1E . Essayez-le en ligne!

Explication:

'-'.:            # Replace "-" by "."
     '.¡         # Split on "."
        ε        # Apply to each element..
         S       #   Split into a list of characters
          ï      #   Convert back to int
Adnan
la source
Avez-vous besoin techniquement du ï?
Magic Octopus Urn
@MagicOctopusUrn OP a ditThe digits must be actual numbers, not strings.
dzaima
1
C'est dommage, je me disais: „-.S€¡pour 6, mais s'il faut que ce soit des culs ... pas sûr.
Magic Octopus Urn
3

Python 2 , 59 octets

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

Essayez-le en ligne!

-5 octets de Felipe Nardi Batista

Mego
la source
dans votre troisième sortie, [[[1, 2, 3], [4, 5]]]il y a une liste extérieure supplémentaire
Felipe Nardi Batista
fixe et utilise toujours un lien de
Felipe Nardi Batista
1
vous pouvez atteindre 59 octets si vous changez votre externe mapavec la compréhension de la liste: lien
Felipe Nardi Batista
2

En fait , 23 octets

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

Essayez-le en ligne!

Explication:

'.@;)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
la source
2

SOGL V0.12 , 11 octets

Ζ-.ŗ .Θ⌡č¹r

Essayez-le ici!

Sorties en haut de la pile (car SOGL la convertit en une chaîne multiligne car elle est conçue pour ascii-art). Pour voir le résultat, regardez dans la console après `r`@10:(les crochets extérieurs sont les tableaux de pile) ou ajoutez simplement οø∑après le code

Ζ-.ŗ         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
la source
2

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

Prend l'entrée sous forme de chaîne.

q\D ®¬®n

Testez-le ( -Qindicateur à des fins de visualisation uniquement.)

  • 2 octets économisés grâce à Justin .
  • 2 octets économisés grâce à ETH.

Explication

Saisie implicite de chaîne U.

q\D

Utilisez RegEx pour diviser ( q) en un tableau sur tous les caractères non numériques.

®

Carte sur le tableau.

¬

Divisez chaque chaîne en un tableau de caractères individuels.

®

Carte sur le tableau.

n

Convertissez en entier.

Hirsute
la source
2
Ne pourriez-vous pas vous séparer \D, car les seuls non-chiffres seront .et -?
Justin Mariner
La meilleure partie est que vous n'avez même pas besoin du /s :-)
ETHproductions
@ETHproductions: Maintenant, c'est assez doux. Je pensais que j'aurais pu omettre la fermeture /en optant pour la multiligne. Je n'ai jamais envisagé d'essayer de les omettre tous les deux.
Shaggy
1

Octave , 54 octets

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

Fonction anonyme qui prend un nombre en entrée et produit un tableau de cellules de vecteurs numériques.

Essayez-le en ligne!

Explication

@(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
la source
1

C (gcc) , 170 164 152 146 144 144 octets

Devrait être en mesure de jouer au golf un peu ...

#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("]]");}

Essayez-le en ligne!

cleblanc
la source
Je pense que vous pouvez économiser quelques octets en faisant #define P printf(puis en omettant les parenthèses dans les Pappels
Cyoce
1

Gelée , 12 octets

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

Essayez-le en ligne!

Erik le Outgolfer
la source
Ouais j'ai essayé ça aussi, actuellement je n'ai que 13 (je posterai ça mais je pense que ça doit pouvoir être plus court) 0.45retours [[],[4,5]au lieu de [[0],[4,5]](ça entre en collision avec -45)
Jonathan Allan
@JonathanAllan Oh ouais en effet ... vous ne savez pas d'où je viens? Oh attends, c'est ! Fixation ... ok fixe. Qui s'attendrait à ce que Jelly analyse le 0et .45de 0.45séparément ... et l'ait aussi en sortie.
Erik the Outgolfer
1

En fait , 16 octets

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

Essayez-le en ligne!

Explication:

$'.'-(Æ'.@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 le Outgolfer
la source
1
Outgolfed le créateur, gentil.
Zacharý
@ Zacharý C'est juste une question de choix d'algorithme.
Erik the Outgolfer
Et c'est Mego que vous battez, pas Dennis bien sûr :)
Zacharý
@ Zacharý Eh bien, deux fois dans ce défi pour être juste ...
Erik the Outgolfer
1

R, 51 47 72 octets

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

J'adore la RGbibliothèque.

A dû ajouter 26 octets pour s'assurer que la liste vide était réellement vide.

               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

Exemple de sortie:

> 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
la source
eh bien, il y a numeric(0)une liste numérique vide ou list()ou NULL?
Giuseppe
J'ai cloué sur un correctif pour le faire, NULLmais maintenant je suis sûr qu'il y a une façon golfique de le faire. Je vais peut-être y revenir.
BLT
1

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

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

Essayez-le en ligne!

Enregistrement de deux octets car Dom me rappelle $ &

Explication:

$_="[[$_]]";        # 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
la source
J'ai joué un peu avec ça et j'ai trouvé que la décomposition était un peu plus courte. Vous ne savez pas si vous pouvez le combiner en fonction du mien pour réduire le vôtre? 😊 Essayez-le en ligne!
Dom Hastings
1
Utilisé $ & de la vôtre. Je pense que les deux sont fondamentalement équivalents maintenant, sauf que le mien gère le cas ".45" vs "45".
Xcali
Ahhh, ouais, j'ai raté celui-là!
Dom Hastings
1

Perl 6 , 23 octets

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

Essaye-le

Étendu

\            # 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

Notez que …».combc'est une priorité plus élevée que+«…

Brad Gilbert b2gills
la source
0

Perl 6 , 22 octets

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

Essayez-le en ligne!

Les éléments de la liste renvoyée sont des chaînes, mais comme c'est normal pour Perl, ils peuvent être utilisés comme des nombres et seront convertis implicitement; ce sont des «nombres réels» à toutes fins pratiques. Pour les forcer à être des nombres dans leur représentation la plus immédiate, il suffit de préfixer le contenu du bloc de code avec "+« "pour trois octets supplémentaires.

Sean
la source
Le défi indique spécifiquement: « Les chiffres doivent être des nombres réels, pas des chaînes. », Donc le devrait probablement être inclus.
Brad Gilbert b2gills
0

RUBY, 75 octets

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

Essayez-le en ligne!

Gregory
la source
1
Pouvez-vous supprimer tous ces espaces?
TheLethalCoder
Oui, vous avez raison, c'est fait!
Gregory
La même chose avec quelques ajustements de syntaxe: essayez-le en ligne! (BTW, si vous utilisez l'en-tête et le pied de page sur TIO, la taille affichée à droite du code sera la taille réelle de la solution.)
Manatwork
Fixé, merci pour toutes les infos.
Gregory
Vous pouvez échanger .map{z|z.to_i}pour.map &:to_i
Cyoce