Liệt kê một số


19

Cho một số thực, chuyển đổi nó thành một danh sách các danh sách, với dấu âm (nếu có) trở thành một danh sách trống, phần nguyên trở thành một danh sách các chữ số và phần phân số (nếu có) trở thành một danh sách các chữ số. Các chữ số phải là số thực tế, không phải là chuỗi.

Ví dụ

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


các chữ số trong mảng được phép là chuỗi char đơn?
dzaima

@dzaima Không. Tôi sẽ thêm nó.
Adám

số có thể được lấy dưới dạng một chuỗi?
Uriel

@Uriel Nếu bạn nhận được đầu vào từ STDIN thì có (không có sự khác biệt). Nếu như là tranh luận, không, tôi nghĩ. Dù đồng thuận Meta là gì.
Adám

2
@Quelklef Vâng, trên thực tế. Đó là kết quả của một cuộc thảo luận thiết kế dài , bạn có thể xem tại đây về l(listify) lệnh của totallyhuman ngôn ngữ WIP 's, Intrnt .
Adám

Câu trả lời:


7

C #, 60 66 byte

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

Hãy thử trực tuyến!


Không có dấu ngoặc bên ngoài có thể nhìn thấy. Là kết quả của bạn thực sự liệt kê?
Adám

@ Adám Yeah ( IEnumerable<char[]>) chỉ là mã in không thêm chúng vào.
TheLethalCoder

@TheLethalCoder Trạng thái yêu cầu cho biết loại trả về được yêu cầu là danh sách các chữ số dưới dạng số, không phải chuỗi hoặc ký tự hiển thị các số đó.
Kamil Drakari

@KamilDrakari Oh không thấy thông số kỹ thuật đã được cập nhật ...
TheLethalCoder

@KamilDrakari Đã sửa, cảm ơn vì đã cho tôi biết về bản cập nhật.
TheLethalCoder

7

JavaScript (ES6), 33 44 43 41 byte

Đưa đầu vào dưới dạng một chuỗi. Hy sinh 11 10 byte chuyển đổi các phần tử trong đầu ra thành số sau khi thông số thử thách được cập nhật.

s=>s.split(/\D/).map(a=>[...a].map(eval))
  • Đã lưu một byte nhờ vào gợi ý sử dụng của Arnauldeval .

Kiểm tra nó

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


Giải trình

s=>

Hàm ẩn danh lấy chuỗi làm đối số thông qua tham số s.
"-123.45"

s.split(/\D/)

Sử dụng RegEx để phân chia chuỗi thành một mảng trên tất cả các ký tự không có chữ số - nghĩa là -.
["","123","45"]

.map(a=>)

Ánh xạ qua mảng, truyền từng chuỗi cho một hàm thông qua tham số a.

[...a]

Chia thành một chuỗi các chuỗi ký tự riêng lẻ.
[[],["1","2","3"],["4","5"]]

.map(eval)

Ánh xạ qua subarray và evalmỗi chuỗi, chuyển đổi nó thành một số nguyên.
[[],[1,2,3],[4,5]]


Mảng 2D của chuỗi? JSON trông như thế nào?
Adám

Chữ số phải là số.
Adám

@ Adám: Đã cập nhật, với chi phí 11 byte.
Xù xì


5

Thạch ,  13  10 byte

ŒṘµ<”/œpV€

Một liên kết đơn âm lấy một số và trả về danh sách kết quả của danh sách các số.

Hãy thử trực tuyến! (chân trang chỉ in đại diện python để hiển thị tất cả các danh sách thực tế)
... hoặc xem bộ thử nghiệm .

Làm sao?

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

Và một lần nữa Jelly tốt hơn 05AB1E!
Erik the Outgolfer 27/07/17

4

05AB1E , 12 11 byte

Cảm ơn Riley vì đã tiết kiệm một byte. Mã số:

'-'.:'.¡εSï

Sử dụng mã hóa 05AB1E .Hãy thử trực tuyến!

Giải trình:

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

Bạn có cần kỹ thuật ïkhông?
Bạch tuộc ma thuật Urn

@MagicOctopusUrn OP đã nóiThe digits must be actual numbers, not strings.
dzaima

1
Đó là một sự xấu hổ, tôi đã nghĩ: „-.S€¡cho 6, nhưng nếu họ phải ... không chắc chắn.
Bạch tuộc ma thuật Urn

3

Python 2 , 59 byte

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

Hãy thử trực tuyến!

-5 byte từ Felipe Nardi Batista


trong đầu ra thứ ba của bạn [[[1, 2, 3], [4, 5]]]có thêm một danh sách bên ngoài
Felipe Nardi Batista

đã sửa và vẫn sử dụng liên kết
Felipe Nardi Batista

1
bạn có thể nhận được tới 59 byte nếu bạn thay đổi bên ngoài mapbằng cách hiểu danh sách: liên kết
Felipe Nardi Batista

2

Trên thực tế , 23 byte

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

Hãy thử trực tuyến!

Giải trình:

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

Hãy thử nó ở đây!

Đầu ra đến đỉnh của ngăn xếp (vì SOGL chuyển đổi nó thành một chuỗi nhiều dòng vì nó được tạo ra cho ascii-art). Để xem kết quả, hãy xem trong bảng điều khiển sau `r`@10:(dấu ngoặc ngoài là mảng ngăn xếp) hoặc chỉ nối thêm οø∑sau mã

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

Đưa đầu vào dưới dạng một chuỗi.

q\D ®¬®n

Kiểm tra nó ( -Qcờ cho mục đích trực quan hóa.)

  • 2 byte được lưu nhờ Justin .
  • Lưu 2 byte nhờ ETH.

Giải trình

Đầu vào ngầm định của chuỗi U.

q\D

Sử dụng RegEx để phân chia ( q) thành một mảng trên tất cả các ký tự không có chữ số.

®

Bản đồ trên mảng.

¬

Tách mỗi chuỗi thành một mảng các ký tự riêng lẻ.

®

Bản đồ trên mảng.

n

Chuyển đổi sang số nguyên.


2
Bạn không thể tách ra \D, vì các chữ số duy nhất sẽ là .-?
Justin Mariner

Phần tốt nhất là, bạn thậm chí không cần /s :-)
ETHproductions

@ETHproductions: Bây giờ, điều đó khá ngọt ngào. Tôi nghĩ rằng tôi có thể đã bỏ qua việc đóng cửa /bằng cách đi nhiều dòng. Tôi chưa bao giờ cân nhắc việc cố gắng bỏ qua cả hai.
Xù xì

1

Octave , 54 byte

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

Hàm ẩn danh lấy một số làm đầu vào và tạo ra một mảng ô của các vectơ số.

Hãy thử trực tuyến!

Giải trình

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

Có thể đánh gôn xuống một chút ...

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

Hãy thử trực tuyến!


Tôi nghĩ rằng bạn có thể lưu một vài byte bằng cách thực hiện #define P printf(và sau đó bỏ dấu ngoặc trong các Pcuộc gọi
Cyoce

1

Thạch , 12 byte

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

Hãy thử trực tuyến!


Vâng tôi cũng đã thử điều đó, hiện tại tôi chỉ có 13 (tôi sẽ đăng nó nhưng nghĩ rằng nó phải có thể ngắn hơn) 0.45trả về [[],[4,5]thay vì [[0],[4,5]](nó va chạm với -45)
Jonathan Allan

@Jonathan ALLan Oh yeah thực sự ... không chắc tôi đã lấy nó ở đâu? Đợi đã, nó ! Sửa ... ok sửa. Ai sẽ hy vọng rằng Jelly phân tích các 0.45của 0.45riêng ... và có nó như là đầu ra quá.
Erik the Outgolfer 27/07/17

1

Trên thực tế , 16 byte

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

Hãy thử trực tuyến!

Giải trình:

$'.'-(Æ'.@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
Vượt xa người sáng tạo, tốt đẹp.
Zacharý

@ Zacharý Đó chỉ là vấn đề lựa chọn thuật toán.
Erik the Outgolfer 27/07/17

Và đó là Mego bạn đánh bại, không phải Dennis tất nhiên :)
Zacharý

@ Zacharý Chà, hai lần trong thử thách này là công bằng ...
Erik the Outgolfer 27/07/17

1

R, 51 47 72 byte

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

Tôi yêu RGthư viện.

Phải thêm 26 byte để đảm bảo danh sách trống thực sự trống.

               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

Ví dụ đầu ra:

> 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

tốt, có numeric(0)một danh sách số trống hay list()hay NULL?
Giuseppe

Tôi đã khắc phục một bản sửa lỗi để thực hiện NULLnhưng bây giờ tôi chắc chắn có một cách tốt hơn để làm điều đó. Có lẽ tôi sẽ quay lại với nó.
BLT

1

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

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

Hãy thử trực tuyến!

Đã lưu hai byte do Dom nhắc nhở tôi về $ &

Giải trình:

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

Có một chút chơi với điều này và thấy việc phá vỡ nó sẽ ngắn hơn một chút. Không chắc chắn nếu bạn có thể kết hợp nó dựa trên của tôi để thu nhỏ của bạn xuống? 😊 Thử trực tuyến!
Dom Hastings

1
Được sử dụng $ & từ của bạn. Tôi nghĩ hiện tại hai cái này tương đương nhau, ngoại trừ việc tôi xử lý trường hợp ".45" so với "45".
Xcali

Ahhh, yeah, đã bỏ lỡ cái đó!
Dom Hastings

1

Perl 6 , 23 byte

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

Kiểm tra nó

Mở rộng

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

Lưu ý rằng đó …».comblà một ưu tiên cao hơn+«…





0

Perl 6 , 22 byte

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

Hãy thử trực tuyến!

Các phần tử trong danh sách được trả về là các chuỗi, nhưng như bình thường đối với Perl, chúng có thể được sử dụng dưới dạng số và sẽ được chuyển đổi hoàn toàn; chúng là "con số thực tế" cho tất cả các mục đích thực tế. Để buộc chúng là các số trong biểu diễn trực tiếp nhất của chúng, người ta chỉ cần tiền tố nội dung của khối mã với "+« "cho ba byte nữa.


Thách thức nêu rõ cụ thể Các chữ số phải là số thực, không phải là chuỗi. Vì vậy, có lẽ nên được bao gồm.
Brad Gilbert b2gills

0

RUBY, 75 byte

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

Hãy thử trực tuyến!


1
Bạn có thể loại bỏ tất cả khoảng trắng đó?
TheLethalCoder

Đúng, bạn đã đúng, đã hoàn tất!
Gregory

Tương tự với một số điều chỉnh cú pháp: Hãy thử trực tuyến! (BTW, nếu bạn sử dụng Header và Footer trên TIO, kích thước được hiển thị ở bên phải của Code sẽ là kích thước thực của giải pháp.)
manatwork 28/07/17

Đã sửa, cảm ơn vì tất cả các infos.
Gregory

Bạn có thể trao đổi .map{z|z.to_i}cho.map &:to_i
Cyoce
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.