Zwróć każdą liczbę z grupy liczb

11

Wyzwanie

Program musi zwrócić wszystkie liczby zawarte w grupie (sekwencja oddzielona przecinkami i łącznikami) liczb.

Zasady

  • s jest łańcuchem sekwencji;
  • wszystkie zawarte liczby sdodatnie ;
  • liczby zawsze będą rosły ;
  • liczby nigdy się nie powtórzą
  • kiedy odpowiadasz, pokaż wynik dla s="1,3-5,9,16,18-23"

Przykłady

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

Powodzenia. =)

BernaMariano
źródło
1
Czy kiedykolwiek będziemy mieć sekwencje wejściowe, które stale się nie zwiększają, na przykład: 4-9,1-2lub 1-3,9-6?
Matt
1
A może nakładają się? Czy dane wyjściowe muszą być posortowane i nie mogą zawierać duplikatów?
Peter Taylor
@Gareth Tak, to jest golf golfowy, więc proszę zagłosować na najkrótszą odpowiedź. Matt i Peter, zredagowałem pytanie, sprawdź je. Dzięki!
BernaMariano
Czy musi to być pełny program i czy istnieje ograniczenie formatu wyjścia?
Brad Gilbert b2gills
1
duplikować?
ev3commander

Odpowiedzi:

6

GolfScript (24 znaki)

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

Na przykład

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

Właściwie mam cztery 24-znakowe rozwiązania, ale wybrałem to, ponieważ nie ma żadnych znaków alfanumerycznych.

Jak to działa

# 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
źródło
Jak możesz powiększyć 3-5 do 3,4,5 bez użycia pojedynczej postaci -?
BernaMariano
@BernaMariano, przepraszam, jakoś przegapiłem twoje pytanie. Rozszerzę odpowiedź szczegółowym wyjaśnieniem.
Peter Taylor,
7

Perl 25 26 25

$_ to ciąg sekwencji

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

Przykładowa sesja:

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

Dodano 1 znak do liczby znaków dla opcji (dzięki Gareth, ..kinda).-n-p

ardnew
źródło
Prawdopodobnie źle zrobiłem liczenie znaków (z opcjami wiersza poleceń). Proszę o poprawienie mojego liczenia, proszę
nowy
Przechodząc do odpowiedzi na to pytanie w meta , wystarczy dodać 1 znak dla nopcji.
Gareth,
Usuń -M5.010i -e-E
wymień
4

golfscript, 46 45

Mój pierwszy w historii program do pisania golfa zajął kilka godzin.

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

Możesz spróbować na http://golfscript.apphb.com/

Mój najlepszy rzut na wyjaśnienie tego okrucieństwa:

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

edycja 1: zmieniłem ostatnie {}% ~ na {} /, również mój opis prawdopodobnie był błędny.

shiona
źródło
2
+1, ponieważ każdy, kto robi program w GolfScript, zdobył go.
Gareth,
@Gareth Thanks. Najpierw pomyślałem, że zrobię to po prostu perl: zmień - na ... i oceń to. Wtedy nie mogłem znaleźć zdrowego sposobu na zbudowanie żadnych tablic, więc to zrobiłem. Jestem pewien, że ktoś przyjdzie z rozwiązaniem ~ 20 znaków z golfscript.
shiona
W tej chwili mam 24, więc wezmę 20 za wyzwanie;) Możesz jednak dość łatwo uratować kilka. Problem wymaga programu, a nie funkcji, więc możesz stracić początkową {i końcową, }:r;a także możesz zapisać jeden, zastępując 1-go (. (Nawiasem mówiąc, IIRC to jedna sztuczka, której również przegapiłem w moim pierwszym programie GolfScript)
Peter Taylor,
PS Istnieje subtelna różnica między {...}%~i {...}/. Jeśli korzystasz z czegoś w dół stosu, integer $pierwszy jest prostszy, ponieważ nie musisz za każdym razem dostosowywać liczby całkowitej, aby zrekompensować wszystko, co pozostawiasz na stosie.
Peter Taylor
4

R , 44 bajty

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

Wypróbuj online!

Przedefiniuj -na znaczy seq(tj. :), Otaczaj dane wejściowe c()i oceń odpowiednie wyrażenie.

Robin Ryder
źródło
3

K, 47

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

Przypadek testowy

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"
tartin
źródło
","/:$,/{{x+!1+y-x}. 2#"J"$"-"\:x}'","\:0:0dla 43 bajtów
streetster
3

Galaretka , 9 bajtów

⁾-ryṣ”,VF

Wypróbuj online!

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

Diada zasięgu rbierze dwa argumenty po obu stronach i tworzy między nimi zakres obejmujący.

Niepowiązany ciąg
źródło
2

J, 53 43 41 39 38 znaków

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

Pobiera dane z klawiatury:

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

Dane wyjściowe dla żądanego przypadku testowego:

   ;(}.[: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
źródło
2

Wapń , 173 bajtów

To było dość długie i może nie konkurować, ponieważ na końcu jest koniec.

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

Uruchom online i zobacz rozwinięty tutaj

Jacob Misirian
źródło
1

Perl (37)

$_=<>;s/^/say join',',/;s/-/../g;eval
marinus
źródło
- kiedy odpowiadasz, pokaż wynik s="1,3-5,9,16,18-23", dzięki
BernaMariano
Co powiesz say join",",eval<>=~s/-/../grna 29 bajtów
Brad Gilbert b2gills
1

Python 2.7, 147 138 bajtów

z, f = input (). split (','), []
dla i in z:
 x = i.split ('-')
 jeśli len (x)> 1: f + = zakres (int (x [0]), int (x [1]) + 1)
 else: f + = [int (x [0])]
print str (f) [1: -1]

Stosowanie:

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

Nie najlepszy program ...

Alex
źródło
1
Witamy w PPCG. Myślę, że możesz skrócić swoją odpowiedź, używając 1 miejsca na wcięcia.
intrepidcoder,
Dzięki @intrepidcoder, nie wiedziałem, że możesz użyć pojedynczych wcięć spacji.
Alex
1

MATLAB, 47 bajtów

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

Ten fragment odczytuje ciąg znaków z okna poleceń, zastępuje „-” przez „:”, dodaje nawiasy kwadratowe do łańcucha, a następnie ocenia go, dzięki czemu dane wejściowe zostaną rozszerzone do pełnej tablicy liczb.

Przykładowe dane wejściowe:

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

Przykładowe dane wyjściowe:

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

Wierzę, że ten wynik jest dozwolony, ponieważ wyzwanie mówi tylko, że powinny być wyświetlane wszystkie liczby w grupie.

slvrbld
źródło
Wyjście rozdzielone przecinkami byłoby ładniejsze, chociaż mogę zobaczyć wzór rozdzielany 5-spacjami , to dla mnie fajne :)
BernaMariano
1

Perl 6 , 36 bajtów

$_=get;say join ',',EVAL S:g/\-/../
1,3,4,5,9,16,18,19,20,21,22,23
Brad Gilbert b2gills
źródło
1

PowerShell, 79 71 bajtów

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

Wypróbuj online!

Wewnętrzna część zmienia „1,5-9,12” na format „(1), (5..9), (12)”, który PowerShell rozumie, a następnie wykonuje to za pomocą iex, który tworzy tablicę tablic. Następnie iteruj przez każdy wewnętrzny układ, a następnie połącz ze sobą wszystkie zewnętrzne elementy układu

Pożycza kod z mojego "Help Me Manage My Time" odpowiedź

Stosowanie

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 bajtów dzięki Veskah

AdmBorkBork
źródło
1

K (oK) , 40 31 bajtów

Rozwiązanie

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

Wypróbuj online!

Wyjaśnienie:

Udało się więcej golfa, dodając wyjaśnienie ...

,/{{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
źródło
0

Clojure, 110 bajtów

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

Radzenie sobie z ciągami nie jest zbyt zabawne :(

NikoNyrh
źródło
0

Python 2 , 112 bajtów

Dość prosta i bezpośrednia odpowiedź.

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

Wypróbuj online!

mbomb007
źródło
0

Japt , 12 bajtów

q, c@OvXr-'ò

Spróbuj

Kudłaty
źródło
Można zastąpić c@z £?
Oliver
@Oliver, ponieważ jest to stare wyzwanie, które nie określa formatu we / wy, popełniłem błąd po stronie ostrożności, przyjmując dane wejściowe jako ciąg rozdzielany przecinkami i wyprowadzając jako spłaszczoną tablicę. Normalnie jednak tak, określiłbym dane wejściowe jako tablicę ciągów, dane wyjściowe jako tablicę wielowymiarową i po prostu użyte £zamiast pierwszych 5 bajtów.
Shaggy