Trả về mỗi số từ một nhóm số


11

Các thách thức

Chương trình phải trả về tất cả các số được bao gồm trong một nhóm (chuỗi được phân tách bằng dấu phẩy và dấu gạch nối).

Quy tắc

  • s là chuỗi chuỗi;
  • tất cả các số bao gồm stích cực ;
  • số lượng sẽ luôn tăng ;
  • những con số sẽ không bao giờ lặp lại
  • Khi bạn trả lời, hiển thị đầu ra cho s="1,3-5,9,16,18-23"

Ví dụ

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

Chúc may mắn. =)


1
Chúng ta có bao giờ có các chuỗi đầu vào không liên tục tăng, ví dụ: 4-9,1-2hoặc 1-3,9-6?
Matt

1
Hay chồng chéo? Có đầu ra phải được sắp xếp và không chứa trùng lặp?
Peter Taylor

@Gareth Vâng, đây là một môn đánh gôn, sau đó vui lòng bỏ phiếu cho câu trả lời ngắn nhất. Matt và Peter, tôi đã chỉnh sửa câu hỏi, xin vui lòng kiểm tra nó. Cảm ơn!
BernaMariano

Nó có phải là một chương trình đầy đủ không, và có hạn chế về định dạng của đầu ra không?
Brad Gilbert b2gills

Câu trả lời:


6

GolfScript (24 ký tự)

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

Ví dụ

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

Tôi thực sự có bốn giải pháp 24 ký tự, nhưng tôi đã chọn giải pháp này vì nó không có bất kỳ ký tự chữ và số nào.

Làm thế nào nó hoạt động

# 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

Làm thế nào bạn có thể mở rộng 3-5 thành 3,4,5 mà không sử dụng một ký tự -?
BernaMariano

@BernaMariano, xin lỗi, tôi bằng cách nào đó đã bỏ lỡ câu hỏi của bạn. Tôi sẽ mở rộng câu trả lời với một lời giải thích chi tiết.
Peter Taylor

7

Perl 25 26 25

$_ là chuỗi chuỗi

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

Phiên mẫu:

[~/] $ 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

Đã thêm 1 ký tự vào số ký tự cho tùy chọn (cảm ơn Gareth, ..kinda).-n-p


Có lẽ tôi đã thực hiện sai ký tự (với các tùy chọn dòng lệnh). Vui lòng sửa số đếm của tôi, làm ơn
ardew

Đi theo câu trả lời cho câu hỏi này trên meta , bạn chỉ cần thêm 1 ký tự cho ntùy chọn.
Gareth

Hủy bỏ -M5.010và trao đổi -echo-E
Brad Gilbert b2gills

4

golf, 46 45

Chương trình kịch bản golf đầu tiên của tôi, mất hàng giờ để hoàn thành.

{','/{'-'/{~}%.,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

Bạn có thể dùng thử tại http://golfscript.apphb.com/

Cú ném tốt nhất của tôi khi giải thích sự tàn bạo này:

{...}: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 ","

chỉnh sửa 1: đã thay đổi {}% ~ cuối cùng thành {} /, cũng có thể mô tả của tôi sai.


2
+1, bởi vì bất kỳ ai làm một chương trình trong GolfScript đều kiếm được nó.
Gareth

@Gareth Cảm ơn. Trước tiên tôi nghĩ tôi chỉ nên làm theo cách perl: thay đổi - thành .. và đánh giá nó. Sau đó, tôi không thể tìm thấy bất kỳ cách lành mạnh nào để xây dựng bất kỳ mảng nào vì vậy tôi đã làm điều này. Tôi chắc rằng ai đó sẽ đến với giải pháp ~ 20 char với bản golf.
shiona

Hiện tại tôi có 24 người, vì vậy tôi sẽ coi 20 là một thử thách;) Tuy nhiên, bạn có thể tiết kiệm một vài thứ khá dễ dàng. Vấn đề yêu cầu một chương trình, không phải là một chức năng, vì vậy bạn có thể mất bản gốc {và bản cuối cùng }:r;và bạn cũng có thể lưu một bản bằng cách thay thế 1-bằng (. (Ngẫu nhiên, IIRC đó là một mẹo mà tôi cũng đã bỏ lỡ trong chương trình GolfScript đầu tiên của mình)
Peter Taylor

PS Có một sự khác biệt tinh tế giữa {...}%~{...}/. Nếu bạn đang truy cập một cái gì đó xuống ngăn xếp bằng cách sử dụng integer $thì cái đầu tiên đơn giản hơn, bởi vì bạn không phải điều chỉnh số nguyên mỗi lần để bù cho bất cứ thứ gì bạn để lại trên ngăn xếp.
Peter Taylor


3

K, 47

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

Trường hợp thử nghiệm

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:0cho 43 byte
streetster


2

J, 53 43 41 39 38 ký tự

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

Lấy đầu vào từ bàn phím:

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

Đầu ra cho trường hợp thử nghiệm được yêu cầu:

   ;(}.[: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

Kali , 173 byte

Điều này khá dài và có thể không cạnh tranh vì cuối cùng có một dấu vết.

 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+",")}}

Chạy trực tuyến và xem mở rộng ở đây



1

Python 2.7, 147 138 byte

z, f = input (). split (','), []
cho tôi trong z:
 x = i.split ('-')
 nếu len (x)> 1: f + = phạm vi (int (x [0]), int (x [1]) + 1)
 khác: f + = [int (x [0])]
in str (f) [1: -1]

Sử dụng:

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

Không phải chương trình tốt nhất ...


1
Chào mừng đến với PPCG. Tôi nghĩ bạn có thể làm cho câu trả lời của bạn ngắn hơn bằng cách sử dụng 1 khoảng trắng cho các vết lõm.
intrepidcoder

Cảm ơn @intrepidcoder, tôi không biết rằng bạn có thể sử dụng thụt lề không gian duy nhất.
Alex

1

MATLAB, 47 byte

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

Đoạn mã này đọc một đầu vào chuỗi từ cửa sổ lệnh, thay thế '-' by ':', thêm dấu ngoặc vuông vào chuỗi và sau đó đánh giá nó, để đầu vào sẽ được mở rộng thành một dãy số đầy đủ.

Ví dụ đầu vào:

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

Ví dụ đầu ra:

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

Tôi tin rằng đầu ra này được cho phép, vì thách thức chỉ nói rằng tất cả các số trong một nhóm sẽ được hiển thị.


Đầu ra được phân tách bằng dấu phẩy sẽ đẹp hơn, mặc dù tôi có thể tạo một mẫu được phân tách bằng 5 dấu cách , điều đó thật tuyệt vời đối với tôi :)
BernaMariano


1

PowerShell, 79 71 byte

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

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

Phần bên trong thay đổi "1,5-9,12" thành định dạng "(1), (5..9), (12)" mà PowerShell hiểu, sau đó thực thi điều đó với iex, tạo ra một mảng các mảng. Sau đó lặp qua từng mảng bên trong, rồi cuối cùng nối tất cả các phần tử mảng bên ngoài lại với nhau

Mượn mã từ câu trả lời "Giúp tôi quản lý thời gian của tôi"

Sử dụng

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 byte nhờ Veskah



1

K (oK) , 40 31 byte

Giải pháp

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

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

Giải trình:

Quản lý nhiều môn đánh gôn hơn trong khi thêm lời giải thích ...

,/{{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 byte

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

Xử lý các chuỗi không thú vị lắm :(




0

Japt , 12 byte

q, c@OvXr-'ò

Thử nó


Bạn có thể thay thế c@bằng £?
Oliver

@Oliver, vì đây là một thách thức cũ không chỉ định định dạng I / O của nó, tôi đã thận trọng, lấy đầu vào là một chuỗi được phân tách bằng dấu phẩy và xuất ra dưới dạng một mảng phẳng. Tuy nhiên, thông thường, vâng, tôi đã chỉ định đầu vào là một chuỗi các chuỗi, đầu ra là một mảng đa chiều và chỉ được sử dụng £thay cho 5 byte đầu tiên .
Xù xì

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.