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


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!


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


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)

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

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


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)

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

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.


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

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!


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!


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

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

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

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





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.


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!


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.