Hacer cola con amigos

16

Estás con tu mejor amigo, Jim, en el parque de atracciones y cuando tu paseo favorito aparece, tú y Jim intercambian miradas. Naturalmente, corres para hacer cola Desafortunadamente, él gana porque eres un golfista y juega un deporte real (lo siento amigos). De hecho, estás tan atrasado que tú y Jim están separados por xpersonas. Suponiendo que la línea es larga ny estás en la parte de atrás y la línea zigzaguea y zaga a todas las jpersonas, ¿en qué posiciones en la línea estarán Jim y tú en la misma columna, permitiéndote chatear (solo una fila aparte)?

Entrada

3 enteros

  • n- La longitud de la línea. Este número siempre será mayor o igual que jy tendrá la forma y * jen que ysea ​​un entero positivo (el número de filas en la cola).
  • j- El número de personas en una fila de la línea (el número de columnas en una fila). Este número siempre será mayor que 0.
  • x- El número de personas entre tú y Jim de tal manera 0 <= x < 2j - 1. Sugerencia: Si este número es impar, entonces su salida debería estar vacía.

Salida

Una lista de posiciones enteras en la línea en la que Jim está en la misma columna que usted.
1 Estos enteros pueden estar indexados a 0 o 1 siempre que lo especifique en su respuesta.
2 Estos enteros pueden suponer que comienzas en la posición 0 o en la posición n-1 siempre que lo especifiques en tu respuesta.

Ejemplo

Ejemplo de cola pequeño
En este ejemplo, la entrada sería n = 9, j = 3, x = 0. El resultado debe ser 2, 5porque su posición es 2 o 5 cuando está en la misma columna que Jim

Casos de prueba

[9, 3, 0] -> [2, 5]
[12, 3, 0] -> [2, 5, 8]
[9, 3, 1] -> []
[9, 3, 2] -> [1, 4]
[14, 7, 10] -> [1]
[24, 4, 6] -> [0, 4, 8, 12, 16]

Puntuación

Este es el , por lo que gana la respuesta más corta (en bytes).

Dar un toque
fuente
44
¡Tengo muchas ganas de ver algunas soluciones interesantes para esto! (perdón mal juego de palabras y también uso incorrecto de la palabra, pero lo que sea, no me juzguen: P)
HyperNeutrino
1
¿Podemos devolver un valor falso en lugar de una matriz vacía?
Rɪᴋᴇʀ
@Riker No veo ninguna razón para no permitir eso. Ve por ello
Poke

Respuestas:

9

Python 2 , 45 41 40 37 bytes

lambda n,j,x:range(j-x/2,x%2or n-x,j)

Más o menos la solución trivial. Simplemente escaneé rápidamente en busca de patrones y encontré un patrón. 1 indexado, 1 está al final de la cola.

-4 bytes evitando ternaries y usando una matriz para los valores en lugar de
-1 byte gracias a la inspiración de @DeadPossum, usando en andlugar de ternaries o selectores de matriz
-3 bytes cambiando oren el orden opuesto. Solo funciona debido a la indexación 1

Además, tachado 4 sigue siendo 4 en todos los 4 :(

Pruébalo en línea!

Hiperneutrino
fuente
Lol, publicaste solo 14 minutos, antes que yo :) Mi versión es más corta por 3 bytes:lambda n,j,x:x%2-1and range(j-x/2,n-j+1,j)
Dead Possum
@DeadPossum Nice. Tengo otra solución que es un byte más corto que eso, jajaja
HyperNeutrino
Tuve un error en el segundo argumento de rango. No debería ser n-j+1, por lo que lambda n,j,x:x%2-1and range(j-x/2,n-x,j)es más corto en uno más en total de 40 bytes
Dead Possum
@DeadPossum Espere, ¿se nos permitió devolver un valor falso en lugar de una matriz vacía?
HyperNeutrino
3
@FelipeNardiBatista eso es lo que significa "1 indexado", por cierto.
Rɪᴋᴇʀ
2

Pip , 22 21 bytes

20 bytes de código, +1 para -pbandera.

c%2?lv-c/2+b*\,a/b-1

Toma n, jy xcomo argumentos de línea de comandos. Indexado 0, comenzando en la posición 0. ¡ Pruébelo en línea!

Explicación

Esta es mi versión original de 22 bytes porque es un poco más comprensible.

                       a, b, c are cmdline args; l is [] (implicit)
c%2?                   Test c mod 2
    l                  If it's 1 (truthy), return empty list; else:
                a/b-1  Number of rows in the queue minus 1
               ,       Range(^)
             b*        Multiply each element by b
     b-1-c/2+          Add (b-1)-c/2 to each element
                       Output in [1;2;3] format (implicit, -p flag)

La fórmula se obtuvo mediante la observación del patrón para n=9, j=3:

x Output
0 [2;5]
2 [1;4]
4 [0;3]

Si tomamos x/2( 0, 1, 2), restarlo de j-1( 2, 1, 0), y añadir que a [0;3], obtenemos el resultado correcto en todos los casos.

DLosc
fuente
1

Java 8 lambda, 101 bytes

(n,j,x)->{int[]i=new int[n/j-1];int c=0,k=j-x/2;for(;k<n-x;k+=j)i[c++]=k;return x/2==0?i:new int[0];}

Puerto casi directo de mi respuesta de Python. Sin embargo, el rango no existe en Java.

Hiperneutrino
fuente
0

Haskell, 43 bytes

(n#j)x|odd$round x=[]|m<-j-x/2=[m,m+j..n-x]

Casi directamente portado de la respuesta de Python de HyperNeutrino

Código más bien formateado:

f n j x |odd$round x = []
        |otherwise   = let m=j-x/2 in [m,m+j..n-x]

EDITAR: olvidé mencionar que estaba indexado

Nombre de visualización genérico
fuente
0

C # - 91 bytes

int[]r=new int[n/j-1];for(int i=1;i<n/j;i++){r[i-1]=i*j-x/2-1;}return(x%2==0)?r:new int[0];
CHENGLIANG YE
fuente