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
ctres 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"
..."*"+vtambié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ónmpara eliminarnelementos y luego inserta todos losrestargumentos. 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
zpara agregar una nueva palabra. Tomamos losbcaracteres antes de la palabra, rellenando con espacios si es necesario, luego el nuevo texto con un asterisco, luego la partezdespués de la nueva palabra. Tenga en cuenta que los espacios finales nunca se agregan.La
reduceversió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
putscon$><<(lo que no requiere espacio extra)..chompse puede eliminar..to_ieso 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\sdecepcionado ¡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.slicemé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=[' ']*256a los parámetros debería guardar otro. Además, creo que puedes cambiarreturnaprint.p=input()(Python 2) en lugar de una función, lo que evita la sangría. Además,b+len(a)+1puede serb-~len(a)for a,b in input():.Perl, 66 bytes
Script de 63 bytes + 3 bytes para
-pNada 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
-pOtra 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[XGcon 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 quevcontiene la posición y la cadena.Uso
Compruébalo corriendo aquí
fuente