Filas com amigos

16

Você está com seu melhor amigo, Jim, no parque de diversões e quando seu passeio favorito é visto, você e Jim trocam olhares. Naturalmente você corre para entrar na fila. Infelizmente ele vence porque você é um jogador de golfe e ele pratica um esporte de verdade (desculpe amigos). Na verdade, você está tão atrasado que você e Jim são separados por xpessoas. Assumindo que a linha é longa ne você está na parte de trás e na linha, ziguezagueia cada jpessoa, em que posições da linha você e Jim estarão na mesma coluna, permitindo que você converse (com apenas uma linha de distância)?

Entrada

3 Inteiros

  • n- o comprimento da linha. Esse número sempre será maior ou igual a je estará no formato em y * jque yé um número inteiro positivo (o número de linhas na fila).
  • j- O número de pessoas em uma linha da linha (o número de colunas em uma linha). Esse número sempre será maior que 0.
  • x- O número de pessoas entre você e Jim é tal 0 <= x < 2j - 1. Dica: Se esse número for ímpar, sua saída deverá estar vazia.

Resultado

Uma lista de posições inteiras na linha em que Jim está na mesma coluna que você.
1 Esses números inteiros podem ser indexados em 0 ou 1, desde que você especifique em sua resposta.
2 Esses números inteiros podem assumir que você começa na posição 0 ou na posição n-1, desde que você especifique em sua resposta.

Exemplo

Exemplo de enfileiramento pequeno
Neste exemplo, a entrada seria n = 9, j = 3, x = 0. O resultado deve ser 2, 5porque sua posição é 2 ou 5 quando você está na mesma coluna que Jim

Casos de teste

[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]

Pontuação

Isso é , então a resposta mais curta (em bytes) vence.

Cutucar
fonte
4
Estou na fila para ver algumas soluções interessantes para isso! (trocadilho ruim arrependido e uso, também indevido da palavra, mas o que quer, não me julgue: P)
HyperNeutrino
1
Podemos retornar um valor falso em vez de uma matriz vazia?
Rɪᴋᴇʀ
@Riker Não vejo razão para proibir isso. Vá em frente
Poke

Respostas:

9

Python 2 , 45 41 40 37 bytes

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

Praticamente a solução trivial. Eu rapidamente procurei padrões e encontrei um padrão. 1 indexado, 1 está na parte de trás da fila.

-4 bytes evitando ternários e usando uma matriz para os valores em vez de
-1 byte, graças a alguma inspiração do @DeadPossum, usando em andvez de ternários ou seletores de matriz
-3 bytes, alternando para ora ordem oposta. Funciona apenas por causa da indexação 1

Além disso, riscado 4 ainda é 4 em todos os 4s :(

Experimente online!

HyperNeutrino
fonte
Lol, você postou apenas 14 minutos, antes de mim :) Minha versão é mais curta em 3 bytes:lambda n,j,x:x%2-1and range(j-x/2,n-j+1,j)
Dead Possum
@DeadPossum Nice. Eu tenho uma outra solução que é um byte menor do que isso, lol
HyperNeutrino
Cometi um erro no segundo argumento de alcance. Não deve ser n-j+1, por isso, lambda n,j,x:x%2-1and range(j-x/2,n-x,j)é mais curto por um mais no total de 40 bytes
Morto Possum
@DeadPossum Espere, fomos autorizados a retornar um valor falso, em vez de uma matriz vazia?
HyperNeutrino
3
@FelipeNardiBatista é o que significa "indexado 1", btw.
Rɪᴋᴇʀ
2

Pip , 22 21 bytes

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

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

Leva n, je xcomo argumentos de linha de comando. Indexado a 0, começando na posição 0. Experimente online!

Explicação

Esta é a minha versão original de 22 bytes, porque é um pouco mais compreensível.

                       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)

A fórmula foi obtido por observação do padrão de n=9, j=3:

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

Se tomarmos x/2( 0, 1, 2), subtrair j-1( 2, 1, 0), e acrescentar que [0;3], obtemos o resultado correto em todos os casos.

DLosc
fonte
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];}

Porta quase direta da minha resposta Python. O intervalo ainda não existe em Java.

HyperNeutrino
fonte
0

Haskell, 43 bytes

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

Portado diretamente da resposta Python do HyperNeutrino

Código mais bem formatado:

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

EDIT: Esqueci de mencionar que era um indexado

Nome de exibição genérico
fonte
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
fonte