Faire la queue avec des amis

16

Vous êtes avec votre meilleur ami, Jim, au parc d'attractions et lorsque votre trajet préféré apparaît, vous et Jim échangez des regards. Naturellement, vous courez pour vous aligner. Malheureusement, il gagne parce que vous êtes un golfeur et qu'il pratique un vrai sport (désolé amis). En fait, vous êtes si loin derrière vous que Jim et vous êtes séparés par des xgens. En supposant que la ligne est longue net que vous êtes à l'arrière et que la ligne zig et zags toutes les jpersonnes, à quelles positions de la ligne vous et Jim serez-vous dans la même colonne vous permettant de discuter (une seule ligne à part)?

Contribution

3 entiers

  • n- La longueur de la ligne. Ce nombre sera toujours supérieur ou égal à jet sera sous la forme y * jyest un entier positif (le nombre de lignes dans la file d'attente).
  • j- Le nombre de personnes sur une ligne de la ligne (le nombre de colonnes sur une ligne). Ce nombre sera toujours supérieur à 0.
  • x- Le nombre de personnes entre vous et Jim tel que 0 <= x < 2j - 1. Astuce: si ce nombre est impair, votre sortie doit être vide.

Production

Une liste de positions entières dans la ligne à laquelle Jim se trouve dans la même colonne que vous.
1 Ces entiers peuvent être indexés 0 ou 1 tant que vous spécifiez dans votre réponse.
2 Ces nombres entiers peuvent supposer que vous commencez à la position 0 ou à la position n-1 tant que vous spécifiez dans votre réponse.

Exemple

Exemple de file d'attente petit
Dans cet exemple, l'entrée serait n = 9, j = 3, x = 0. La sortie devrait être 2, 5parce que votre position est 2 ou 5 lorsque vous êtes dans la même colonne que Jim

Cas de test

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

Notation

Il s'agit de , donc la réponse la plus courte (en octets) l'emporte.

Poussée
la source
4
Je suis la file d' attente Rious pour voir des solutions intéressantes à cela! (désolé mauvais jeu de mots et aussi mauvaise utilisation du mot mais peu importe, ne me jugez pas: P)
HyperNeutrino
1
Pouvons-nous retourner une valeur falsifiée au lieu d'un tableau vide?
Rɪᴋᴇʀ
@Riker, je ne vois aucune raison de refuser cela. Allez-y
Poke

Réponses:

9

Python 2 , 45 41 40 37 octets

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

À peu près la solution triviale. J'ai juste rapidement recherché des motifs et trouvé un motif. 1 indexé, 1 est à l'arrière de la file d'attente.

-4 octets en évitant les ternaires et en utilisant un tableau pour les valeurs à la place
-1 octet grâce à l'inspiration de @DeadPossum, en utilisant à la andplace des ternaires ou des sélecteurs de tableau
-3 octets en basculant vers ordans l'ordre inverse. Fonctionne uniquement en raison de l'indexation 1

De plus, barré 4 est toujours 4 sur tous les 4 :(

Essayez-le en ligne!

HyperNeutrino
la source
Lol, tu as posté seulement 14 minutes, avant moi :) Ma version est plus courte de 3 octets:lambda n,j,x:x%2-1and range(j-x/2,n-j+1,j)
Dead Possum
@DeadPossum Nice. J'ai une autre solution qui est un octet plus court que ça, lol
HyperNeutrino
J'ai eu une erreur dans le deuxième argument de gamme. Cela ne devrait pas être le cas n-j+1, donc lambda n,j,x:x%2-1and range(j-x/2,n-x,j)est plus court d'un de plus au total de 40 octets
Dead Possum
@DeadPossum Attendez, avons-nous été autorisés à retourner une valeur falsifiée au lieu d'un tableau vide?
HyperNeutrino
3
@FelipeNardiBatista c'est ce que signifie "1-indexé", btw.
Rɪᴋᴇʀ
2

Pip , 22 21 octets

20 octets de code, +1 pour l' -pindicateur.

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

Prend n, jet xcomme arguments de ligne de commande. 0 indexé, à partir de la position 0. Essayez-le en ligne!

Explication

Ceci est ma version originale de 22 octets car elle est un peu plus compréhensible.

                       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 formule a été obtenue en observant le motif pour n=9, j=3:

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

Si nous prenons x/2( 0, 1, 2), soustraire de j-1( 2, 1, 0), et ajouter que [0;3], nous obtenons le résultat correct dans tous les cas.

DLosc
la source
1

Java 8 lambda, 101 octets

(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];}

Port presque direct de ma réponse Python. La plage n'existe cependant pas en Java.

HyperNeutrino
la source
0

Haskell, 43 octets

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

Porté à peu près directement à partir de la réponse Python d'HyperNeutrino

Code plus bien formaté:

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

EDIT: J'ai oublié de mentionner qu'il était à un index

Nom d'affichage générique
la source
0

C # - 91 octets

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
la source