ฟังตัวเลข


19

กำหนดจำนวนจริงให้แปลงเป็นรายการโดยมีเครื่องหมายลบ (ถ้ามี) กลายเป็นรายการว่างส่วนจำนวนเต็มกลายเป็นรายการของตัวเลขและส่วนที่เป็นเศษส่วน (ถ้ามี) กลายเป็นรายการของตัวเลข ตัวเลขต้องเป็นตัวเลขจริงไม่ใช่สตริง

ตัวอย่าง

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


ตัวเลขในอาร์เรย์ที่อนุญาตให้เป็นสตริงอักขระเดี่ยว?
dzaima

@dzaima ไม่ฉันจะเพิ่มมัน
Adám

สามารถนำจำนวนเป็นสตริงได้หรือไม่?
Uriel

@Uriel หากคุณได้รับข้อมูลจาก STDIN แล้วใช่ (ไม่มีความแตกต่าง) หากเป็นข้อโต้แย้งไม่ฉันคิดว่า ฉันทามติ Meta อะไร
Adám

2
@Quelklef ใช่จริงแล้ว มันเป็นผลมาจากการอภิปรายการออกแบบยาวคุณสามารถดูที่นี่เกี่ยวกับl(listify) คำสั่งของtotallyhuman 's ภาษา WIP, Intrnt
Adám

คำตอบ:


7

C #, 60 66 ไบต์

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

ลองออนไลน์!


ไม่มีวงเล็บด้านนอกที่มองเห็นได้ ผลลัพธ์ของคุณเป็นรายการจริงหรือไม่?
Adám

@ Adám Yeah ( IEnumerable<char[]>) เป็นเพียงรหัสการพิมพ์ที่ไม่ได้เพิ่มไว้
TheLethalCoder

@TheLethalCoder ข้อกำหนดระบุว่าประเภทส่งคืนที่ต้องการคือรายการของตัวเลขเป็นตัวเลขไม่ใช่สตริงหรือตัวอักษรที่แสดงตัวเลขเหล่านั้น
Kamil Drakari

@KamilDrakari โอ้ไม่เห็นสเป็คที่ได้รับการปรับปรุง ...
TheLethalCoder

@ KamilDrakari แก้ไขขอบคุณที่แจ้งให้เราทราบเกี่ยวกับการปรับปรุง
TheLethalCoder

7

JavaScript (ES6), 33 44 43 41 ไบต์

รับอินพุตเป็นสตริง เสียสละ11 10 ไบต์แปลงองค์ประกอบในผลลัพธ์เป็นตัวเลขหลังจากข้อมูลจำเพาะของความท้าทายได้รับการอัพเดต

s=>s.split(/\D/).map(a=>[...a].map(eval))
  • บันทึกขอบคุณไบต์Arnauldevalข้อเสนอแนะของการใช้

ทดสอบมัน

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


คำอธิบาย

s=>

sฟังก์ชั่นที่ไม่ระบุชื่อการสตริงเป็นอาร์กิวเมนต์ผ่านพารามิเตอร์
"-123.45"

s.split(/\D/)

ใช้ RegEx เพื่อแยกสตริงเป็นอาร์เรย์ในอักขระที่ไม่ใช่ตัวเลขทั้งหมด - เช่น-และ.
["","123","45"]

.map(a=>)

aแผนที่มากกว่าอาร์เรย์ผ่านแต่ละสายฟังก์ชั่นผ่านทางพารามิเตอร์

[...a]

แยกเป็นอาร์เรย์ของสตริงอักขระแต่ละตัว
[[],["1","2","3"],["4","5"]]

.map(eval)

แม็พเหนือ subarray และevalแต่ละสตริงซึ่งแปลงเป็นจำนวนเต็ม
[[],[1,2,3],[4,5]]


อาร์เรย์ 2 มิติของสตริง? JSON มีลักษณะอย่างไร
อดัม

ตัวเลขต้องเป็นตัวเลข
อดัม

@ Adám: อัปเดตที่ราคา 11 ไบต์
Shaggy


5

เยลลี่ ,  13  10 ไบต์

ŒṘµ<”/œpV€

ลิงก์ monadic ที่ใช้ตัวเลขและส่งคืนรายการผลลัพธ์ของตัวเลข

ลองออนไลน์! (ส่วนท้ายเพียงแค่พิมพ์ตัวแทนหลามที่จะแสดงทุกรายการที่เกิดขึ้นจริง)
... หรือดูชุดทดสอบ

อย่างไร?

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

และอีกครั้งเยลลี่ก็ดีกว่า 05AB1E!
Erik the Outgolfer

4

05AB1E , 12 11 ไบต์

ขอบคุณRileyสำหรับการบันทึกไบต์ รหัส:

'-'.:'.¡εSï

ใช้การเข้ารหัส05AB1E ลองออนไลน์!

คำอธิบาย:

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

คุณต้องการเทคนิคïหรือไม่
Magic Octopus Urn

@MagicOctopusUrn OP กล่าวThe digits must be actual numbers, not strings.
dzaima

1
นั่นเป็นความอัปยศฉันคิดว่า„-.S€¡สำหรับ 6 แต่ถ้าพวกเขาต้อง ints ... ไม่แน่ใจ
Magic Octopus Urn

3

Python 2 , 59 ไบต์

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

ลองออนไลน์!

-5 ไบต์จาก Felipe Nardi Batista


ในผลลัพธ์ที่สามของคุณ[[[1, 2, 3], [4, 5]]]จะมีรายการนอกเพิ่มเติม
เฟลิปาร์มาดิบาติสตา

คงที่และยังคงใช้ลิงค์
Felipe Nardi Batista

1
คุณสามารถไปที่ 59 bytes ถ้าคุณเปลี่ยนด้านนอกของคุณmapด้วย list comprehension: link
Felipe Nardi Batista

2

ที่จริงแล้ว 23 ไบต์

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

ลองออนไลน์!

คำอธิบาย:

'.@;)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 ไบต์

Ζ-.ŗ .Θ⌡č¹r

ลองที่นี่!

ส่งออกไปที่ด้านบนของสแต็ก (เพราะ SOGL แปลงเป็นสตริงหลายบรรทัดเพราะสร้างขึ้นเพื่อ ASCII-art) หากต้องการดูผลลัพธ์ให้ดูในคอนโซลหลัง`r`@10:(วงเล็บด้านนอกเป็นอาร์เรย์อาร์เรย์) หรือเพียงต่อท้ายοø∑โค้ด

Ζ-.ŗ         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 ไบต์

รับอินพุตเป็นสตริง

q\D ®¬®n

ทดสอบ ( -Qตั้งค่าสถานะเพื่อการสร้างภาพข้อมูลเท่านั้น)

  • 2 ไบต์บันทึกขอบคุณที่จัสติน
  • บันทึก 2 ไบต์ด้วย ETH

คำอธิบาย

Uการป้อนข้อมูลโดยนัยของสตริง

q\D

ใช้ RegEx เพื่อแยก ( q) ให้กับอาร์เรย์สำหรับอักขระที่ไม่ใช่ตัวเลขทั้งหมด

®

แผนที่เหนืออาร์เรย์

¬

แยกแต่ละสตริงเป็นอาร์เรย์ของอักขระแต่ละตัว

®

แผนที่เหนืออาร์เรย์

n

แปลงเป็นจำนวนเต็ม


2
คุณแยกไม่ได้\Dเพราะไม่ใช่แค่ตัวเลขเท่านั้น.และ-?
Justin Mariner

ส่วนที่ดีที่สุดคือคุณไม่จำเป็นต้องใช้/s :-)
ETHproductions

@ ETHproductions: ตอนนี้มันน่ารักดี ฉันคิดว่าฉันอาจจะไม่สามารถปิดได้/โดยไปที่ multiline ฉันไม่เคยคิดจะพยายามละเว้นทั้งสองอย่าง
Shaggy

1

อ็อกเทฟ 54 ไบต์

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

ฟังก์ชั่นไม่ระบุชื่อที่ใช้ตัวเลขเป็นอินพุตและสร้างอาร์เรย์เซลล์ของเวกเตอร์ตัวเลข

ลองออนไลน์!

คำอธิบาย

@(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 ไบต์

น่าจะลงสนามได้สักหน่อย ...

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

ลองออนไลน์!


ฉันคิดว่าคุณสามารถบันทึกไม่กี่ไบต์โดยทำ#define P printf(แล้วละเว้นวงเล็บในการPโทร
Cyoce

1

เยลลี่ 12 ไบต์

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

ลองออนไลน์!


ใช่ฉันพยายามเช่นกันตอนนี้ฉันเพิ่งอายุ 13 ปี (ฉันจะโพสต์ แต่คิดว่ามันต้องสั้นกว่า) แทนที่จะ0.45ส่งกลับ(ชนกับ)[[],[4,5][[0],[4,5]]-45
Jonathan Allan

@ โจนาธานอัลใช่แน่นอน ... ไม่แน่ใจว่าฉันได้รับที่? โอ้เดี๋ยวก่อน! กำลังแก้ไข ... ตกลง ใครจะคาดหวังว่า Jelly แยกวิเคราะห์0และ.45การ0.45แยก ... และมีมันเป็นผลผลิตที่มากเกินไป
Erik the Outgolfer

1

จริงแล้ว 16 ไบต์

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

ลองออนไลน์!

คำอธิบาย:

$'.'-(Æ'.@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
แซงหน้าผู้สร้าง
Zacharý

@ Zacharýมันเป็นเพียงเรื่องของการเลือกอัลกอริทึม
Erik the Outgolfer

และมันคือเมก้าที่คุณชนะไม่ใช่เดนนิสแน่นอน :)
Zacharý

@ Zachary ดีครั้งที่สองในความท้าทายนี้จะเป็นธรรม ...
เอริก Outgolfer

1

R, 51 47 72 ไบต์

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

ฉันรักRGห้องสมุด

ต้องเพิ่ม 26 ไบต์เพื่อให้แน่ใจว่ารายการว่างเปล่าจริง ๆ แล้ว

               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

ตัวอย่างผลลัพธ์:

> 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

ดีมีnumeric(0)สำหรับรายการตัวเลขที่ว่างเปล่าหรือlist()หรือNULL?
Giuseppe

ฉันพยายามแก้ไขมันNULLแต่ตอนนี้ฉันมั่นใจว่ามีวิธีการเล่นกอล์ฟที่ดีกว่า บางทีฉันจะกลับมา
BLT

1

Perl 5 , 56 54 + 1 (-p) = 55 ไบต์

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

ลองออนไลน์!

บันทึกสองไบต์เนื่องจาก Dom เตือนฉันเกี่ยวกับ $ &

คำอธิบาย:

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

ลองเล่นกับสิ่งนี้และพบว่ามันพังทลายลงให้สั้นลงเล็กน้อย ไม่แน่ใจว่าคุณจะรวมมันเข้ากับของฉันเพื่อลดขนาดของคุณลงได้ไหม? 😊 ลองออนไลน์!
Dom Hastings

1
ใช้ $ & จากของคุณ ฉันคิดว่าทั้งสองมีความเท่าเทียมกันในขณะนี้ยกเว้นว่าฉันจะจัดการกับ ".45" กับกรณี "45"
Xcali

Ahhh ใช่พลาดที่หนึ่ง!
Dom Hastings

1

Perl 6 , 23 ไบต์

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

ทดสอบมัน

ขยาย

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

โปรดทราบว่า…».combมีความสำคัญสูงกว่า+«…





0

Perl 6 , 22 ไบต์

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

ลองออนไลน์!

องค์ประกอบในรายการที่ส่งคืนเป็นสตริง แต่ตามปกติสำหรับ Perl พวกเขาสามารถใช้เป็นตัวเลขและจะถูกแปลงโดยปริยาย พวกเขาคือ "ตัวเลขจริง" เพื่อการใช้งานจริงทั้งหมด เพื่อบังคับให้พวกเขาเป็นตัวเลขในการเป็นตัวแทนในทันทีพวกเขาต้องการเพียงส่วนนำหน้าเนื้อหาของรหัสบล็อกด้วย "+ «" อีกสามไบต์


ความท้าทายโดยเฉพาะระบุว่า“ ตัวเลขต้องเป็นตัวเลขจริงไม่ใช่สตริง ” ดังนั้นควรรวมอยู่ด้วย
แบรดกิลเบิร์ต b2gills

0

RUBY, 75 ไบต์

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

ลองออนไลน์!


1
คุณสามารถลบพื้นที่ว่างทั้งหมดนั้นได้หรือไม่?
TheLethalCoder

ใช่คุณพูดถูก!
เกรกอรี่

เช่นเดียวกันกับการปรับแต่งทางไวยากรณ์: ลองออนไลน์! (BTW ถ้าคุณใช้ Header และ Footer บน TIO ขนาดที่แสดงทางด้านขวาของ Code จะเป็นขนาดที่แท้จริงของการแก้ปัญหา)
manatwork

แก้ไขขอบคุณสำหรับข่าวสารทั้งหมด
เกรกอรี่

คุณสามารถแลกเปลี่ยน.map{z|z.to_i}เพื่อ.map &:to_i
Cyoce
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.