คืนค่าแต่ละตัวเลขจากกลุ่มของตัวเลข


11

ความท้าทาย

โปรแกรมจะต้องส่งคืนตัวเลขทั้งหมดที่รวมอยู่ในกลุ่ม (ลำดับที่คั่นด้วยเครื่องหมายจุลภาคและเครื่องหมายขีดกลาง) ของตัวเลข

กฎระเบียบ

  • s เป็นสตริงลำดับ;
  • ตัวเลขทั้งหมดรวมอยู่ในsเป็นบวก ;
  • ตัวเลขจะเพิ่มขึ้น ;
  • ตัวเลขจะไม่ซ้ำ
  • เมื่อคุณตอบให้แสดงผลลัพธ์สำหรับ s="1,3-5,9,16,18-23"

ตัวอย่าง

input(s)    outputs
-----------------
1           1
1,2         1,2
1-4         1,2,3,4
1-4,6       1,2,3,4,6
1-4,8-11    1,2,3,4,8,9,10,11

โชคดี. =)


1
เราจะเคยมีลำดับการป้อนข้อมูลที่ไม่ได้รับอย่างต่อเนื่องเพิ่มขึ้นตัวอย่างเช่น: 4-9,1-2หรือ1-3,9-6?
แมตต์

1
หรือทับซ้อนกัน? ต้องเรียงลำดับผลลัพธ์และไม่มีรายการซ้ำหรือไม่?
Peter Taylor

@ กาเร็ ธ ใช่นี่เป็นโค้ดกอล์ฟแล้วกรุณาโหวตเพื่อคำตอบที่สั้นที่สุด แมตต์กับปีเตอร์ฉันแก้ไขคำถามโปรดตรวจสอบ ขอบคุณ!
BernaMariano

ต้องเป็นโปรแกรมเต็มรูปแบบและมีข้อ จำกัด ในรูปแบบของผลลัพธ์หรือไม่
Brad Gilbert b2gills

คำตอบ:


6

GolfScript (24 ตัวอักษร)

','/{~.,!{~)),>~}*}%','*

เช่น

$ golfscript.rb expand.gs <<<"1,3-5,9,16,18-23"
1,3,4,5,9,16,18,19,20,21,22,23

จริง ๆ แล้วฉันมีโซลูชั่น 24 ถ่านสี่ตัว แต่ฉันเลือกอันนี้เพราะมันไม่มีตัวอักษรและตัวเลข

มันทำงานอย่างไร

# On the stack: a string such as "1,3-5,9,16,18-23"
','/
# Split on commas to get ["1" "3-5" "9" "16" "18-23"]
{
    # This is executed for each of those strings in a map
    # So stack holds e.g. "1" or "3-5"

    # Evaluate the string.
    # If it's a single number, this puts the number on the stack.
    # Otherwise it's parsed as a positive number followed by a negative number.
    ~
    # Stack holds e.g. 1 or 3 -5
    # Duplicate the last element on the stack and make a list of that length.
    # If it's negative or zero, the list will be empty
    .,
    # Negate. An empty list => 1; a non-empty list => 0
    !
    # If the string was a single number "n", the stack now holds n 0
    # If the string was a range "m-n", the stack now holds m -n 1
    # The following block will be executed 0 times for "n" and once for "m-n"
    {
        # Here we rely on twos-complement numbers satisfying ~n = -n -1
        # Stack: m -n
        ~))
        # Stack: m -(-n)-1+2  =  m n+1
        ,
        # Stack: m [0 1 2 ... n]
        >
        # Stack: [m m+1 ... n]
        ~
        # Stack: m m+1 ... n
    }*
}%
# On the stack: e.g. [1 3 4 5 9 16 18 19 20 21 22 23]
','*
# Joined by , to give the desired output

คุณจะขยาย 3-5 เป็น 3,4,5 โดยไม่ต้องใช้ตัวละครเดียวได้-อย่างไร
BernaMariano

@BernaMariano ขออภัยฉันคิดถึงคำถามของคุณ ฉันจะขยายคำตอบด้วยคำอธิบายโดยละเอียด
ปีเตอร์เทย์เลอร์

7

Perl 25 26 25

$_ เป็นสตริงลำดับ

s/-/../g;$_=join",",eval

ตัวอย่างเซสชั่น:

[~/] $ perl -M5.010 -pe 's/-/../g;$_=join",",eval' <<< "1,3-5,9,16,18-23"
1,3,4,5,9,16,18,19,20,21,22,23

เพิ่ม 1 ตัวละครในการนับตัวละครสำหรับตัวเลือก (ขอบคุณ Gareth, ..kinda)-n-p


ฉันอาจทำการนับตัวอักษรผิด (ด้วยตัวเลือกบรรทัดคำสั่ง) โปรดแก้ไขการนับของฉันด้วย
ardnew

โดยคำตอบสำหรับคำถามนี้ในเมตาดาต้าคุณจะต้องเพิ่ม 1 ตัวอักษรสำหรับnตัวเลือกเท่านั้น
Gareth

ลบ-M5.010และแลกเปลี่ยน-eสำหรับ-E
Brad Gilbert b2gills

4

golfscript, 46 45

โปรแกรมสคริปต์กอล์ฟครั้งแรกของฉันใช้เวลาหลายชั่วโมงกว่าจะเสร็จ

{','/{'-'/{~}%.,1-{))+{,}/\-~}{~}if}%","*}:r; 

# call:
"1,3-5,9,16,18-23"r

# return:
1,3,4,5,9,16,18,19,20,21,22,23

คุณสามารถลองได้ที่http://golfscript.apphb.com/

สิ่งที่ดีที่สุดของฉันในการอธิบายความโหดร้ายนี้:

{...}:r;     # makes a function block ... and names it r

','/         # slices the top element of stack from each ','
             # so we get ["1" "3-5" "9" "16" "18-23"]

{...}%       # makes a function block ... and calls it for 
             # each element in the list

'-'/{~}%     # slices the list by '-' and evals each element 
             # from string to int. ["1"] becomes [1], 
             # ["3-5"] becomes [3 5]

.,1-         # adds the length of the list -1 on top of the stack
             # so for [1] the stack becomes [1] 0, for [3 5]
             # it becomes [3 5] 1

# next we add two function blocks, they, like the 0/1 just before
# are used by an if clause a tiny bit later. First block is for 
# lists that have a 1 on top of them, the latter for ones with 0.

# First block, we have something like [3 5]

))+          # pops the top element of the array, increments 
             # it and puts back. [3 6]

## It seems {...}%~ is same as {...}/
## this is why these two are not in the code any more

{,}%         # , makes a list from 0 to n-1, where n is the parameter
             # so we get [[0 1 2] [0 1 2 3 4 5]]

~            # Dumps the outer array, [0 1 2] [0 1 2 3 4 5]

\            # swaps the two arrays

-            # set complement [3 4 5]

~            # dumps the array, so the elements are left in the stack

# Second block, we have something like [16]

~            # just dumps the array, 16

# Blocks end

if           # takes the top three elements of the stack, evaluates the 
             # first (0 or 1), runs second if true (anything but 
             # [], "", 0 or {} ), otherwise the third.

","*         # joins an array with ","

แก้ไข 1:เปลี่ยน {}% ~ ~ เป็น {} / ครั้งล่าสุดและคำอธิบายของฉันอาจผิดไปด้วย


2
+1 เพราะทุกคนที่ทำโปรแกรมใน GolfScript ได้รับมัน
Gareth

@ Gareth ขอบคุณ ฉันแรกคิดว่าฉันแค่ทำมัน perl วิธี: เปลี่ยน - เพื่อ .. และประเมินมัน จากนั้นฉันไม่พบวิธีที่มีเหตุผลในการสร้างอาร์เรย์ดังนั้นฉันจึงทำสิ่งนี้ ฉันแน่ใจว่าบางคนจะมาพร้อมกับวิธีแก้ปัญหาถ่านประมาณ 20 รายการกับ golfscript
shiona

ฉันมี 24 ในขณะนี้ดังนั้นฉันจะใช้เวลา 20 เป็นความท้าทาย;) คุณสามารถบันทึกได้ค่อนข้างง่าย ปัญหาถามสำหรับโปรแกรมที่ไม่ได้ฟังก์ชั่นเพื่อให้คุณสามารถสูญเสียครั้งแรก{และครั้งสุดท้าย}:r;และคุณยังสามารถบันทึกหนึ่งโดยการแทนที่ด้วย1- ((บังเอิญ, IIRC เป็นเคล็ดลับอย่างหนึ่งที่ฉันพลาดในโปรแกรม GolfScript ครั้งแรกของฉัน)
Peter Taylor

PS มีความแตกต่างที่ลึกซึ้งระหว่างเป็นและ{...}%~ {...}/หากคุณกำลังเข้าถึงบางสิ่งบางอย่างที่ต่ำลงโดยใช้สแต็กinteger $คนแรกนั้นง่ายกว่าเพราะคุณไม่ต้องปรับจำนวนเต็มในแต่ละครั้งเพื่อชดเชยสิ่งที่คุณทิ้งไว้บนสแต็ก
Peter Taylor

4

R , 44 ไบต์

`-`=seq;eval(parse(t=c("c(",scan(,""),")")))

ลองออนไลน์!

กำหนดใหม่-เป็นค่าเฉลี่ยseq(เช่น:) ล้อมรอบอินพุตด้วยc()และประเมินค่านิพจน์ที่สอดคล้องกัน


3

K, 47

","/:,/${x+!1+y-x}.'2#'a,'a:"I"$'"-"\:'","\:0:0

กรณีทดสอบ

k)","/:,/${x+!1+y-x}.'2#'a,'a:"I"$'"-"\:'","\:0:0
1,3-5,9,16,18-23
"1,3,4,5,9,16,18,19,20,21,22,23"

","/:$,/{{x+!1+y-x}. 2#"J"$"-"\:x}'","\:0:0สำหรับ43 ไบต์
streetster

3

เยลลี่ขนาด 9 ไบต์

⁾-ryṣ”,VF

ลองออนไลน์!

   y         Replace
⁾-r          hyphens with the letter r,
    ṣ”,      split on commas,
       V     evaluate every element,
        F    and flatten.

ช่วง dyad rใช้เวลาสองข้อโต้แย้งที่ด้านข้างของมันทั้งสองและสร้างช่วงรวมระหว่างพวกเขา


2

J, 53 43 41 39 38 ตัวอักษร

;(}.[:i.1+])/&.>".'- ,;'charsub 1!:1[1

รับอินพุตจากคีย์บอร์ด:

   ;(}.[:i.1+])/&.>".'- ,;'charsub 1!:1[1
1-4,8-11
1 2 3 4 8 9 10 11

เอาต์พุตสำหรับกรณีทดสอบที่ร้องขอ:

   ;(}.[:i.1+])/&.>".'- ,;'charsub 1!:1[1
1,3-5,9,16,18-23
1 3 4 5 9 16 18 19 20 21 22 23

2

ฮัสเซียม , 173 ไบต์

นี่เป็นเวลานานและอาจจะไม่สามารถแข่งขันได้เนื่องจากมีท้ายที่สุด

 func main(){p="1,2,3,5-8".split(",")for(c=0;c<p.length;c++){e=p[c]if(e.contains("-")){p=e.split("-")for(x=p[0].toInt();x<=p[1].toInt()print(x++ +",")){}}else print(e+",")}}

เรียกใช้ออนไลน์และดูการขยายที่นี่



1

Python 2.7, 147 138 ไบต์

Z, f = อินพุต. () แยก ( '') []
สำหรับฉันใน z:
 x = i.split ( '-')
 ถ้า len (x)> 1: f + = range (int (x [0]), int (x [1]) + 1)
 อื่น: f + = [int (x [0])]
พิมพ์ str (f) [1: -1]

การใช้งาน:

>>> python nums.py
"1,3-5,9,16,18-23"
1, 3, 4, 5, 9, 16, 18, 19, 20, 21, 22, 23

ไม่ใช่โปรแกรมที่ดีที่สุด ...


1
ยินดีต้อนรับสู่ PPCG ฉันคิดว่าคุณสามารถทำให้คำตอบสั้นลงโดยใช้ 1 ช่องว่างสำหรับการเยื้อง
intrepidcoder

ขอบคุณ @intrepidcoder ฉันไม่รู้ว่าคุณสามารถใช้การเว้นวรรคเดียวได้
อเล็กซ์

1

MATLAB, 47 ไบต์

disp(eval(['[',strrep(input(''),'-',':'),']']))

ตัวอย่างนี้อ่านอินพุตสตริงจากหน้าต่างคำสั่งแทนที่ '-' โดย ':', เพิ่มวงเล็บเหลี่ยมให้กับสตริงแล้วประเมินค่าเพื่อให้อินพุตถูกขยายเป็นตัวเลขเต็ม

อินพุตตัวอย่าง:

'1,3-5,9,16,18-23'

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

1     3     4     5     9    16    18    19    20    21    22    23

ฉันเชื่อว่าผลลัพธ์นี้ได้รับอนุญาตเนื่องจากความท้าทายบอกเพียงว่าตัวเลขทั้งหมดในกลุ่มควรแสดง


คั่นด้วยเครื่องหมายจุลภาคการส่งออกจะดีกว่า แต่ฉันสามารถ SE 5 ช่องว่างที่คั่นรูปแบบ thats เย็นฉัน :)
BernaMariano


1

PowerShell, 79 71 ไบต์

('('+($args[0]-replace'-','..'-replace',','),(')+')'|iex|%{$_})-join','

ลองออนไลน์!

ส่วนภายในเปลี่ยน "1,5-9,12" เป็นรูปแบบ "(1), (5..9), (12)" ที่ PowerShell เข้าใจแล้วดำเนินการกับ iex ซึ่งสร้างอาร์เรย์ของอาร์เรย์ จากนั้นวนซ้ำแต่ละอาร์เรย์ภายในแล้วเข้าร่วมองค์ประกอบอาร์เรย์ด้านนอกทั้งหมดเข้าด้วยกัน

รหัสยืมจากคำตอบ "ช่วยฉันจัดการเวลาของฉัน"

การใช้

PS C:\Tools\Scripts\golfing> .\return-each-number-from-a-group-of-numbers.ps1 '1,3-5,9,16,18-23'
1,3,4,5,9,16,18,19,20,21,22,23

-8 ไบต์ขอบคุณ Veskah



1

K (oK) , 40 31 ไบต์

วิธีการแก้

,/{{x+!1+y-x}. 2#.:'"-"\x}'","\

ลองออนไลน์!

คำอธิบาย:

จัดการกอล์ฟให้มากขึ้นพร้อมกับเพิ่มคำอธิบาย ...

,/{{x+!1+y-x}. 2#.:'"-"\x}'","\ / the solution
                           ","\ / split input on ","
  {                      }'     / apply lambda to each
                    "-"\x       / split x on "-"
                 .:'            / value (.:) each (')
               2#               / 2 take (dupe if only 1 element)
   {        }.                  / diadic lambda, 2 args x and y
         y-x                    / y subtract x
       1+                       / add 1
      !                         / range 0..n
    x+                          / add x
,/                              / flatten

0

Clojure 110 ไบต์

#(clojure.string/join","(for[s(.split %",")[a b][(map read-string(.split s"-"))]r(if b(range a(inc b))[a])]r))

การจัดการกับสตริงไม่ใช่เรื่องสนุกมาก :(




0

Japt , 12 ไบต์

q, c@OvXr-'ò

ลองมัน


คุณสามารถแทนที่c@ด้วย£?
Oliver

@Oliver เนื่องจากมันเป็นความท้าทายแบบเก่าที่ไม่ได้ระบุรูปแบบ I / O ของมันฉันจึงลบความระมัดระวังโดยป้อนข้อมูลเป็นสตริงที่คั่นด้วยจุลภาคและส่งออกเป็นอาร์เรย์ที่มีการแบน โดยปกติแล้วใช่ฉันจะระบุอินพุตเป็นอาร์เรย์ของสตริงเอาต์พุตเป็นอาร์เรย์หลายมิติและใช้£แทน5ไบต์แรก
Shaggy

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