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


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!


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


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)

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

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


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)

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

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ą.


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

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!


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!


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

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

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

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ż+«…





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.


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!


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,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.