Daftarkan sebuah nomor

19

Diberi bilangan real, konversikan ke daftar daftar, dengan tanda negatif (jika ada) menjadi daftar kosong, bagian bilangan bulat menjadi daftar angka, dan bagian fraksional (jika ada) menjadi daftar angka. Digit harus berupa angka aktual, bukan string.

Contohnya

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

Adm
sumber
Apakah digit dalam array diperbolehkan menjadi string char tunggal?
dzaima
@zaza No. Saya akan menambahkan itu.
Adám
dapatkah nomor tersebut diambil sebagai string?
Uriel
@Uriel Jika Anda mendapatkan input dari STDIN maka ya (tidak ada perbedaan). Kalau sebagai argumen, tidak, saya kira. Apapun konsensus Meta.
Adám
2
@Quelklef Ya, sebenarnya. Ini adalah hasil dari diskusi desain lama Anda bisa lihat di sini tentang l(listify) perintah totallyhuman bahasa WIP 's, Intrnt .
Adám

Jawaban:

7

C #, 60 66 byte

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

Cobalah online!

TheLethalCoder
sumber
Tidak ada tanda kurung luar yang terlihat. Apakah hasil Anda sebenarnya daftar?
Adám
@ Adám Yeah ( IEnumerable<char[]>) hanya saja kode pencetakan tidak menambahkannya.
TheLethalCoder
@TheLethalCoder Persyaratan menyatakan bahwa tipe pengembalian yang diperlukan adalah daftar digit sebagai angka, bukan string atau karakter yang menampilkan angka-angka itu.
Kamil Drakari
@KamilDrakari Oh tidak melihat spek telah diperbarui ...
TheLethalCoder
@KamilDrakari Tetap, terima kasih telah memberi tahu saya tentang pembaruan.
TheLethalCoder
7

JavaScript (ES6), 33 44 43 41 byte

Mengambil input sebagai string. Mengorbankan 11, 10 byte, mengubah elemen dalam output ke angka setelah spec tantangan diperbarui.

s=>s.split(/\D/).map(a=>[...a].map(eval))
  • Menyimpan satu byte berkat saran Arnauld untuk menggunakan eval.

Menguji

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


Penjelasan

s=>

Fungsi anonim mengambil string sebagai argumen melalui parameter s.
"-123.45"

s.split(/\D/)

Gunakan RegEx untuk membagi string ke array pada semua karakter non-digit - yaitu, -dan.
["","123","45"]

.map(a=>)

Peta di atas array, meneruskan setiap string ke fungsi melalui parameter a .

[...a]

Membagi menjadi array string karakter individu.
[[],["1","2","3"],["4","5"]]

.map(eval)

Peta di atas subarray dan evalsetiap string, yang mengubahnya menjadi integer.
[[],[1,2,3],[4,5]]

Shaggy
sumber
2D array string? Bagaimana tampilan JSON?
Adám
Digit harus berupa angka.
Adám
@ Adám: Diperbarui, dengan biaya 11 byte.
Shaggy
5

Jelly ,  13  10 byte

ŒṘµ<”/œpV€

Tautan monadik yang mengambil nomor dan mengembalikan daftar daftar nomor yang dihasilkan.

Cobalah online! (footer hanya mencetak representasi python untuk menampilkan semua daftar aktual)
... atau lihat test suite .

Bagaimana?

ŒṘµ<”/œ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
sumber
Dan lagi Jelly lebih baik dari 05AB1E!
Erik the Outgolfer
4

05AB1E , 12 11 byte

Terima kasih kepada Riley karena menyimpan satu byte. Kode:

'-'.:'.¡εSï

Menggunakan penyandian 05AB1E .Cobalah online!

Penjelasan:

'-'.:            # Replace "-" by "."
     '.¡         # Split on "."
        ε        # Apply to each element..
         S       #   Split into a list of characters
          ï      #   Convert back to int
Adnan
sumber
Apakah Anda secara teknis membutuhkannya ï?
Magic Gurita Guci
@MagicOctopusUrn OP berkataThe digits must be actual numbers, not strings.
dzaima
1
Itu memalukan, saya berpikir: „-.S€¡untuk 6, tetapi jika mereka harus ints ... tidak yakin.
Magic Gurita Guci
3

Python 2 , 59 byte

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

Cobalah online!

-5 byte dari Felipe Nardi Batista

Mego
sumber
dalam output ketiga Anda [[[1, 2, 3], [4, 5]]]ada daftar luar tambahan
Felipe Nardi Batista
diperbaiki dan masih menggunakan tautan
Felipe Nardi Batista
1
Anda dapat mencapai 59 byte jika mengubah bagian luar mapdengan pemahaman daftar: tautan
Felipe Nardi Batista
2

Sebenarnya , 23 byte

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

Cobalah online!

Penjelasan:

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

SOGL V0.12 , 11 byte

Ζ-.ŗ .Θ⌡č¹r

Coba Di Sini!

Keluaran ke atas tumpukan (karena SOGL mengubahnya menjadi string multiline karena dibuat untuk ascii-art). Untuk melihat hasilnya, lihat di konsol setelah `r`@10:(tanda kurung luar adalah susunan tumpukan) atau tambahkan saja οø∑setelah kode

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

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

Mengambil input sebagai string.

q\D ®¬®n

Mengujinya ( -Qmenandai untuk tujuan visualisasi saja.)

  • 2 byte disimpan berkat Justin .
  • 2 byte disimpan berkat ETH.

Penjelasan

Input string yang tersirat U.

q\D

Gunakan RegEx untuk membagi ( q) ke array pada semua karakter non-digit.

®

Peta di atas larik.

¬

Pisahkan setiap string ke array karakter individu.

®

Peta di atas larik.

n

Konversikan ke integer.

Shaggy
sumber
2
Tidak bisakah Anda membagi \D, karena satu-satunya non-digit akan .dan -?
Justin Mariner
Bagian yang terbaik adalah, Anda bahkan tidak perlu /s :-)
ETHproduksi
@ ETHproductions: Sekarang, itu cukup manis. Saya pikir saya mungkin bisa menghilangkan penutupan /dengan menggunakan multiline. Saya tidak pernah mempertimbangkan untuk mencoba menghilangkan keduanya.
Shaggy
1

Oktaf , 54 byte

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

Fungsi anonim yang mengambil angka sebagai input dan menghasilkan array sel vektor numerik.

Cobalah online!

Penjelasan

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

C (gcc) , 170 164 152 146 144 byte

Harus bisa bermain golf ini sedikit ...

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

Cobalah online!

Cleblanc
sumber
Saya pikir Anda dapat menyimpan beberapa byte dengan melakukan #define P printf(dan kemudian menghilangkan tanda kurung di Ppanggilan
Cyoce
1

Jelly , 12 byte

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

Cobalah online!

Erik the Outgolfer
sumber
Ya saya mencobanya juga, saat ini saya hanya punya 13 (saya akan memposting itu tetapi berpikir itu harus bisa lebih pendek) 0.45kembali [[],[4,5]bukannya [[0],[4,5]](bertabrakan dengan -45)
Jonathan Allan
@ Jonathan Allan Oh ya memang ... tidak yakin dari mana saya mendapatkannya? Oh, tunggu ! Memperbaiki ... ok diperbaiki. Siapa yang akan berharap bahwa Jelly mengurai 0dan .45dari 0.45secara terpisah ... dan memilikinya sebagai keluaran juga.
Erik the Outgolfer
1

Sebenarnya , 16 byte

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

Cobalah online!

Penjelasan:

$'.'-(Æ'.@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
sumber
1
Mengungguli penciptanya, bagus.
Zacharý
@ Zacharý Ini hanya masalah pilihan algoritma.
Erik the Outgolfer
Dan Mego yang Anda kalahkan, tentu saja bukan Dennis :)
Zacharý
@ Zacharý Baiklah, dua kali dalam tantangan ini agar adil ...
Erik the Outgolfer
1

R, 51 47 72 byte

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

Saya suka RGperpustakaan.

Harus menambahkan 26 byte untuk memastikan daftar kosong itu benar-benar kosong.

               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

Contoh 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
BLT
sumber
baik, ada numeric(0)daftar numerik kosong atau list()atau NULL?
Giuseppe
Saya menempel pada perbaikan untuk membuatnya NULLtetapi sekarang saya yakin ada cara golf untuk melakukannya. Mungkin saya akan kembali ke sana.
BLT
1

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

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

Cobalah online!

Disimpan dua byte karena Dom mengingatkan saya tentang $ &

Penjelasan:

$_="[[$_]]";        # 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
sumber
Sudah sedikit bermain dengan ini dan menemukan memecahnya menjadi sedikit lebih pendek. Tidak yakin apakah Anda dapat menggabungkannya berdasarkan milik saya untuk menyusutkan milik Anda? 😊 Cobalah secara online!
Dom Hastings
1
Digunakan $ & dari milik Anda. Saya pikir keduanya pada dasarnya setara sekarang, kecuali bahwa saya menangani kasus "0,45" vs "45".
Xcali
Ahhh, ya, merindukan yang itu!
Dom Hastings
1

Perl 6 , 23 byte

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

Menguji

Diperluas

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

Perhatikan bahwa …».combprioritas lebih tinggi daripada+«…

Brad Gilbert b2gills
sumber
0

CJam , 13 byte

r'-'.er'./::~

Cobalah online!

Erik the Outgolfer
sumber
0

Perl 6 , 22 byte

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

Cobalah online!

Elemen-elemen dalam daftar yang dikembalikan adalah string, tetapi seperti normal untuk Perl, mereka dapat digunakan sebagai angka dan akan dikonversi secara implisit; mereka adalah "angka aktual" untuk semua tujuan praktis. Untuk memaksa mereka menjadi angka dalam representasi mereka yang paling langsung, kita hanya perlu mengawali isi blok kode dengan "+« "untuk tiga byte lagi.

Sean
sumber
Tantangannya secara spesifik menyatakan “ Digit harus berupa angka aktual, bukan string. “, Jadi mungkin harus dimasukkan.
Brad Gilbert b2gills
0

RUBY, 75 byte

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

Cobalah online!

Gregory
sumber
1
Bisakah Anda menghapus semua spasi putih itu?
TheLethalCoder
Yap, Anda benar, selesai!
Gregory
Sama dengan beberapa sintaks tweak: Coba online! (BTW, jika Anda menggunakan Header dan Footer pada TIO ukuran yang ditampilkan di sisi kanan Code akan menjadi ukuran sebenarnya dari solusi.)
manatwork
Tetap, terima kasih untuk semua info.
Gregory
Anda dapat bertukar .map{z|z.to_i}untuk.map &:to_i
Cyoce