Interpretar rangos sueltos
ListSharp es un lenguaje de programación interpretado que tiene muchas características, una de esas características es un creador de rango basado en 1 índice que funciona así:
Defina un rango como (INT) TO (INT)
o solo (INT)
donde ambos o el int único pueden ir del valor mínimo al máximo int32
Entonces puede usar esos rangos para extraer elementos de una matriz sin temor a sobrepasar sus límites
por lo tanto:
1 TO 5
genera: {1,2,3,4,5}
3
genera: {3}
Los rangos se pueden sumar usando el AND
operador
1 TO 5 AND 3 TO 6
genera: {1,2,3,4,5,3,4,5,6}
recuerda que esto también funciona con números negativos
3 TO -3
genera: {3,2,1,0,-1,-2,-3}
El desafío es el siguiente:
Entrada
Una matriz de caracteres y la cláusula de rango previamente definida como una cadena
Salida
Los elementos en las ubicaciones del rango basadas en 1 índice (los índices no existentes / negativos se traducen en un carácter vacío)
Cómo ganar
Como un desafío de código de golf , se supone que debes crear el programa con el menor recuento de bytes para ganar
Se ha señalado que los caracteres vacíos no existen, por lo tanto, debe ignorarlos (solo los mostré aquí para que sea más fácil de entender, pero confundió a las personas)
Casos de prueba:
input array is:
{'H','e','l','l','o',' ','W','o','r','l','d'}
range clause:
"1 TO 3" => "Hel"
"5" => "o"
"-10 TO 10" => "Hello Worl"
"0 AND 2 AND 4" => "el"
"8 TO 3" => "oW oll"
"-300 AND 300" => ""
"1 TO 3 AND 3 TO 1" => "HelleH"
"-20 TO 0 AND 1 AND 4" => "Hl"
fuente
"0 TO 2"
=>{'H', 'e', 'l'}
?3 TO 3
una entrada y cuál es la salida esperada?AND
ing rangos múltiples. Además, no respondió si podemos usar la indexación basada en cero, que es estándar en la mayoría de los idiomas.Respuestas:
Python 2 -
239211210 bytes¡Gracias a @ mbomb007 y @Cyoce por seguir jugando al golf con esta solución!
Enfoque directo. Probé generadores y una versión recursiva, pero no pudieron superar lo simple para cada ciclo. Soy un novato en el golf, así que lo más probable es que esto pueda mejorarse bastante. Además, la falla principal de este fragmento es que el rango como un objeto de lista se calcula nuevamente cada vez que se recupera un elemento de la matriz de caracteres (ver última línea, comprensión de la lista). Esto significa que
r(s)
se ejecutalen(r(s)) + 1
veces.Código sin golf:
Casos de prueba:
Salida:
fuente
if
en la misma línea y separarlos con punto y coma. Y quitar el espacio adentro[x] for
. Además,1if b else-1
se puede reemplazar conb and 1or-1
o2*bool(b)-1
para guardar un byte.lambda
, ya que no es recursivo.t+=[int(x)]
canbecomet+=int(x),
Groovy (
9997 Bytes)Pruébelo aquí: https://groovyconsole.appspot.com/edit/5155820207603712
Explicación:
.replaceAll(" TO ","..")
- Reemplace el to con un rango tradicional..replaceAll(" AND ", ",")
- Reemplace todos los ands con una coma."[${...}]"
- Rodéelo con la notación "lista" en Groovy.Eval.me(...)
- Evaluar la cadena como código Groovy..flatten()
- Acoplar la mezcla de matriz 2D y matriz 1D en una matriz 1D..collect{v[it]}
- Recoge los índices de la matriz en una sola estructura.Aquí hay una solución de
115113 bytes que elimina nulos de la salida: https://groovyconsole.appspot.com/edit/5185924841340928Aquí hay una solución de 117 bytes si dice que DEBE indexarse en 1 en lugar de 0: https://groovyconsole.appspot.com/edit/5205468955803648
Si quiere que cambie el original por el byte 113/117, avíseme.
fuente
Eval.me(...)
hasta ahora; dado que usarlo en la práctica sería ridículamente inseguro, aún es algo genial de saber.C #, 342 bytes
Método sin golf:
Programa completo con casos de prueba:
Una solución ingenua, usando una lista de caracteres, que se usa
' '
como un personaje vacío y hace el trabajo. Con la esperanza de mejorar pronto.fuente
Scala, 165 bytes
Explicación:
fuente
Python 2,
156155bytesMi respuesta tiene algunas ideas similares a la respuesta de 1Darco1 , pero al usar un enfoque diferente desde el principio (corte de cadenas en lugar de listas), terminó siendo un poco más corto. Sería cuatro bytes más corto si se permitiera la indexación 0.
Pruébalo en línea
Afortunadamente, puedo analizar cadenas que contienen espacios en enteros. La indexación negativa en los índices de Python desde el final de la cadena, por lo
i[-1]
que solía ser el mismoi[0]
o el segundo valor, si hay uno. Luego tengo que ajustar cualquier valor de rango negativo a más negativo, para que no se enreden con el corte. Multiplicar los valores negativos por11**9
(2357947691
) tendrá en cuenta los rangos utilizando el valor mínimo entero. Luego, simplemente corte la cadena, usando el corte inverso si el rango está invertido.Con indexación cero (151 bytes):
fuente
range
enfoque es básicamente una forma súper verbosa de exactamente eso. E incluso te deshiciste de toda laif"T"in x: else:
parte. +1R, 142 bytes
Suponiendo que entendí el desafío correctamente, aquí supongo que
r
es la cláusula de rango predefinida en formato de cadena y que la matriz de entrada ("Hola mundo", en los ejemplos) se lee desde stdin.Algunos casos de prueba:
Ungolfed / explicado
Línea 1
R tiene un buen operador infijo
:
que genera secuencias.1:5
da[1, 2, 3, 4, 5]
y0:-2
da[0, -1, -2]
. Por lo tanto, reemplazamos laTO
cláusula de rango suelto con:
.Interpretar
AND
es solo concatenación. Podemos usar la funciónc
para eso, que fácilmente puede tomar un número arbitrario de argumentos, separados por comas. Entonces reemplazamosAND
con,
y luego envolver toda la cosa en
c(
,)
.Esto produce una cadena de caracteres que podría verse
c( 1 : 5 , 7 )
. Llamamosparse
a convertir para escribir "expresión" y luegoeval
evaluar la expresión. La secuencia de números resultante se reasigna a la variabler
.Línea 2
Ahora para la parte fea: lidiar con cadenas en R, que se vuelve desordenado rápidamente. Primero definimos
e
como una cadena vacía (la necesitaremos más adelante).Leemos desde stdin y convertimos la cadena de caracteres en una matriz de caracteres individuales dividiéndolos en la cadena vacía. (Por ejemplo, vamos de "Hola" a ["H", "i"].) Esto devuelve una lista de longitud 1, por lo que tenemos que pedir el primer elemento
[[1]]
para obtener una matriz con la que podamos trabajar. Ugh, te advertí que esto era desordenado.R indexa a partir de 1, y tiene una buena característica con números negativos. Supongamos que
x
es['a', 'b', 'c']
. Llamandox[1]
sorprendentemente regresa'a'
. Las llamadasx[-1]
devuelven todox
excepto el índice1
, es decir['b', 'c']
. Esta es una característica interesante, pero significa que debemos tener cuidado con nuestros índices negativos para este problema. Entonces, por ahora, solo devolvemos los elementos de la matriz de entrada con índice>0
y asignamos el resultado ao
.Línea 3
Sin embargo, hay un problema! Para los índices que son mayores que la longitud de la matriz, R solo devuelve
NA
valores. Lo necesitamos para devolver cadenas vacías. Así que volvamos a definir los elementos deo
para los queis.na(o)
esTRUE
ser la cadena vacía.Línea 4
Finalmente, ¿cómo lidiamos con los índices negativos (y cero)? Todos necesitan devolver la cadena vacía, por lo que repetimos la cadena vacía N veces, donde N es el número de índices que hay
<1
.Finalmente, concatenamos la lista previamente definida
o
a esta (potencialmente vacía).fuente
JavaScript (ES6), 141
Función sin nombre con 2 parámetros, el primero es la matriz de caracteres (puede ser una cadena) y el segundo la cadena que contiene la definición del rango.
El valor de retorno es una matriz donde cada elemento puede ser un solo carácter o el valor js
undefined
. Cuando se encadena, esto da como resultado una secuencia de caracteres separados por comas que se muestran indefinidos como caracteres "vacíos", como los casos de prueba en la primera versión de la pregunta.Utilizando
.join
puede obtener un resultado de cadena similar al resultado del caso de prueba en la versión actual de la pregunta.Menos golf
Prueba
fuente
Perl - 110 bytes
Llamar al script en la línea de comando con la cadena como primer argumento y el rango como el segundo.
Desfuscado:
fuente
Python 2, 146 bytes
Todas las pruebas están en ideone
Divide la cláusula,
s
en "Y", divide cada una de las subcláusulas resultantes en "TO", convierte las cadenas resultantes paraint
usarmap
. Los resultados tendrán cada uno 1 o 2 elementos (1 si no estaba presente "TO" en la subcláusula).Construye rangos basados en 0 para cada uno de estos utilizando el parámetro de paso de rango como 1 o -1 mediante la inspección de los valores en los índices 0 y -1 (una lista con una entrada tiene esa entrada en ambos índices).
Se ejecuta a través de estos rangos y construye una lista de la salida, si los índices proporcionados están dentro del rango (
if 0<=i<len(a)
).fuente
Jalea ,
28 2725 bytesTryItOnline (también funcionará con una cadena en lugar de una matriz de caracteres)
¿Cómo?
fuente
Clojure
232230229 bytesOh, qué monstruo he creado ... Pero en realidad esto era 260 cuando estaba a punto de enviarlo.
Editar: eliminó un espacio de
#(get r %_"")
,(if_(< f t)
y(take-nth 2_%)
(indicado como_
).Menos golfizado:
Usos
clojure.string/split
para dividir entre "Y" y "",take-nth
coloca "TO" entre enteros, la coincidencia de argumentos de función maneja el caso de 1 o 2 argumentos y eso es todo.Convención de convocatoria:
(f "Hello World" "1 TO 3 AND 2 AND 8 TO 2")
fuente
#
caracteres.#
? Lo probé sin éxito, se "fusionó" con el token anterior. Oh, un espacio más para eliminar antes de%
allí.