Devuelve cada número de un grupo de números

11

El reto

El programa debe devolver todos los números incluidos en un grupo (secuencia separada por comas y guiones) de números.

Reglas

  • s es la secuencia de secuencia;
  • todos los números incluidos en sson positivos ;
  • los números siempre aumentarán ;
  • los números nunca se repetirán
  • cuando respondas, muestra la salida para s="1,3-5,9,16,18-23"

Ejemplos

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

Buena suerte. =)

BernaMariano
fuente
1
¿Alguna vez tendremos secuencias de entrada que no aumenten constantemente, por ejemplo: 4-9,1-2o 1-3,9-6?
Matt
1
O superposición? ¿La salida tiene que ser ordenada y no contener duplicados?
Peter Taylor
@Gareth Sí, este es un código de golf, entonces vote por la respuesta más corta. Matt y Peter, edité la pregunta, compruébalo. ¡Gracias!
BernaMariano
¿Tiene que ser un programa completo y existe una restricción en el formato de la salida?
Brad Gilbert b2gills
1
¿duplicar?
ev3commander

Respuestas:

6

GolfScript (24 caracteres)

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

P.ej

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

De hecho, tengo cuatro soluciones de 24 caracteres, pero elegí esta porque no tiene caracteres alfanuméricos.

Cómo 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
fuente
¿Cómo puedes expandir 3-5 en 3,4,5 sin usar un solo personaje -?
BernaMariano
@ Berna Mariano, lo siento, de alguna manera me perdí tu pregunta. Ampliaré la respuesta con una explicación detallada.
Peter Taylor
7

Perl 25 26 25

$_ es la cadena de secuencia

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

Sesión de muestra:

[~/] $ 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 agregó 1 carácter al recuento de caracteres para la opción (gracias Gareth, ..kinda).-n-p

ardnew
fuente
Probablemente he hecho el recuento de caracteres incorrecto (con las opciones de línea de comando). Siéntase libre de corregir mi conteo, por favor
ardnew
Siguiendo la respuesta a esta pregunta en meta , solo necesita agregar 1 carácter para la nopción.
Gareth
Retirar -M5.010e intercambiar -epor-E
Brad Gilbert b2gills
4

golfscript, 46 45

Mi primer programa de script de golf, tardó horas en completarse.

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

Puedes probarlo en http://golfscript.apphb.com/

Mi mejor tiro para explicar esta atrocidad:

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

editar 1: cambió el último {}% ~ a {} /, también es probable que mi descripción sea incorrecta.

shiona
fuente
2
+1, porque cualquiera que esté haciendo un programa en GolfScript se lo ha ganado.
Gareth
@Gareth Gracias. Primero pensé que lo haría de la manera perl: cambiar - a ... y evaluarlo. Entonces no pude encontrar ninguna forma sensata de construir matrices, así que hice esto. Estoy seguro de que alguien vendrá con una solución de ~ 20 caracteres con golfscript.
Shiona
Tengo 24 en este momento, así que tomaré 20 como desafío;) Sin embargo, puedes ahorrar algunos con bastante facilidad. El problema requiere un programa, no una función, por lo que puede perder la inicial {y la final }:r;y también puede guardar una reemplazando 1-por (. (Por cierto, IIRC es un truco que también me perdí en mi primer programa GolfScript)
Peter Taylor
PD: Hay una sutil diferencia entre {...}%~y {...}/. Si está accediendo a algo más abajo en la pila, integer $entonces el primero es más simple, ya que no tiene que ajustar el número entero cada vez para compensar lo que esté dejando en la pila.
Peter Taylor
4

R , 44 bytes

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

Pruébalo en línea!

Redefina -para significar seq(es decir :), rodee la entrada c()y evalúe la expresión correspondiente.

Robin Ryder
fuente
3

K, 47

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

Caso de prueba

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

Jalea , 9 bytes

⁾-ryṣ”,VF

Pruébalo en línea!

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

La diada de rango rtoma dos argumentos a cada lado y produce un rango inclusivo entre ellos.

Cadena no relacionada
fuente
2

J, 53 43 41 39 38 caracteres

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

Toma entrada del teclado:

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

Salida para el caso de prueba 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
fuente
2

Hasio , 173 bytes

Esto fue bastante largo y podría no estar compitiendo ya que hay un final al 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+",")}}

Ejecute en línea y vea expandido aquí

Jacob Misirian
fuente
1

Perl (37)

$_=<>;s/^/say join',',/;s/-/../g;eval
marinus
fuente
- cuando respondas, muestra la salida para s="1,3-5,9,16,18-23", gracias
BernaMariano
¿Qué tal say join",",eval<>=~s/-/../gra 29 bytes
Brad Gilbert b2gills
1

Python 2.7, 147138 Bytes

z, f = input (). split (','), []
para i en z:
 x = i.split ('-')
 si len (x)> 1: f + = rango (int (x [0]), int (x [1]) + 1)
 más: 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

No es el mejor programa ...

Alex
fuente
1
Bienvenido a PPCG. Creo que puedes acortar tu respuesta usando 1 espacio para las sangrías.
intrepidcoder
Gracias @intrepidcoder, no sabía que podía usar sangrías de espacio único.
Alex
1

MATLAB, 47 bytes

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

Este fragmento lee una entrada de cadena desde la ventana de comandos, reemplaza '-' por ':', agrega corchetes a la cadena y luego la evalúa, para que la entrada se expanda a una matriz completa de números.

Entrada de ejemplo:

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

Salida de ejemplo:

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

Creo que esta salida está permitida, ya que el desafío solo dice que todos los números en un grupo deben mostrarse.

slvrbld
fuente
La salida separada por comas sería mejor, aunque puedo ver un patrón separado por 5 espacios , eso es genial para mí :)
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
fuente
1

PowerShell, 79 71 bytes

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

Pruébalo en línea!

La parte interna cambia "1,5-9,12" a un formato "(1), (5..9), (12)" que PowerShell entiende, luego lo ejecuta con iex, lo que crea una matriz de matrices. Luego, recorra cada matriz interna, luego finalmente una todos los elementos de la matriz externa

Toma prestado el código de mi respuesta "Ayuda para administrar mi tiempo"

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 gracias a Veskah

AdmBorkBork
fuente
1

K (oK) , 40 31 bytes

Solución

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

Pruébalo en línea!

Explicación:

Logró más golf mientras agregaba la explicación ...

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

Tratar con cuerdas no es muy divertido :(

NikoNyrh
fuente
0

Python 2 , 112 bytes

Respuesta bastante simple y directa.

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

Pruébalo en línea!

mbomb007
fuente
0

Japt , 12 bytes

q, c@OvXr-'ò

Intentalo

Lanudo
fuente
¿Se puede reemplazar c@con £?
Oliver
@Oliver, como es un viejo desafío que no especifica su formato de E / S, cometí un error con precaución, tomé la entrada como una cadena delimitada por comas y la salida como una matriz aplanada. Sin embargo, normalmente, sí, habría especificado la entrada como una matriz de cadenas, la salida como una matriz multidimensional y solo la he usado £en lugar de los primeros 5 bytes.
Shaggy