Elencare un numero


19

Dato un numero reale, convertilo in un elenco di elenchi, con il segno negativo (se presente) che diventa un elenco vuoto, la parte intera che diventa un elenco di cifre e la parte frazionaria (se presente) che diventa un elenco di cifre. Le cifre devono essere numeri reali, non stringhe.

Esempi

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]]


le cifre nell'array possono essere stringhe a carattere singolo?
dzaima,

@dzaima No. Lo aggiungerò.
Adám,

il numero può essere preso come una stringa?
Uriel,

@Uriel Se ricevi input da STDIN, sì (non c'è differenza). Se come argomento, no, penso. Qualunque sia il consenso di Meta.
Adám,

2
@Quelklef Sì, in effetti. E 'stato il risultato di una discussione lunga di disegno potete vedere qui sul lcomando (listify) di totallyhuman lingua WIP s', Intrnt .
Adám,

Risposte:


7

C #, 60 66 byte

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

Provalo online!


Non ci sono parentesi esterne visibili. I tuoi risultati sono in realtà elenchi?
Adám,

@Adám Yeah ( IEnumerable<char[]>) è solo il codice di stampa che non li aggiunge.
TheLethalCoder

@TheLethalCoder I requisiti indicano che il tipo di restituzione richiesto è un elenco di cifre come numeri, non stringhe o caratteri che visualizzano quei numeri.
Kamil Drakari,

@KamilDrakari Oh, non ho visto che le specifiche erano state aggiornate ...
TheLethalCoder

@KamilDrakari Risolto, grazie per avermi informato dell'aggiornamento.
TheLethalCoder,

7

JavaScript (ES6), 33 44 43 41 byte

Accetta l'input come stringa. Sacrificato 11 10 byte convertendo gli elementi nell'output in numeri dopo l'aggiornamento delle specifiche della sfida.

s=>s.split(/\D/).map(a=>[...a].map(eval))
  • Salvataggio di un byte grazie al suggerimento di Arnauld di utilizzare eval.

Provalo

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


Spiegazione

s=>

Funzione anonima che accetta la stringa come argomento tramite parametro s.
"-123.45"

s.split(/\D/)

Utilizzare RegEx per dividere la stringa in un array su tutti i caratteri non numerici, ad es. -E.
["","123","45"]

.map(a=>)

Mappare sull'array, passando ciascuna stringa a una funzione tramite parametro a.

[...a]

Dividi in una serie di stringhe di caratteri individuali.
[[],["1","2","3"],["4","5"]]

.map(eval)

Mappa sopra il subarray e evalogni stringa, che lo converte in un numero intero.
[[],[1,2,3],[4,5]]


Matrice 2D di stringhe? Come appare JSON?
Adám,

Le cifre devono essere numeri.
Adám,

@Adám: aggiornato, al costo di 11 byte.
Shaggy,


5

Gelatina ,  13  10 byte

ŒṘµ<”/œpV€

Un collegamento monadico che prende un numero e restituisce l'elenco risultante di elenchi di numeri.

Provalo online! (il piè di pagina stampa solo la rappresentazione Python per mostrare tutti gli elenchi effettivi)
... o vedere la suite di test .

Come?

ŒṘµ<”/œ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)

E ancora Jelly è meglio di 05AB1E!
Erik the Outgolfer,

4

05AB1E , 12 11 byte

Grazie a Riley per aver salvato un byte. Codice:

'-'.:'.¡εSï

Utilizza la codifica 05AB1E . Provalo online!

Spiegazione:

'-'.:            # Replace "-" by "."
     '.¡         # Split on "."
        ε        # Apply to each element..
         S       #   Split into a list of characters
          ï      #   Convert back to int

Tecnicamente hai bisogno del ï?
Magic Octopus Urn,

@MagicOctopusUrn OP ha dettoThe digits must be actual numbers, not strings.
dzaima il

1
È un peccato, stavo pensando: „-.S€¡per 6, ma se devono essere ints ... incerti.
Magic Octopus Urn,


2

In realtà , 23 byte

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

Provalo online!

Spiegazione:

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

2

SOGL V0.12 , 11 byte

Ζ-.ŗ .Θ⌡č¹r

Provalo qui!

Output nella parte superiore dello stack (perché SOGL lo converte in una stringa multilinea perché è realizzato per ascii-art). Per visualizzare il risultato, cerca nella console dopo `r`@10:(le parentesi esterne sono le matrici dello stack) o aggiungi semplicemente οø∑il codice

Ζ-.ŗ         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

2

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

Accetta l'input come stringa.

q\D ®¬®n

Provalo ( -Qflag solo a scopo di visualizzazione.)

  • 2 byte salvati grazie a Justin .
  • 2 byte salvati grazie a ETH.

Spiegazione

Immissione implicita della stringa U.

q\D

Utilizzare RegEx per dividere ( q) in un array su tutti i caratteri non numerici.

®

Mappa sull'array.

¬

Dividi ogni stringa in una matrice di singoli caratteri.

®

Mappa sull'array.

n

Converti in numero intero.


2
Non potresti separarti \D, poiché le uniche non cifre saranno .e -?
Justin Mariner,

La parte migliore è che non hai nemmeno bisogno della /s :-)
ETHproductions

@ETHproductions: ora, è piuttosto dolce. Pensavo che avrei potuto omettere la chiusura /diventando multilinea. Non ho mai considerato di provare a ometterli entrambi.
Shaggy,

1

Ottava , 54 byte

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

Funzione anonima che accetta un numero come input e produce una matrice di celle di vettori numerici.

Provalo online!

Spiegazione

@(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

1

C (gcc) , 170 164 152 146 144 byte

Dovrebbe essere in grado di giocare a golf un po '...

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

Provalo online!


Penso che puoi salvare qualche byte facendo #define P printf(e poi omettendo la parentesi nelle Pchiamate
Cyoce

1

Gelatina , 12 byte

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

Provalo online!


Sì, ci ho provato anche io, attualmente ne ho solo 13 (lo pubblicherò ma penso che debba essere in grado di essere più corto) 0.45restituisce [[],[4,5]invece di [[0],[4,5]](si scontra con -45)
Jonathan Allan,

@JonathanAllan Oh sì davvero ... non sei sicuro di dove l'ho preso? Oh aspetta, lo è ! Risolto ... ok riparato. Chi si aspetta che Jelly analizza il 0e .45di 0.45parte ... e hanno come uscita troppo.
Erik the Outgolfer,

1

In realtà , 16 byte

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

Provalo online!

Spiegazione:

$'.'-(Æ'.@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

1
Superato il creatore, gentile.
Zacharý,

@ Zacharý È solo una questione di scelta dell'algoritmo.
Erik the Outgolfer,

Ed è Mego che batti, non Dennis ovviamente :)
Zacharý,

@ Zacharý Bene, due volte in questa sfida per essere onesti ...
Erik the Outgolfer

1

R, 51 47 72 byte

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

Sto amando la RGbiblioteca.

Ho dovuto aggiungere 26 byte per assicurarsi che l'elenco vuoto fosse effettivamente vuoto.

               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

Esempio di output:

> 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

bene, c'è numeric(0)per un elenco numerico vuoto o list()o NULL?
Giuseppe,

Ho cercato una soluzione per farlo, NULLma ora sono sicuro che ci sia un modo più golfoso per farlo. Forse ci tornerò.
BLT,

1

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

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

Provalo online!

Ho salvato due byte grazie a Dom che mi ha ricordato di $ &

Spiegazione:

$_="[[$_]]";        # 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

Ci siamo divertiti un po 'e ho scoperto che abbatterlo è stato un po' più breve. Non sei sicuro di poterlo combinare in base al mio per ridurre il tuo? 😊 Provalo online!
Dom Hastings,

1
Usati $ e dai tuoi. Penso che i due siano sostanzialmente equivalenti ora, tranne per il fatto che il mio gestisce il caso ".45" vs. "45".
Xcali,

Ah, sì, l'ho perso!
Dom Hastings,

1

Perl 6 , 23 byte

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

Provalo

allargato

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

Si noti che …».combè una precedenza superiore a+«…





0

Perl 6 , 22 byte

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

Provalo online!

Gli elementi nell'elenco restituito sono stringhe, ma come è normale per Perl, possono essere usati come numeri e saranno convertiti implicitamente; sono "numeri reali" per tutti gli scopi pratici. Per forzarli ad essere numeri nella loro rappresentazione più immediata, è sufficiente aggiungere il prefisso del contenuto del blocco di codice con "+« "per altri tre byte.


La sfida afferma specificamente che " Le cifre devono essere numeri reali, non stringhe. ", Quindi probabilmente dovrebbe essere incluso.
Brad Gilbert b2gills il

0

RUBINO, 75 byte

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

Provalo online!


1
Riesci a rimuovere tutto quello spazio bianco?
TheLethalCoder

Sì, hai ragione, fatto!
Gregory,

Lo stesso con alcune modifiche alla sintassi: provalo online! (A proposito, se si utilizza Intestazione e piè di pagina su TIO la dimensione visualizzata sul lato destro del codice sarà la dimensione effettiva della soluzione.)
manatwork

Risolto, grazie per tutte le informazioni.
Gregory,

Puoi scambiare .map{z|z.to_i}con.map &:to_i
Cyoce
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.