Kembalikan setiap angka dari sekelompok angka


11

Tantangan

Program harus mengembalikan semua angka yang termasuk dalam kelompok (koma dan urutan yang dipisahkan tanda hubung) dari angka.

Aturan

  • s adalah string urutan;
  • semua angka yang dimasukkan sadalah positif ;
  • jumlahnya akan selalu meningkat ;
  • angka tidak akan pernah terulang
  • ketika Anda menjawab, tunjukkan output untuk s="1,3-5,9,16,18-23"

Contohnya

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

Semoga berhasil. =)


1
Apakah kita akan memiliki urutan input yang tidak terus meningkat, misalnya: 4-9,1-2atau 1-3,9-6?
— Mat

1
Atau tumpang tindih? Apakah output harus diurutkan dan tidak mengandung duplikat?
— Peter Taylor

@ Gareth Ya, ini adalah kode-golf, maka silakan pilih jawaban tersingkat. Matt dan Peter, saya mengedit pertanyaan, silakan periksa. Terima kasih!
— BernaMariano

Apakah itu harus menjadi program penuh, dan apakah ada batasan pada format output?
— Brad Gilbert b2gills

Jawaban:


6

GolfScript (24 karakter)

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

Misalnya

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

Saya sebenarnya memiliki empat solusi 24-char, tetapi saya memilih yang ini karena tidak memiliki karakter alfanumerik.

Bagaimana itu bekerja

# 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

Bagaimana Anda bisa mengembangkan 3-5 menjadi 3,4,5 tanpa menggunakan karakter tunggal -?
— BernaMariano

@BernaMariano, maaf, saya entah bagaimana melewatkan pertanyaan Anda. Saya akan memperluas jawabannya dengan penjelasan terperinci.
— Peter Taylor

7

Perl 25 26 25

$_ adalah string urutan

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

Sesi sampel:

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

Menambahkan 1 karakter ke jumlah karakter untuk opsi (terima kasih Gareth, ..kinda).-n-p


Saya mungkin telah melakukan penghitungan karakter yang salah (dengan opsi baris perintah). Silakan perbaiki hitunganku,
— ardnew

Pergi dengan jawaban untuk pertanyaan ini pada meta , Anda hanya perlu menambahkan 1 karakter untuk nopsi.
— Gareth

Hapus -M5.010dan tukarkan -euntuk-E
— Brad Gilbert b2gills

4

skrip golf, 46 45

Program skrip golf pertama saya, membutuhkan waktu berjam-jam untuk menyelesaikannya.

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

Anda dapat mencobanya di http://golfscript.apphb.com/

Lemparan terbaik saya untuk menjelaskan kekejaman ini:

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

sunting 1: mengubah {}% ~ menjadi {} / terakhir, juga deskripsi saya kemungkinan salah.


2
+1, karena siapa pun yang melakukan program di GolfScript telah mendapatkannya.
— Gareth

@ Gareth Terima kasih. Saya pertama kali berpikir saya hanya akan melakukannya dengan cara perl: ubah - menjadi .. dan evaluasi. Kemudian saya tidak dapat menemukan cara yang waras untuk membuat array jadi saya melakukan ini. Saya yakin seseorang akan datang dengan solusi ~ 20 char dengan skrip golf.
— shiona

Saya memiliki 24 pada saat ini, jadi saya akan menganggap 20 sebagai tantangan;) Anda dapat menyimpan beberapa dengan cukup mudah. Masalahnya meminta program, bukan fungsi, sehingga Anda dapat kehilangan awal {dan akhir }:r;dan Anda juga dapat menyimpan satu dengan mengganti 1-dengan (. (Kebetulan, IIRC itu salah satu trik yang juga saya lewatkan dalam program GolfScript pertama saya)
— Peter Taylor

PS Ada perbedaan kecil antara {...}%~dan {...}/. Jika Anda mengakses sesuatu lebih jauh menggunakan stack integer $maka yang pertama lebih sederhana, karena Anda tidak harus menyesuaikan integer setiap kali untuk mengkompensasi apa pun yang Anda tinggalkan di stack.
— Peter Taylor

4

R , 44 byte

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

Cobalah online!

Tetapkan ulang -berarti seq(yaitu :), mengelilingi input dengan c()dan mengevaluasi ekspresi yang sesuai.


3

K, 47

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

Kasus cobaan

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

3

Jelly , 9 byte

⁾-ryṣ”,VF

Cobalah online!

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

Pasangan angka rdua mengambil dua argumen di kedua sisi itu dan menghasilkan kisaran yang inklusif di antara mereka.


2

J, 53 43 41 39 38 karakter

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

Mengambil input dari keyboard:

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

Output untuk test case yang diminta:

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

Hassium , 173 Bytes

Ini cukup lama dan mungkin tidak bersaing karena ada trailing, pada akhirnya.

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

Jalankan online dan lihat diperluas di sini



1

Python 2.7, 147 138 Bytes

z, f = input (). split (','), []
untuk saya dalam z:
 x = i.split ('-')
 jika len (x)> 1: f + = range (int (x [0]), int (x [1]) + 1)
 lain: f + = [int (x [0])]
print str (f) [1: -1]

Pemakaian:

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

Bukan program terbaik ...


1
Selamat datang di PPCG. Saya pikir Anda dapat membuat jawaban Anda lebih pendek dengan menggunakan 1 ruang untuk indentasi.
— intrepidcoder

Terima kasih @intrepidcoder, saya tidak tahu bahwa Anda dapat menggunakan indentasi ruang tunggal.
— Alex

1

MATLAB, 47 byte

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

Cuplikan ini membaca input string dari jendela perintah, menggantikan '-' oleh ':', menambahkan tanda kurung ke string dan kemudian mengevaluasinya, sehingga input akan diperluas ke array angka penuh.

Input contoh:

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

Contoh output:

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

Saya percaya output ini diperbolehkan, karena tantangannya hanya mengatakan bahwa semua angka dalam grup harus ditampilkan.


keluaran yang dipisahkan koma akan lebih baik, meskipun saya dapat melihat pola 5-spasi-terpisah , itu keren untuk saya :)
— BernaMariano


1

PowerShell, 79 71 byte

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

Cobalah online!

Bagian dalam mengubah "1,5-9,12" menjadi format "(1), (5..9), (12)" yang dipahami PowerShell, kemudian mengeksekusinya dengan iex, yang menciptakan array array. Kemudian beralih melalui masing-masing array batin, lalu akhirnya bergabung semua elemen array luar bersama-sama

Pinjam kode dari jawaban "Bantu Saya Kelola Waktu Saya"

Pemakaian

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 Bytes berkat Veskah



1

K (oK) , 40 31 byte

Larutan

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

Cobalah online!

Penjelasan:

Berhasil lebih banyak bermain golf sembari menambahkan penjelasan ...

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

Berurusan dengan string tidak terlalu menyenangkan :(


0

Python 2 , 112 byte

Jawabannya cukup sederhana dan langsung.

L=[]
for s in input().split(','):
 if'-'in s:a,b=map(int,s.split('-'));L+=range(a,b+1)
 else:L+=[int(s)]
print L

Cobalah online!



0

Japt , 12 byte

q, c@OvXr-'ò

Cobalah


Bisakah Anda ganti c@dengan £?
— Oliver

@ Oliver, karena ini merupakan tantangan lama yang tidak menentukan format I / O-nya, saya melakukan kesalahan, mengambil input sebagai string yang dibatasi koma dan menghasilkan sebagai array yang rata. Biasanya, ya, saya akan menetapkan input sebagai array string, output sebagai array multi-dimensi dan hanya digunakan £sebagai ganti yang pertama 5 byte .
— Shaggy

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.