Diapositiva Cha-Cha de indexación

12

Introducción:

Aunque originalmente tenía una canción holandesa en mi cabeza, donde están las letras: " Doe 'n stapje naar voren, en' n stapje terug " (que se tradujo como " Da un pequeño paso adelante y un poco atrás "), cuando Busqué la letra completa, me di cuenta de que solo iban y venían, y nunca de lado.

Entonces, en cambio, ahora uso la letra de Mr C The Slide Man, también conocido como DJ Casper - Cha-Cha Slide para este desafío.

Si ignoramos todo lo demás y solo miramos las palabras "izquierda", "derecha", "atrás" y "salto" (conté "salto" como adelante), incluidas las cantidades mencionadas, la canción completa tendrá la siguiente lista ( Estoy usando las abreviaturas LRBH aquí):

LBHRLLBHRLBHHRRLLLRLBHHHHRRLLLBHHHHHRLRLRLHRLLBHHLRLBHH

Aquí la letra de la canción completa en un fragmento de código JavaScript ocultable (para ahorrar espacio), donde los movimientos y las cantidades están rodeados de paréntesis bloqueados:

Desafío:

Ahora en el desafío en sí. Tomamos una, dos o tres entradas . Uno de ellos es una lista de enteros de índice (por lo tanto, no es negativo para 0 indexado o positivo para 1 indexado). (Las otras entradas son opcionales y se explican en las reglas de desafío).

Cada caso de prueba comenzará en una posición {x=0, y=0}.
Ahora use la lista de letras de movimientos y elimine todos los movimientos en los índices dados de la lista de entrada. Luego 'camine' sobre los movimientos (hasta el índice más grande de la matriz de entrada) y genere la posición en la que terminará.

Los movimientos cambiarán las coordenadas de la siguiente manera:
- R: x+1
- L: x-1
- H: y+1
- B:y-1

Reglas de desafío:

  • Se puede acceder a la lista de movimientos de la forma que desee. †: puede ser una entrada adicional; puede estar en un archivo separado en el disco del que leerá; puede estar en una variable de nivel de clase a la que accede. Tendrá que ser en forma de L, R, By Haunque (puede ser una cadena o un personaje-list / matriz), por lo que no puede guardar la lista como se mueve- 1s y -1s o enteros.
  • La lista de movimientos dada anteriormente está codificada y siempre será la misma. (Por eso también está bien ponerlo como un campo de nivel de clase en lugar de tomarlo como entrada si esto ayuda al conteo de bytes de su respuesta).
  • La lista de entrada puede ser indexada 0 o indexada 1 (depende de usted)
  • Solo 'caminamos' los movimientos hasta y excluyendo el índice más grande de la lista.
    • †: También puede tomar este último elemento como entrada entera separada, en lugar del último elemento de la matriz de entrada.
  • La salida de las coordenadas x e y en las que terminamos puede estar en cualquier formato razonable (matriz entera que contiene dos elementos, cadena delimitada, impresa en STDOUT en dos líneas separadas, etc.)
  • Puede suponer que la lista de entrada se ordena de menor a mayor (o de mayor a menor si eso es lo que prefiere, en cuyo caso el primer elemento es el tamaño inicial de la lista de movimientos, si no se toma como entrada separada). Y tampoco contendrá índices duplicados.
  • Si el índice más grande de la lista de entrada es más grande que la lista de movimientos de arriba (55 movimientos están en la lista de movimientos de arriba), volveremos al principio de la lista nuevamente (tantas veces como sea necesario dependiendo del índice más grande) de la entrada).
  • Se le permite producir en y,xlugar de x,y, pero especifique esto en su respuesta si lo hace.

Ejemplo:

Entrada: [0,4,8,10,13,14,27,34,42,43,44,50,53,56,59,60,64]

Aquí los movimientos e índices (indexados a 0) por encima de otro:

0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64
L, B, H, R, L, L, B, H, R, L, B, H, H, R, R, L, L, L, R, L, B, H, H, H, H, R, R, L, L, L, B, H, H, H, H, H, R, L, R, L, R, L, H, R, L, L, B, H, H, L, R, L, B, H, H, L, B, H, R, L, L, B, H, R, L

Eliminando los índices de la lista de entrada, tendremos los siguientes movimientos-lista restantes:

1, 2, 3, 5, 6, 7, 9,11,12,15,16,17,18,19,20,21,22,23,24,25,26,28,29,30,31,32,33,35,36,37,38,39,40,41,45,46,47,48,49,51,52,54,55,57,58,61,62,63
B, H, R, L, B, H, L, H, H, L, L, L, R, L, B, H, H, H, H, R, R, L, L, B, H, H, H, H, R, L, R, L, R, L, L, B, H, H, L, L, B, H, L, H, R, B, H, R

Ahora, si caminamos desde la posición {0, 0}sobre los movimientos restantes, tendremos las siguientes coordenadas nuevas después de cada movimiento:

{0,0};B,{0,-1};H,{0,0};R,{1,0};L,{0,0};B,{0,-1};H,{0,0};L,{-1,0};H,{-1,1};H,{-1,2};L,{-2,2};L,{-3,2};L,{-4,2};R,{-3,2};L,{-4,2};B,{-4,1};H,{-4,2};H,{-4,3};H,{-4,3};H,{-4,5};R,{-3,5};R,{-2,5};L,{-3,5};L,{-4,5};B,{-4,4};H,{-4,5};H,{-4,6};H,{-4,7};H,{-4,8};R,{-3,8};L,{-4,8};R,{-3,8};L,{-4,8};R,{-3,8};L,{-4,8};L,{-5,8};B,{-5,7};H,{-5,8};H,{-5,9};L,{-6,9};L,{-7,9};B,{-7,8};H,{-7,9};L,{-8,9};H,{-8,10};R,{-7,10};B,{-7,9};H,{-7,10};R,{-6,10}

Entonces el resultado final será: {-6, 10}

Reglas generales:

  • Este es el , por lo que la respuesta más corta en bytes gana.
    No permita que los lenguajes de code-golf lo desanimen a publicar respuestas con lenguajes que no sean codegolf. Trate de encontrar una respuesta lo más breve posible para 'cualquier' lenguaje de programación.
  • Se aplican reglas estándar para su respuesta, por lo que puede usar STDIN / STDOUT, funciones / método con los parámetros adecuados y programas completos de tipo retorno. Tu llamada.
  • Las lagunas predeterminadas están prohibidas.
  • Si es posible, agregue un enlace con una prueba para su código.
  • Además, se recomienda agregar una explicación para su respuesta.

Casos de prueba:

0-indexed input: [0,4,8,10,13,14,27,34,42,43,44,50,53,56,59,60,64]
1-indexed input: [1,5,9,11,14,15,28,35,43,44,45,51,54,57,60,61,65]
Output: {-6, 10}

0-indexed input: [55]    (Note: There are 55 moves in the unmodified list)
1-indexed input: [56]    (Note: There are 55 moves in the unmodified list)
Output: {-6, 11}

0-indexed input: [0,1,4,5,6,9,10,15,16,17,19,20,27,29,30,37,38,39,41,44,45,46,49,51,52]
1-indexed input: [1,2,5,6,7,10,11,16,17,18,20,21,28,30,31,38,39,40,42,45,46,47,50,52,53]
Output: {10, 16}

0-indexed input: [2,3,7,8,11,12,13,14,18,21,22,23,24,25,26,31,32,33,34,35,36,38,40,42,43,47,48,50,53]
1-indexed input: [3,4,8,9,12,13,14,15,19,22,23,24,25,26,27,32,33,34,35,36,37,39,41,43,44,48,49,51,54]
Output: {-18, -7}

0-indexed input: [0]
1-indexed input: [1]
Output: {0, 0}

0-indexed input: [4,6,7,11,12,13,15,17,20,28,31,36,40,51,59,66,73,74,80,89,92,112,113,114,116,120,122,125,129,134,136,140,145,156,161,162,165,169,171,175,176,178,187,191,200]
1-indexed input: [5,7,8,12,13,14,16,18,21,29,32,37,41,52,60,67,74,75,81,90,93,113,114,115,117,121,123,126,130,135,137,141,146,157,162,163,166,170,172,176,177,179,188,192,201]
Output: {-17, 37}

0-indexed input: [25,50,75,100,125,150,175,200,225,250]
1-indexed input: [26,51,76,101,126,151,176,201,226,251]
Output: {-28, 49}
Kevin Cruijssen
fuente
¿Podemos generar las coordenadas en orden inverso?
Shaggy
3
@ Shaggy Umm, claro, ¿por qué no? Siempre que lo especifiques claramente en tu respuesta.
Kevin Cruijssen
@Arnauld Sí, los movimientos son los que se muestran y nunca cambiarán. Quizás aclararé esto más claramente si aún no estaba claro. (Por eso también puede tenerlo como un campo de nivel de clase codificado si beneficiaría su conteo de bytes.)
Kevin Cruijssen
¿Puede la salida ser un par de flotadores?
Jakob
1
Muy tarde para el desafío, pero dos de sus casos de prueba parecen tener una entrada incorrecta para el caso indexado 1: 82 adicionales en el sexto y 29 en lugar de 39 en el tercer caso de prueba (la clasificación indica que podría haber pensado que en realidad sea 28/29, pero el resultado esperado que se muestra es el uso de 38/39 allí).
sundar - Restablecer Monica

Respuestas:

4

05AB1E , 15 12 bytes

Guardado 3 bytes gracias a Erik the Outgolfer

ÝsKèIêRS¢2ôÆ

Pruébalo en línea! o como un conjunto de pruebas

Explicación

Ý                 # push range [0 ... input_int]
 sK               # remove all elements in input_list from this range
   è              # cyclically index into the moves-list with the remaining elements
    Iê            # push the unique chars of the move-list, sorted
      R           # reverse
       S¢         # count the occurrences of each char in "RLHB"
         2ô       # split into 2 parts
           Æ      # reduce each part by subtraction
Emigna
fuente
1
¡Buena respuesta! Ni siquiera lo sabía Æ. Manera inteligente de contar todos los movimientos y usar Æpara calcular la diferencia para los pares RLy BH.
Kevin Cruijssen
Æha existido para siempre, ¿no? Supongo que sí, ya que no lo sabía. Parece que los comandos que creo que son "nuevos" han existido desde el inicio, pero nunca supe cómo usarlos jajaja. Oh, +1
Urna de pulpo mágico
@MagicOctopusUrn: De hecho, ha existido para siempre;)
Emigna
7

Ruby , 98 ... 58 55 bytes

->a{([*0..a[-1]]-a).sum{|c|-1i**(m[c%55].ord%19)}.rect}

Pruébalo en línea!

Explicación:

El truco principal es usar números complejos para representar movimientos: 'B' es -i, 'H' es + i, 'L' es -1 y 'R' es +1. Si convertimos todos los movimientos en números complejos, con una sola suma obtenemos el resultado correcto.

Intenté diferentes formas, pero luego encontré el número mágico 19: no necesitamos jugar con la coincidencia de expresiones regulares porque:

B  is ASCII 66; 66%19=9  and i^9  = i
H  is ASCII 72; 72%19=15 and i^15 =-i
L  is ASCII 76; 72%19=0  and i^0  = 1
R  is ASCII 82; 82%19=6  and i^6  =-1

Entonces, junta todo eso, suma, invierte el signo y listo.

Gracias Jakob por -3 bytes

GB
fuente
¡Uso inteligente de números complejos! Como la cadena de movimiento es fija, puede reemplazarla (m*c+m)[c]por m[c%55].
Jakob
4

JavaScript (ES6), 85 bytes

Según las reglas de desafío, este código espera que la cadena de alcance global m contenga la lista de movimientos. (Ahorrando 3 bytes, como lo sugiere @KevinCruijssen.)

Toma la entrada como una lista de índices basados ​​en 0, ordenados de menor a mayor.

a=>a.map(g=i=>j++<i&&g(i,p=m.search(m[~-j%55])*3%5,x+=--p%2,y-=--p%2),j=x=y=0)&&[x,y]

Pruébalo en línea!

¿Cómo?

Cada personaje de movimiento se convierte a su posición en la cadena de movimiento "LBHR...". Multiplicamos el resultado por 3 y aplicamos un módulo 5 , que da p . Entonces tenemos:

  • dx = ((p-1) mod 2)
  • dy = - ((p-2) mod 2)

Donde el signo de un mod b es el de a .

 character | position | * 3 | mod 5 | dx | dy
-----------+----------+-----+-------+----+----
    'L'    |     0    |  0  |   0   | -1 |  0
    'B'    |     1    |  3  |   3   |  0 | -1
    'H'    |     2    |  6  |   1   |  0 | +1
    'R'    |     3    |  9  |   4   | +1 |  0
Arnauld
fuente
3

Jalea , 14 bytes

Rḟị⁵ċⱮ⁵QṢṚ¤_2/

Pruébalo en línea!

Argumento 1 / Argumento a la izquierda: Índice máximo basado en 1.
Argumento 2 / Argumento correcto: índices basados ​​en 1.
Argumento 3: Lista de movimientos como una cadena. La función sigue siendo reutilizable si se utiliza el tercer argumento de línea de comandos para este propósito.

Erik el Outgolfer
fuente
3

Java 10, 129 119 112 107 100 86 bytes

a->m->{var r=new int[2];for(;m-->0;)r[s[m%55]/73]-=a.add(m)?s[m%55]*3%5-2:0;return r;}

Toma el máximo como entrada adicional; move-list es una matriz de caracteres a nivel de clase.

Inspirado por @Emigna respuesta 05AB1E 's .
-7 bytes gracias a @Jakob .
-14 bytes gracias a @Geobits .

Pruébalo en línea.

Explicación:

a->m->{              // Method with Integer-Set & int parameters and int-array return
  var c=new int[2];  //  [x,y] result-array, starting at {0,0}
  for(;m-->0;)       //  Use the `m` input as index, and loop in the range (`m`, 0]
    r[s[m%55]/73]-=  //   Subtract from either x or y based on the character:
     a.add(m)?       //    If the input-set doesn't contain the current index `m`:
      s[m%55]*3%5-2  //     Modify the x or y coordinate based on the character
     :               //    Else:
      0;             //     Leave the x or y coordinate unchanged
  return r;}         //  Return count(R)-count(L) and count(H)-count(B) as result

s[m%55]/73se asigna a la coordenada x o y según el carácter ( Pruébelo en línea ):

Letter    Unicode value    /73

B         66               0
H         72               0
L         76               1
R         82               1

s[m%55]*3%5-2asigna al personaje correcto +1o -1dependiendo del personaje ( Pruébelo en línea ):

Letter    Unicode value    *3     %5    -2

B         66               198    3     1
H         72               216    1     -1
L         76               228    3     1
R         82               246    1     -1
Kevin Cruijssen
fuente
1
Si toma la lista de índice como un conjunto mutable, puede usarla a.add(m)como ifcondición.
Jakob
Y int c[]puede ser int[]c.
Jakob
1
@Jakob Ah, int c[]era de una versión anterior donde todavía usaba un índice en ilugar de usar m. E inteligente de usar un Set en addlugar de !contains, ¡gracias!
Kevin Cruijssen
1
Puede evitar la sustracción de byte-hogging al final usando c[2]for axis (with s[m%55]/73) y caminando con algo como 3*s[m%55]%5-2(ojalá pudiera ver una forma de acortar eso, pero ...). Junto con un ternario, es a->m->{var c=new int[2];for(;m-->0;)c[s[m%55]/73]-=a.add(m)?3*s[m%55]%5-2:0;return c[1]+","+c[0];}por 98.
Geobits
@Geobits Gracias! Y -12 bytes más simplemente devolviendo el en int[]lugar de una cadena. :)
Kevin Cruijssen
2

Python 3, 85 bytes

bes la lista de índice (a set) y les el índice final. La lista de movimientos (una cadena o lista de caracteres) aparece libre como s. Este es un puerto de la respuesta Ruby de GB , y una explicación del enfoque se puede encontrar allí.

def f(b,l):r=sum(-1j**(ord(s[i%55])%19)for i in set(range(l))-b);print(r.real,r.imag)

Pruébalo en línea

Sin golf

def f(b, l):
    r = sum(
        -1j ** (ord(s[i % 55]) % 19)
        for i in set(range(l)) - b
    );
    print(r.real, r.imag)
Jakob
fuente
2

MATL , 16 bytes

:wX-)Jw19\^s_&Zj

Pruébalo en línea!

Toma 3 entradas como la respuesta Jelly, el índice más grande, la lista de índices para omitir y la matriz de 55 caracteres.

sundar - Restablecer a Monica
fuente
1

Limpio , 148 ... 130 bytes

import StdEnv
$i=foldr(\a(x,y)|any((==)a)i=(x,y)=case m.[a rem 55]of'H'=(x,y+1);'B'=(x,y-1);'L'=(x-1,y);_=(x+1,y))(0,0)[0..last i]

Pruébalo en línea!

Define la función $ :: [Int] -> (Int, Int), tomando una lista de (ordenados de menor a mayor) índices que se eliminarán de los movimientos antes de foldrfinalizar las operaciones correspondientes (0,0).

Οurous
fuente