Retornar cada número de um grupo de números

11

O desafio

O programa deve retornar todos os números incluídos em um grupo (sequência separada por vírgula e hífen).

Regras

  • s é a sequência de caracteres;
  • todos os números incluídos ssão positivos ;
  • números sempre aumentam ;
  • números nunca se repetem
  • ao responder, mostre a saída para s="1,3-5,9,16,18-23"

Exemplos

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

Boa sorte. =)

BernaMariano
fonte
1
Será que alguma vez teremos sequências de entrada que não aumentam constantemente, por exemplo: 4-9,1-2ou 1-3,9-6?
Matt
1
Ou sobreposição? A saída precisa ser classificada e não conter duplicatas?
Peter Taylor
@ Gareth Sim, este é um código de golfe, então vote na resposta mais curta. Matt e Peter, eu editei a pergunta, por favor, verifique. Obrigado!
BernaMariano
Ele precisa ser um programa completo e existe uma restrição no formato da saída?
Brad Gilbert b2gills
1
duplicado?
ev3commander

Respostas:

6

GolfScript (24 caracteres)

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

Por exemplo

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

Na verdade, tenho quatro soluções de 24 caracteres, mas escolhi essa porque não possui caracteres alfanuméricos.

Como funciona

# 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
fonte
Como você pode expandir 3-5 para 3,4,5 sem usar um único personagem -?
BernaMariano
@BernaMariano, desculpe, de alguma forma perdi sua pergunta. Expandirei a resposta com uma explicação detalhada.
Peter Taylor
7

Perl 25 26 25

$_ é a sequência de seqüências

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

Sessão de amostra:

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

Adicionado 1 caractere à contagem de caracteres para a opção (obrigado Gareth, ... meio).-n-p

novo
fonte
Provavelmente, eu fiz o contador de caracteres errado (com as opções de linha de comando). Sinta-se livre para corrigir a minha contagem, por favor
ardnew
Indo para a resposta a esta pergunta na meta , você só precisa adicionar 1 caractere para a nopção.
Gareth
Remova -M5.010e troque -epor-E
Brad Gilbert b2gills 28/11
4

golfscript, 46 45

Meu primeiro programa de roteiro de golfe, levou horas para ser concluído.

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

Você pode experimentá-lo em http://golfscript.apphb.com/

Meu melhor lance para explicar essa atrocidade:

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

edit 1: alterei o último {}% ~ para {} /, também minha descrição provavelmente estava errada.

shiona
fonte
2
+1, porque quem faz um programa no GolfScript ganhou.
Gareth
@Gareth Obrigado. Primeiro, pensei em fazer da maneira perl: mudar - para .. e avaliá-lo. Então não consegui encontrar nenhuma maneira sensata de criar matrizes, então fiz isso. Tenho certeza de que alguém encontrará uma solução de ~ 20 caracteres com golfscript.
Shiona
Eu tenho 24 no momento, então vou aceitar 20 como um desafio;) Você pode salvar alguns com bastante facilidade. O problema pede um programa, não uma função, para que você possa perder o inicial {e o final }:r;e também pode salvar um substituindo 1-por (. (Aliás, IIRC que é um truque que eu também perdeu no meu primeiro programa GolfScript)
Peter Taylor
PS Há uma diferença sutil entre {...}%~e {...}/. Se você estiver acessando algo mais abaixo na pilha usando integer $, o primeiro será mais simples, porque você não precisa ajustar o número inteiro toda vez para compensar o que estiver deixando na pilha.
22413 Peter Peter Taylor
4

R , 44 bytes

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

Experimente online!

Redefina -para significar seq(ie :), envolva a entrada c()e avalie a expressão correspondente.

Robin Ryder
fonte
3

K, 47

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

Caso de teste

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
fonte
","/:$,/{{x+!1+y-x}. 2#"J"$"-"\:x}'","\:0:0para 43 bytes
streetster 19/07/19
3

Geléia , 9 bytes

⁾-ryṣ”,VF

Experimente online!

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

A díade de intervalo raceita dois argumentos em ambos os lados e produz um intervalo inclusivo entre eles.

String não relacionada
fonte
2

J, 53 43 41 39 38 caracteres

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

Recebe entrada do teclado:

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

Saída para o caso de teste solicitado:

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

Hássio , 173 bytes

Isso foi bastante longo e pode não estar competindo, já que há um final no final.

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

Execute on-line e veja expandido aqui

Jacob Misirian
fonte
1

Perl (37)

$_=<>;s/^/say join',',/;s/-/../g;eval
marinus
fonte
- quando você responder, mostrar a saída para s="1,3-5,9,16,18-23", graças
BernaMariano
Que tal say join",",eval<>=~s/-/../grem 29 bytes
Brad Gilbert b2gills
1

Python 2.7, 147 138 bytes

z, f = input (). split (','), []
para i em z:
 x = i.split ('-')
 se len (x)> 1: f + = intervalo (int (x [0]), int (x [1]) + 1)
 mais: f + = [int (x [0])]
print str (f) [1: -1]

Uso:

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

Não é o melhor programa ...

Alex
fonte
1
Bem-vindo ao PPCG. Eu acho que você pode diminuir sua resposta usando 1 espaço para recuos.
Intrepidcoder
Obrigado @intrepidcoder, eu não sabia que você poderia usar recuos de espaço único.
Alex #
1

MATLAB, 47 bytes

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

Esse trecho lê uma entrada de seqüência de caracteres na janela de comando, substitui '-' por ':', adiciona colchetes à seqüência de caracteres e a avalia, para que a entrada seja expandida para uma matriz completa de números.

Exemplo de entrada:

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

Exemplo de saída:

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

Acredito que essa saída seja permitida, pois o desafio apenas diz que todos os números em um grupo devem ser exibidos.

slvrbld
fonte
separados por vírgula saída seria melhor, embora eu posso se um 5-espaços separados teste padrão, isso é legal para mim :)
BernaMariano
1

Perl 6 , 36 bytes

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

PowerShell, 79 71 bytes

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

Experimente online!

A parte interna altera "1,5-9,12" para um formato "(1), (5..9), (12)" que o PowerShell entende e, em seguida, executa isso com o iex, que cria uma matriz de matrizes. Em seguida, percorra cada matriz interna e, finalmente, junte todos os elementos da matriz externa

Empresta código da minha resposta "Ajude-me a gerenciar meu tempo"

Uso

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 graças a Veskah

AdmBorkBork
fonte
1

K (oK) , 40 31 bytes

Solução

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

Experimente online!

Explicação:

Controlou mais golfe enquanto adicionava a explicação ...

,/{{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
rua
fonte
0

Clojure, 110 bytes

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

Lidar com cordas não é muito divertido :(

NikoNyrh
fonte
0

Python 2 , 112 bytes

Resposta bastante simples e direta.

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

Experimente online!

mbomb007
fonte
0

Japonês , 12 bytes

q, c@OvXr-'ò

Tente

Shaggy
fonte
Você pode substituir c@com £?
19719 Oliver
@ Oliver, como é um desafio antigo que não especifica seu formato de E / S, errei por precaução, tomando a entrada como uma string delimitada por vírgula e a saída como uma matriz achatada. Normalmente, porém, sim, eu teria especificado a entrada como uma matriz de seqüências de caracteres, a saída como uma matriz multidimensional e usada apenas £no lugar dos 5 primeiros bytes.
Shaggy