Podaj numer

19

Biorąc pod uwagę liczbę rzeczywistą, zamień ją na listę list, przy czym znak ujemny (jeśli występuje) staje się pustą listą, część całkowita staje się listą cyfr, a część ułamkowa (jeśli występuje) staje się listą cyfr. Cyfry muszą być liczbami rzeczywistymi, a nie ciągami znaków.

Przykłady

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

Adám
źródło
czy cyfry w tablicy mogą być łańcuchami jednoznakowymi?
dzaima
@dzaima Nie. Dodam to.
Adám
czy liczbę można traktować jako ciąg?
Uriel
@Uriel Jeśli otrzymujesz dane wejściowe ze STDIN, to tak (nie ma różnicy). Jeśli jako argument, nie, myślę. Czymkolwiek jest konsensus Meta.
Adám
2
@Quelklef Tak, w rzeczywistości. Było to wynikiem długiego projektowania dyskusji można zobaczyć tutaj o l(listify) dowództwem totallyhuman języku WIP „s, Intrnt .
Adám

Odpowiedzi:

7

C #, 60 66 bajtów

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

Wypróbuj online!

TheLethalCoder
źródło
Brak widocznych wsporników zewnętrznych. Czy twoje wyniki faktycznie są listami?
Adám
@ Adám Tak ( IEnumerable<char[]>) to tylko kod drukujący ich nie dodaje.
TheLethalCoder
@TheLethalCoder Wymagania określają, że wymagany typ zwrotu to lista cyfr jako liczb, a nie ciągów znaków lub znaków wyświetlających te liczby.
Kamil Drakari
@KamilDrakari Oh nie widziałem, że specyfikacja została zaktualizowana ...
TheLethalCoder
@KamilDrakari Naprawiono, dziękuję za poinformowanie mnie o aktualizacji.
TheLethalCoder
7

JavaScript (ES6), 33 44 43 41 bajtów

Pobiera dane wejściowe jako ciąg. Poświęcono 11 10 bajtów, konwertując elementy danych wyjściowych na liczby po zaktualizowaniu specyfikacji wyzwania.

s=>s.split(/\D/).map(a=>[...a].map(eval))
  • Zapisano bajt dzięki sugestii Arnauldaeval .

Sprawdź to

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


Wyjaśnienie

s=>

Anonimowa funkcja przyjmująca ciąg jako argument za pomocą parametru s.
"-123.45"

s.split(/\D/)

Użyj RegEx, aby podzielić ciąg znaków na tablicę na wszystkie znaki niecyfrowe - tj. -I.
["","123","45"]

.map(a=>)

Odwzoruj tablicę, przekazując każdy ciąg znaków do funkcji za pomocą parametru a.

[...a]

Podziel na tablicę pojedynczych ciągów znaków.
[[],["1","2","3"],["4","5"]]

.map(eval)

Odwzoruj na podtablicę i evalkażdy ciąg, który konwertuje go na liczbę całkowitą.
[[],[1,2,3],[4,5]]

Kudłaty
źródło
Tablica 2D ciągów? Jak wygląda JSON?
Adám
Cyfry muszą być cyframi.
Adám
@ Adám: Zaktualizowano, kosztem 11 bajtów.
Kudłaty
5

Galaretka ,  13  10 bajtów

ŒṘµ<”/œpV€

Monadyczny link pobierający liczbę i zwracający wynikową listę list liczb.

Wypróbuj online! (stopka po prostu drukuje reprezentację Pythona, aby wyświetlić wszystkie aktualne listy)
... lub zobacz pakiet testowy .

W jaki sposób?

ŒṘµ<”/œ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
źródło
I znowu galaretka jest lepsza niż 05AB1E!
Erik the Outgolfer
4

05AB1E , 12 11 bajtów

Dzięki Riley za uratowanie bajtu. Kod:

'-'.:'.¡εSï

Wykorzystuje kodowanie 05AB1E . Wypróbuj online!

Wyjaśnienie:

'-'.:            # Replace "-" by "."
     '.¡         # Split on "."
        ε        # Apply to each element..
         S       #   Split into a list of characters
          ï      #   Convert back to int
Adnan
źródło
Czy technicznie potrzebujesz ï?
Magic Octopus Urn
@MagicOctopusUrn OP powiedziałThe digits must be actual numbers, not strings.
dzaima
1
Szkoda, pomyślałem: „-.S€¡dla 6, ale jeśli muszą być int ... niepewni.
Magic Octopus Urn
3

Python 2 , 59 bajtów

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

Wypróbuj online!

-5 bajtów od Felipe Nardi Batista

Mego
źródło
na trzecim wyjściu [[[1, 2, 3], [4, 5]]]znajduje się dodatkowa lista zewnętrzna
Felipe Nardi Batista
naprawiono i nadal używa 64-bajtowego łącza
Felipe Nardi Batista
1
możesz dostać do 59 bajtów, jeśli zmienisz swój zewnętrzny mapze zrozumieniem listy: link
Felipe Nardi Batista
2

Właściwie 23 bajty

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

Wypróbuj online!

Wyjaśnienie:

'.@;)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
źródło
2

SOGL V0.12 , 11 bajtów

Ζ-.ŗ .Θ⌡č¹r

Wypróbuj tutaj!

Dane wyjściowe na górze stosu (ponieważ SOGL konwertuje go na ciąg wielowierszowy, ponieważ jest on stworzony do ascii-art). Aby wyświetlić wynik, poszukaj w konsoli po `r`@10:(zewnętrzne nawiasy to tablice stosów) lub po prostu dołącz οø∑po kodzie

Ζ-.ŗ         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
źródło
2

Japt (v2.0a0), 12 10 8 bajtów

Pobiera dane wejściowe jako ciąg.

q\D ®¬®n

Przetestuj ( -Qflaga tylko do celów wizualizacji).

  • 2 bajty zapisane dzięki Justinowi .
  • 2 bajty zapisane dzięki ETH.

Wyjaśnienie

Domniemane wprowadzanie ciągu U.

q\D

Użyj RegEx, aby podzielić ( q) na tablicę na wszystkich znakach innych niż cyfry.

®

Odwzoruj na tablicy.

¬

Podziel każdy ciąg na tablicę pojedynczych znaków.

®

Odwzoruj na tablicy.

n

Konwertuj na liczbę całkowitą.

Kudłaty
źródło
2
Nie możesz się podzielić \D, ponieważ jedynymi cyframi będą .i -?
Justin Mariner
Najlepsze jest to, że nawet nie potrzebujesz /s :-)
ETHproductions
@ETHproductions: To całkiem słodkie. Myślałem, że mogłem pominąć zamknięcie /, przechodząc do multilinii. Nigdy nie zastanawiałem się nad próbą pominięcia ich obu.
Kudłaty
1

Oktawa , 54 bajty

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

Anonimowa funkcja, która pobiera liczbę jako dane wejściowe i tworzy tablicę komórek wektorów numerycznych.

Wypróbuj online!

Wyjaśnienie

@(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
źródło
1

C (gcc) , 170 164 152 146 144 bajtów

Powinien być w stanie trochę zagrać w golfa ...

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

Wypróbuj online!

cleblanc
źródło
Myślę, że możesz zaoszczędzić kilka bajtów, wykonując, #define P printf(a następnie pomijając nawias w Pwywołaniach
Cyoce,
1

Galaretka , 12 bajtów

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

Wypróbuj online!

Erik the Outgolfer
źródło
Tak, też tego spróbowałem, obecnie mam tylko 13 (opublikuję to, ale myślę, że musi być krótszy) 0.45zwraca [[],[4,5]zamiast [[0],[4,5]](koliduje -45)
Jonathan Allan
@JonathanAllan O tak, rzeczywiście ... nie wiesz, skąd to mam? Och, czekaj, to ! Naprawianie ... ok naprawione. Kto by się spodziewać, że Jelly analizuje 0i .45od 0.45oddzielnie ... i to jak wyjście zbyt.
Erik the Outgolfer
1

Właściwie 16 bajtów

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

Wypróbuj online!

Wyjaśnienie:

$'.'-(Æ'.@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 the Outgolfer
źródło
1
Fajnie obezwładnił twórcę.
Zacharý
@ Zacharý To tylko kwestia wyboru algorytmu.
Erik the Outgolfer
I pokonałeś Mego, a nie Dennis oczywiście :)
Zacharý
@ Zacharý Cóż, dwa razy w tym wyzwaniu, aby być uczciwym ...
Erik the Outgolfer
1

R, 51 47 72 bajtów

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

Uwielbiam RGbibliotekę.

Musiałem dodać 26 bajtów, aby upewnić się, że pusta lista jest rzeczywiście pusta.

               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

Przykładowe dane wyjściowe:

> 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
źródło
dobrze, nie numeric(0)dla pustej listy numerycznej lub list()czy NULL?
Giuseppe
Postawiłem na poprawkę, aby to zrobić, NULLale teraz jestem pewien, że istnieje bardziej golfowy sposób. Może wrócę do tego.
BLT
1

Perl 5 , 56 54 + 1 (-p) = 55 bajtów

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

Wypróbuj online!

Zapisano dwa bajty, ponieważ Dom przypomniał mi o $ &

Wyjaśnienie:

$_="[[$_]]";        # 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
źródło
Miałem trochę zabawy z tym i okazało się, że rozbicie go jest nieco krótsze. Nie wiesz, czy możesz połączyć go w oparciu o moje, aby zmniejszyć swój? 😊 Wypróbuj online!
Dom Hastings
1
Użyto $ i od twojego. Myślę, że oba są teraz w zasadzie równoważne, z tym wyjątkiem, że moje obsługuje przypadek „.45” vs. „45”.
Xcali
Ahhh, tak, tęskniłem za tym!
Dom Hastings,
1

Perl 6 , 23 bajtów

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

Sprawdź to

Rozszerzony

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

Zauważ, że …».combjest to wyższy priorytet niż+«…

Brad Gilbert b2gills
źródło
0

Perl 6 , 22 bajtów

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

Wypróbuj online!

Elementy na zwróconej liście są łańcuchami, ale jak to zwykle bywa w Perlu, mogą być używane jako liczby i będą konwertowane niejawnie; są to „liczby rzeczywiste” dla wszystkich praktycznych celów. Aby zmusić je do bycia liczbami w ich najbardziej bezpośredniej reprezentacji, wystarczy poprzedzić zawartość bloku kodu znakiem „+” dla jeszcze trzech bajtów.

Sean
źródło
Wyzwanie wyraźnie stwierdza: „ Cyfry muszą być liczbami rzeczywistymi, a nie ciągami znaków. ”, Więc prawdopodobnie należy to uwzględnić.
Brad Gilbert b2gills 28.07.17
0

RUBY, 75 bajtów

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

Wypróbuj online!

Gregory
źródło
1
Czy potrafisz usunąć całą tę spację?
TheLethalCoder
Tak, masz rację, gotowe!
Gregory
To samo z pewnymi poprawkami składni: wypróbuj online! (BTW, jeśli użyjesz nagłówka i stopki w TIO, rozmiar wyświetlany po prawej stronie kodu będzie rzeczywistym rozmiarem rozwiązania.)
manatwork
Naprawiono, dziękuję za wszystkie informacje.
Gregory
Możesz zamienić .map{z|z.to_i}na.map &:to_i
Cyoce,