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. =)

BernaMariano
sumber
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
1
duplikat?
ev3commander

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
Peter Taylor
sumber
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

ardnew
sumber
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.

shiona
sumber
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.

Robin Ryder
sumber
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"
tmartin
sumber
","/:$,/{{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.

String yang tidak terkait
sumber
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
Gareth
sumber
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

Yakub Misirian
sumber
1

Perl (37)

$_=<>;s/^/say join',',/;s/-/../g;eval
marinus
sumber
- ketika Anda menjawab, tunjukkan hasilnya s="1,3-5,9,16,18-23", terima kasih
BernaMariano
Bagaimana kalau say join",",eval<>=~s/-/../grpada 29 byte
Brad Gilbert b2gills
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 ...

Alex
sumber
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.

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

Perl 6 , 36 byte

$_=get;say join ',',EVAL S:g/\-/../
1,3,4,5,9,16,18,19,20,21,22,23
Brad Gilbert b2gills
sumber
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

AdmBorkBork
sumber
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
streetster
sumber
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 :(

NikoNyrh
sumber
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!

mbomb007
sumber
0

Japt , 12 byte

q, c@OvXr-'ò

Cobalah

Shaggy
sumber
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
0

Python 2 , 90 byte

lambda s:sum((range(u[0],u[-1]+1)for u in[map(int,t.split('-'))for t in s.split(',')]),[])

Cobalah online!

Chas Brown
sumber