Her sayıyı bir sayı grubundan döndürme


11

Meydan okuma

Program, bir sayı grubuna dahil olan tüm sayıları (virgül ve tire ile ayrılmış sıraya) döndürmelidir.

kurallar

  • s dizi dizesidir;
  • dahil tüm sayılar solan pozitif ;
  • sayılar her zaman artacaktır ;
  • sayılar asla tekrarlanmaz
  • cevap verdiğinizde, s="1,3-5,9,16,18-23"

Örnekler

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

İyi şanslar. =)


1
Sürekli artmayan girdi dizilerimiz olacak mı , örneğin: 4-9,1-2veya 1-3,9-6?
Matt

1
Yoksa örtüşüyor mu? Çıktının sıralanması ve kopya içermemesi gerekiyor mu?
Peter Taylor

@Gareth Evet, bu bir kod golfü, o zaman lütfen en kısa cevap için oy verin. Matt ve Peter, soruyu düzenledim, lütfen kontrol et. Teşekkürler!
BernaMariano

Tam bir program olmalı ve çıktının biçiminde bir kısıtlama var mı?
Brad Gilbert b2gills

Yanıtlar:


6

GolfScript (24 karakter)

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

Örneğin

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

Aslında 24 karakterlik dört çözümüm var, ama bunu alfanümerik karakter içermediğinden seçtim.

Nasıl çalışır

# 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

Tek bir karakter kullanmadan 3-5'i 3,4,5'e nasıl genişletebilirsiniz -?
BernaMariano

@ BernaMariano, üzgünüm, bir şekilde sorunuzu kaçırdım. Cevabı ayrıntılı bir açıklama ile genişleteceğim.
Peter Taylor

7

Perl 25 26 25

$_ dizi dizesi

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

Örnek oturum:

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

Seçenek için karakter sayısına 1 karakter eklendi (teşekkürler Gareth, ..kinda).-n-p


Muhtemelen karakter saymayı yanlış yaptım (komut satırı seçenekleriyle).
Sayımı

Metadaki bu sorunun cevabına giderek , nseçenek için sadece 1 karakter eklemeniz gerekir .
Gareth

Kaldır -M5.010ve döviz -eiçin-E
Brad Gilbert b2gills

4

golfscript, 46 45

İlk golf senaryo programımın tamamlanması saatler sürdü.

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

Bunu http://golfscript.apphb.com/ adresinden deneyebilirsiniz.

Bu vahşeti açıklamaya en iyi atışım:

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

düzenleme 1: son {}% ~ öğesini {} / olarak değiştirdi, ayrıca açıklamam yanlıştı.


2
+1, çünkü GolfScript'te bir program yapan herkes bu programı kazandı.
Gareth

@Gareth Teşekkürler. İlk önce sadece perl yolu yapacağımı düşündüm: değiştirmek - ve değerlendirmek. Sonra herhangi bir dizi oluşturmak için aklı başında bir yol bulamadım bu yüzden bunu yaptım. Eminim birisi golfscript ile ~ 20 char çözüm ile gelecek.
shiona

Şu anda 24 tane var, bu yüzden 20 tane zorluk olarak alacağım;) Yine de birkaçını kolayca kaydedebilirsiniz. Başlangıçtaki kaybedebilir için problemin bir program değil, bir fonksiyon sorar {ve nihai }:r;ve ayrıca değiştirerek birini kaydedebilirsiniz 1-ile (. (Bu arada, IIRC ilk GolfScript programımda da kaçırdığım bir numara)
Peter Taylor

PS {...}%~ve arasında ince bir fark vardır {...}/. Yığını kullanarak daha aşağıya bir şey erişiyorsanız, integer $o zaman birincisi daha basittir, çünkü yığında bıraktığınız şeyi telafi etmek için her seferinde tamsayıyı ayarlamanız gerekmez.
Peter Taylor

4

R , 44 bayt

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

Çevrimiçi deneyin!

Yeniden -ortalama seq(yani :) olarak tanımlayın, girdiyi çevreleyin c()ve karşılık gelen ifadeyi değerlendirin.


3

K, 47

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

Test durumu

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:0için 43 bayt
streetster

3

Jöle , 9 bayt

⁾-ryṣ”,VF

Çevrimiçi deneyin!

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

Aralık aralığı rher iki tarafında iki argüman alır ve aralarında kapsayıcı bir aralık oluşturur.


2

J, 53 43 41 39 38 karakter

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

Klavyeden giriş alır:

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

İstenen test durumu için çıktı:

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

Bu oldukça uzundu ve sonunda bir takip olduğu için rekabet etmeyebilir.

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

Çevrimiçi çalışın ve burada genişletin



1

Python 2.7, 147138 Bayt

Z, f = girişi (). bölme ( ''), []
z için ben:
 X = i.split ( '-')
 len (x)> 1 ise: f + = aralık (int (x [0]), int (x [1]) + 1)
 Başka f + = [int (x [0])]
baskı str (f) [1: -1]

Kullanımı:

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

En iyi program değil ...


1
PPCG'ye hoş geldiniz. Girintiler için 1 boşluk kullanarak cevabınızı kısaltabileceğinizi düşünüyorum.
intrepidcoder

Teşekkürler @intrepidcoder, tek boşluk girintileri kullanabileceğinizi bilmiyordum.
Alex

1

MATLAB, 47 bayt

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

Bu snippet, komut penceresinden bir dize girdisi okur, '-' by ':' ile değiştirir, dizeye köşeli parantez ekler ve değerlendirir, böylece giriş tam sayı dizisine genişletilir.

Örnek girdi:

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

Örnek çıktı:

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

Zorluk sadece bir gruptaki tüm sayıların görüntülenmesi gerektiğini söylediğinden, bu çıktıya izin verildiğine inanıyorum.


virgülle ayrılmış çıktı daha güzel olurdu, ancak 5 boşluklu bir desen
görüyorum


1

PowerShell, 79 71 bayt

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

Çevrimiçi deneyin!

İç kısım, "1,5-9,12" yi PowerShell'in anladığı bir "(1), (5..9), (12)" biçimine dönüştürür, daha sonra bunu bir dizi dizisi oluşturan iex ile yürütür. Daha sonra her bir iç dizi boyunca yineleyin, ardından tüm dış dizi öğelerini bir araya getirin

Benim "Yardım Me My Zamanı yönetme" dan Borrows kod cevap

kullanım

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

Veskah sayesinde -8 bayt



1

K (oK) , 40 31 bayt

Çözüm

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

Çevrimiçi deneyin!

Açıklama:

Açıklama eklerken daha fazla golf yönetti ...

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

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

Dizelerle uğraşmak pek eğlenceli değil :(




0

Japt , 12 bayt

q, c@OvXr-'ò

Dene


Eğer değiştirebilir miyim c@ile £?
Oliver

@Oliver, G / Ç biçimini belirtmeyen eski bir meydan okuma olduğundan, dikkatle yan yana diktim, virgülle ayrılmış bir dize olarak girdi alıp düzleştirilmiş bir dizi olarak çıktı alıyorum. Normalde, evet, ben bir dizeler dizisi olarak girdi, çok boyutlu bir dizi olarak çıktı ve sadece £ilk 5 bayt yerine kullanılır .
Shaggy

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.