Si alguna vez ha intentado agregar etiquetas a una trama realmente densa, se dará cuenta de que a veces las etiquetas se superponen entre sí, lo que las hace difíciles de leer. Vamos a hacer algo similar pero en 1D.
La entrada será una secuencia de (label, x-coordinate)
pares, y la salida será el resultado de dibujar cada punto y etiqueta, en el orden dado. Se *
debe colocar un asterisco que represente el punto en la coordenada x dada y la etiqueta debe seguir. Los caracteres existentes se sobrescribirán.
Por ejemplo, si la entrada fue
Hello 0
World 8
Fizz 3
Buzz 5
PPCG 16
X 9
Entonces sucedería lo siguiente:
*Hello
*Hello *World
*He*Fizz*World
*He*F*Buzzorld
*He*F*Buzzorld *PPCG
*He*F*Buz*Xrld *PPCG
La línea final se debe generar.
Reglas de E / S
La entrada puede consistir en cualquier número de pares. Cada etiqueta constará solo de letras mayúsculas y minúsculas, y las longitudes de las etiquetas serán como máximo 127 caracteres. Cada coordenada x estará entre 0 y 127 inclusive.
La entrada puede estar en cualquier lista conveniente o formato de cadena de manera que los pares no sean ambiguos y las etiquetas / coordenadas x se alternen en la entrada. Por ejemplo, un formato como
[("Hello", 0), ("World", 8) ...]
o[0 "Hello" 8 "World" ...]
está bien. Sin embargo, no puede suponer dos listas separadas de etiquetas y coordenadas x.Las funciones y los programas completos están bien.
Cualquier punto no cubierto por una etiqueta debe representarse con un espacio. Sin embargo, puede que no haya ningún espacio en blanco inicial o posterior ajeno a una sola línea final opcional.
Ejemplos
Entrada:
OneLabel 10
Salida:
*OneLabel
Entrada:
Heathrow 0
Edinburgh 2
London 4
Liverpool 6
Oxford 8
Salida:
*H*E*L*L*Oxfordl
Entrada:
alpha 20
beta 4
gamma 57
delta 3
epsilon 22
zeta 32
eta 53
theta 27
Salida:
*delta *a*epsi*thetazeta *eta*gamma
Entrada:
abc 5
d 5
abc 10
ABCDEFGHIJKLMNOPQRSTUVWXYZ 127
Salida:
*dbc *abc *ABCDEFGHIJKLMNOPQRSTUVWXYZ
Tenga en cuenta que las etiquetas y / o las coordenadas x pueden repetirse.
Respuestas:
CJam,
242319 bytesEsto lee la entrada como una matriz CJam de pares de coordenadas-etiqueta.
Pruebe este violín en el intérprete de CJam o verifique todos los casos de prueba a la vez.
¡Gracias a @ MartinBüttner por ayudarme a ahorrar 4 bytes!
Cómo funciona
fuente
Pyth, 20 bytes
Pruébelo en línea: Demostración o conjunto de pruebas
Explicación
fuente
JavaScript ES6, 104 bytes
Ejemplo de uso
Entrada en una consola compatible:
Salida de la última declaración:
Explicación
Esto crea una función anónima de
c
tres expresiones que se han unido lógicamente. Las dos primeras afirmaciones son siempre verdaderas, y las reglas de cortocircuito de JS dicen que siempre que la primera sea verdadera, devuelva el valor completo en el lado derecho (sin coaccionar a booleano): entonces esto es formalmente equivalente aLa primera declaración tiene que estar entre paréntesis arriba porque el operador de asignación
=
tiene menor prioridad que el operador lógico AND&&
.El ensamblaje "parámetro de reposo"
..."*"+v
también es parte de ES6; concatena un líder*
a la cadena y luego lo interpreta como un parámetro similar a una lista, dividiéndolo en un grupo de argumentos que se proporcionanArray.prototype.splice
, que toma(m, n, ...rest)
y modifica su matriz en la posiciónm
para eliminarn
elementos y luego inserta todos losrest
argumentos. Para lograr esto antes de ES6, usaría los más engorrosos:La matriz se concatena con la cadena vacía y se elimina el espacio en blanco al final.
fuente
Python 2, 67 bytes
Toma como entrada
[('Heathrow', 0), ('Edinburgh', 2), ('London', 4), ('Liverpool', 6), ('Oxford', 8)]
e imprime el resultado.Python no permite que se modifiquen las cadenas, y la conversión hacia y desde una lista es costosa. Entonces, esto recrea la cadena
z
para agregar una nueva palabra. Tomamos losb
caracteres antes de la palabra, rellenando con espacios si es necesario, luego el nuevo texto con un asterisco, luego la partez
después de la nueva palabra. Tenga en cuenta que los espacios finales nunca se agregan.La
reduce
versión es 3 caracteres más larga (70):fuente
Ruby,
948175 bytesGolfizado:
Aquí está el código sin golf:
¡Gracias @ w0lf por las sugerencias sobre la asignación de la entrada!
Gracias @ w0lf y @Not que Charles por la idea de eliminar una variable.
fuente
puts
con$><<
(lo que no requiere espacio extra)..chomp
se puede eliminar..to_i
eso lo atrapará. Buen pensamiento. Gracias @ w0lf!s[int, int]
formulario en lugar des[range]
ahorrar 1 char.Javascript 121 caracteres
Usando características no estándar, funciona en Firefox.
x=Array(255).fill(" ");eval(prompt()).map(s=>{s[0].split``.map((n,i)=>x[s[1]+i+1]=n);x[s[1]]="*"});x=x.join``.trimRight()
Versión antigua:
x=Array(255).fill(" ");eval(prompt()).map(s=>{s[0].split``.map((n,i)=>x[s[1]+i+1]=n);x[s[1]]="*"});x=x.join``.replace(/ +$/,"")
fuente
/ +/
tiene mucho más sentido que\s
decepcionado ¡Me lo perdí! ¿Podría guardar bytes usandox=' '.repeat(255);
y evitando.join
?.split('')
hacerlo en una estructura de datos mutable, pero en ese puntoArray(255).fill(' ')
es más corto. En mi versión, la mayoría de mis ahorros provienen de (a) usar la regla "puede dar una función o programa" para eliminareval(prompt())
a cambio dec=>
y (b) usar elArray.prototype.slice
método incorporado con un parámetro de descanso para acortar un poco la parte lógica .[].map.call(s[0],
tampoco guarda nada ...Python, 85 bytes
Pruébalo en línea
fuente
'z'[2::5]
(backticks en lugar de apóstrofes) en lugar de''.join(z)
guardar un byte, y moversez=[' ']*256
a los parámetros debería guardar otro. Además, creo que puedes cambiarreturn
aprint
.p=input()
(Python 2) en lugar de una función, lo que evita la sangría. Además,b+len(a)+1
puede serb-~len(a)
for a,b in input():
.Perl, 66 bytes
Script de 63 bytes + 3 bytes para
-p
Nada muy especial, utilizando las variables
$`
y$'
que son 'antes del partido' y 'después del partido' respectivamente, en lugar de dividir la cadena. Usé un$}
para la variable de cadena ya que originalmente me estaba ahorrando un byte, ¡pero ya no lo es!Ejemplo de ejecución:
Perl, 65 bytes
Script de 62 bytes + 3 bytes para
-p
Otra versión que imprime cada línea (¡por un byte menos!). (Sí, hice esto porque no leí la pregunta correctamente ...)
Ejemplo de ejecución:
fuente
PHP - 84 bytes
Utiliza códigos de escape ANSI para colocar el cursor (
\x1b[XG
con el carácter Escape y X como la coordenada basada en 1), seguido de la*
cadena de entrada para esa fila. Acepta entradas en la línea de comando del formulario:Acepta entradas de varias palabras si están entre comillas, ya que son argumentos de línea de comandos.
fuente
C ++ 11, 95 bytes
Por qué no?
Como una función, reciba la entrada como un
map<int, string>
nombre quev
contiene la posición y la cadena.Uso
Compruébalo corriendo aquí
fuente