¡Gracias a @KritixiLithos por ayudarme con este desafío!
V es un lenguaje de programación que escribí para poder usar y extender vim para desafíos de código de golf. ¡El primer compromiso fue el 3 de marzo de 2016, lo que significa que hoy V cumple un año! Woo-hoo
Durante el primer año de existencia de V, hubo 176 confirmaciones de cuatro colaboradores diferentes, 140 respuestas de 12 usuarios diferentes y demasiados operadores duplicados rotos para contar . Tiene un intérprete en línea , generosamente alojado por @Dennis, que se ha ejecutado casi 8,000 veces desde diciembre .
¡Tengamos un desafío para celebrar el cumpleaños de V! Dado que la mayoría de las funciones en V están diseñadas con la manipulación de cuerdas y el arte ascii en mente, parece natural que cualquier desafío que celebre V se deba al arte ascii. Por lo tanto, su desafío para hoy es tomar una palabra como entrada y remodelar esa palabra en forma de V. Por ejemplo, la entrada "Hola" debería dar la siguiente V:
Hello olleH
Hello olleH
Hello olleH
Hello olleH
Hello olleH
HellolleH
HellleH
HeleH
HeH
H
Aquí hay algunos detalles sobre cómo debería verse su V. Si la cadena de entrada tiene una longitud de n caracteres, la V debe tener n*2
líneas altas. La primera línea debe consistir en:
<input string><(n*2) - 1 spaces><input string reversed>
En cada nueva línea, se agrega un espacio al principio, y los dos lados de la cadena se mueven uno hacia el otro, eliminando los caracteres superpuestos. Hasta la última línea, que es solo el primer carácter de entrada. El espacio en blanco al final de cada línea es aceptable, y también se permite una nueva línea al final.
Puede suponer que la entrada siempre será ASCII imprimible sin ningún espacio en blanco, y puede tomar la entrada y la salida en cualquier método razonable. Aquí hay algunas entradas de muestra más:
Happy:
Happy yppaH
Happy yppaH
Happy yppaH
Happy yppaH
Happy yppaH
HappyppaH
HapppaH
HapaH
HaH
H
Birthday:
Birthday yadhtriB
Birthday yadhtriB
Birthday yadhtriB
Birthday yadhtriB
Birthday yadhtriB
Birthday yadhtriB
Birthday yadhtriB
Birthday yadhtriB
BirthdayadhtriB
BirthdadhtriB
BirthdhtriB
BirthtriB
BirtriB
BiriB
BiB
B
V!:
V! !V
V! !V
V!V
V
~:
~ ~
~
Por supuesto, dado que esto es código golf , las lagunas estándar están prohibidas y su objetivo es escribir el programa más corto posible para completar esta tarea. ¡Feliz golf!
Por lo que vale, tengo un punto débil para las respuestas de vim, así que puntos de bonificación imaginarios por usar vim o V, aunque cualquier lenguaje es aceptable. :)
Respuestas:
MATL ,
2114 bytes¡MATL le desea a V un feliz cumpleaños!
Pruébalo en línea!
Explicación
Considere la entrada
de longitud
n=5
. El código calcula la convolución 2D de esta cadena con la matriz de identidad de tamaño2*n
,El resultado de la convolución, convertida a char y con char 0 mostrado como espacio, es
Luego, las columnas
[1, 2, ..., 2*n-1, 2*n, 2*n-1, ..., 2, 1]
se seleccionan de esta matriz de caracteres, produciendo el resultado deseado:Código comentado
fuente
V ,
24, 23, 20 bytesPruébalo en línea!
Mucho más corto ahora que V tiene un operador 'inverso' .
No es tan impresionante en comparación con los otros idiomas de golf que han respondido, pero tenía que hacerse. Hexdump:
Explicación:
En este punto, el búfer se ve así:
No, construiremos recursivamente el triángulo hacia abajo.
Aquí es donde puedo mostrar una de mis características favoritas de V. Muchos comandos requieren una discusión. Por ejemplo, el
>
comando sangrará un número variable de líneas dependiendo del argumento:pero la mayoría de los comandos se verán obligados a finalizar con un argumento predeterminado (generalmente la línea actual) si se encuentra al final del programa y no se especifica. Por ejemplo, lo que V realmente ejecuta para nuestro bucle recursivo es:
El segundo
ò
se rellena implícitamente. Lo bueno es que los comandos terminados implícitamente aplican varias capas de profundidad, por lo que aunque solo escribimos>
, V dará implícitamente_
su argumento y sangrará la línea actual.fuente
Brainfuck , 152 bytes
Esta es una ocasión tan trascendental que decidí descifrar el viejo intérprete BF y darle un giro a esto.
Con comentarios
Pruébalo en línea!
fuente
> <> , 221 bytes
Pasé manera demasiado tiempo en esto. Feliz cumpleaños V!
Puede probarlo en línea , pero es mucho más divertido obtener este intérprete y ejecutarlo con la
--play
banderaque da como resultado la animación a continuación.
Ejemplo
(tarda un poco menos de dos minutos)
Explicación
Debido a que la parte interesante de esta respuesta es envolverla en la
V
forma, aquí hay una explicación que se ajusta a ella. Utilizamos la siguiente versión numerada para referencia.A veces, las flechas (→ ↓ ←) se utilizan para indicar la dirección en la que se alcanza un fragmento.
Inicialización
La primera línea empujará 2n a [0,1], dejará n en la pila y agregará un espacio. Luego, subimos y giramos hacia la segunda línea a la derecha, donde comenzaremos a ir a la izquierda. Hay un bucle para agregar n + 1 espacios. Esto funciona de la siguiente manera.
Una vez finalizado esto, rebota hacia la línea 3. Allí se eliminan los dos elementos superiores de la pila (0 y un espacio) (
~~
) y saltamos a laX
ubicación en [10,1] (a1.
), continuando hacia la derecha. Nos encontramos en la/
línea 7 y comenzamos el ciclo principal del programa.Bucle principal ( 2n veces lo hacen)
Esta es la condición del bucle. Al principio, la pila se invierte para imprimir. Luego obtenemos el contador de [1,0] (
01g
) y almacenamos una versión decrementada (:1-01p
). Al dar vueltas y saltos hacia arriba y hacia la derecha, encontramos el condicional para terminar el programa. Si no terminamos, saltamos al primer ciclo de impresión.Primer bucle de impresión (mitad izquierda)
Comenzamos con la longitud en la parte superior de la pila y ejecutamos el siguiente código siempre que el elemento superior no sea 0.
Esto imprimirá la pila sin descartarla. Si el ciclo termina, saltamos a la derecha en la línea 5, preparándonos para el próximo ciclo de impresión.
Preparación de la mitad derecha
Esta fue una de las partes más difíciles de colocar. A continuación se muestra una versión despojada de todas las direcciones para indicar lo que sucede.
Luego empujamos la longitud de lo que se va a imprimir y comenzamos el segundo ciclo de impresión (con un duplicado inicial que no forma parte del ciclo).
Segundo bucle de impresión (mitad derecha)
El código que se ejecuta es completamente el mismo que en el primer bucle de impresión, y
o}
se coloca un poco más lejos porque había ubicaciones disponibles. Al finalizar, nos quedan algunas cosas por hacer antes de que podamos verificar el bucle principal invariante nuevamente. Después~
de que se ejecuta la línea 9, nos ajustamos verticalmente, terminando en el siguiente fragmento de código.Primero
ao
imprimirá una nueva línea. Luego rebotamos y llegamos exactamente al mismo lugar después de la inicialización, es decir, saltando alX
.fuente
Brain-Flak , 486 + 1 = 489 bytes
¡Feliz cumpleaños V de Brain-Flak!
También un agradecimiento a 0 ' que proporcionó parte del código utilizado en esta respuesta
+1 debido a la
-c
bandera que se requiere para la entrada y salida de ASCIIPruébalo en línea!
Esta es sin duda la cosa más difícil que he hecho en Brain-Flak.
Brain-Flak es notoriamente terrible para duplicar y revertir cadenas y este desafío consiste en nada más que duplicar y revertir cadenas.
Logré obtener este fragmento casi funcional en menos de una hora de trabajo duro, pero agregar en los últimos espacios resultó ser una de las cosas más difíciles que he hecho en Brain-Flak.
Explicación
La idea básica es que primero crearemos la parte superior de la V y cada iteración eliminará dos caracteres del medio y agregará un espacio al comienzo.
En la práctica esto se vuelve bastante difícil.
Existen algoritmos existentes para copiar y revertir, así que utilicé uno de esos para crear una copia reversa del código en la pila. Una vez que lo he hecho, pongo
2n-1
espacios en la parte superior de la pila original y muevo la pila de nuevo sobre la pila para crear un emparedado.Ahora tenemos nuestra fila superior. Ahora queremos eliminar dos caracteres desde el principio y agregar un espacio al frente. Esto resulta ser la parte más difícil. La razón de esto es que necesitamos almacenar esencialmente dos valores, uno para la profundidad del fragmento actual y otro para la profundidad al centro de la V donde tiene que ocurrir la eliminación.
Esto es duro.
Debido a toda la duplicación y reversión que está ocurriendo, ambas pilas están en uso todo el tiempo. Realmente no hay ningún lugar en estas pilas para poner algo. Incluso con todo el Third Stack Magic en el mundo, no puede obtener el tipo de acceso que necesita para resolver este problema.
? Entonces, como lo arreglamos? En resumen, no lo hacemos realmente; ignoramos los espacios por el momento y los aplicamos más tarde, agregaremos ceros al código para marcar dónde están destinados los espacios, pero aparte de eso, realmente no haremos nada.
Entonces, en cada iteración, hacemos una copia de la última iteración y la colocamos en la pila. Usamos la profundidad que almacenamos para dividir esto por la mitad, de modo que tengamos la mitad izquierda de la V en la pila derecha y la mitad derecha de la V en la pila izquierda. Eliminamos dos elementos y los remendamos. Agregamos una nueva línea como medida y comenzamos la siguiente iteración. Cada vez que la profundidad hasta el centro de la V disminuye en uno y cuando llega a cero, detenemos el bucle.
Ahora tenemos la mayor parte de la V construida. Sin embargo, nos faltan espacios adecuados y nuestra V está actualmente un poco (léase: completamente) al revés.
Entonces lo volteamos. Para voltearlo sobre la otra pila, tenemos que mover cada elemento uno por uno. A medida que movemos elementos, verificamos los ceros. Si nos encontramos con uno, tenemos que volver a colocar los espacios donde pertenecen. Tiramos el cero y agregamos un montón de espacios. ¿Cómo sabemos cuántos? Hacemos un seguimiento; voltear una pila a diferencia de duplicar o invertir una es una tarea muy poco intensiva, por lo que en realidad tenemos la memoria para almacenar y acceder a un contador adicional para realizar un seguimiento de cuántos espacios agregar. Cada vez que agregamos algunos espacios, disminuimos el contador en uno. El contador debe llegar a cero en la última línea nueva (la parte superior de la V) y, por lo tanto, estamos listos para imprimir.
Por último, limpiamos algunas cosas que quedan y terminamos el programa para la salida implícita.
fuente
-r
bandera?-r
bandera, necesitaría revertirla en otro momento. Se está haciendo tarde donde estoy, pero creo que trabajaré en tratar de jugar golf sustancialmente mañana. Si puedo solucionar el problema de espacios, definitivamente usaré la-r
bandera.Jalea ,
1512 bytesPruébalo en línea!
Cómo funciona
fuente
Python 3 , 65 bytes
Pruébalo en línea!
Python 2 , 65 bytes
Pruébalo en línea!
fuente
JavaScript (ES6),
1081069894 bytesfuente
n*2
porn*4
(incluidas las nuevas líneas al final de cada línea). Luego calculo el carácter que debería aparecer en cada celda.f=
ys=>
.f=
es solo una parte del fragmento, no la respuesta. Como tal, no está incluido en el recuento de bytes.Retina ,
5147 bytes¡Feliz cumpleaños de un compañero de lenguaje de procesamiento de cadenas!
El recuento de bytes asume la codificación ISO 8859-1.
Pruébalo en línea!
Explicación
Esto agrega
n
espacios (donden
está la longitud de la cadena), haciendo coincidir el final de la cadena, recuperando la longitud de la cadena$.`
y repitiendo un espacio que muchas veces con$*
.Duplicamos toda la cadena (separada por un salto de línea), haciendo coincidir el final de la cadena nuevamente e insertando la cadena en sí
$`
.Esto invierte la segunda línea haciendo coincidir de derecha a izquierda (
r
), luego haciendo coincidir un carácter a la vez (.
) pero asegurándose de que estén todos adyacentes (\G
). De esta manera, los partidos no pueden pasar el salto de línea. Esto luego se utiliza en una etapa de clasificación. Al usar el modo ordenar por ($
) pero reemplazar cada coincidencia con una cadena vacía, no se realiza una clasificación real. Pero debido a la^
opción, los partidos se invierten al final, invirtiendo toda la segunda línea.Esta etapa es para la salida y también afecta al resto del programa.
{
envuelve las etapas restantes en un bucle que se repite hasta que esas etapas no cambien la cadena (lo que sucederá porque la última etapa ya no coincidirá). La;
salida deshabilita al final del programa. Las*
vueltas esta etapa en un funcionamiento en seco lo que significa que la etapa se procesa y el resultado se imprime, pero después la cadena anterior se restaura.El escenario en sí mismo simplemente elimina un salto de línea y el carácter anterior. Lo que nos da una línea de la salida deseada (comenzando con la primera línea).
Finalmente, esta etapa convierte cada línea en la siguiente. Esto se hace insertando un espacio delante del primer carácter no espacial, eliminando el último carácter en la primera línea, así como el primer carácter en la segunda línea. Este proceso se detiene una vez que solo queda un carácter sin espacio en la primera línea, que corresponde a la última línea de la salida.
fuente
s///
caracteres adicionales que se suman, a una inversión de cadena más larga y otras operaciones que carecen de las sutilezas de Retina. Buena lectura. +105AB1E , 12 bytes
Pruébalo en línea!
Explicación
O para el mismo número de bytes desde la otra dirección.
Explicación
fuente
Japt,
22201614 + 2 bytes¡Japt desea a V muchos años más exitosos de golf!
Requiere la
-R
bandera. ¡Pruébelo en línea!Explicación
Esto hace uso de las funciones
ç
yî
que agregué hace unos días:La técnica de Dennis es un byte más larga:
fuente
GNU sed ,
110100+ 1 (bandera r) = 101 bytesEditar: 9 bytes más cortos gracias a Riley
Como otro lenguaje de manipulación de cadenas, sed le desea a V lo mejor.
Pruébalo en línea!
Explicación: suponiendo que la entrada es el último caso de prueba ('V!'). Mostraré el espacio del patrón en cada paso para mayor claridad, reemplazando los espacios con 'S'.
fuente
Python, 110 bytes
Pruébalo en línea!
Estoy seguro de que esto no es óptimo, pero al menos es bastante pitónico:
fuente
Jolf, 31 bytes
¡Jolf a regañadientes le desea a V un feliz cumpleaños!
Pruébalo aquí!
␅
debe ser 0x05.Explicación
fuente
Carbón , 29 bytes
¡Feliz cumpleaños V, de tu compañero lenguaje de arte ASCII decepcionantemente largo para este desafío!
Pruébalo en línea!
Explicación
Nuestra estrategia: imprimir la mitad izquierda de la V, comenzando desde abajo y moviéndose hacia la esquina superior izquierda; entonces reflexionarlo.
(Si solo el carbón de leña tuviera un corte de cadena ... por desgracia, parece que aún no se ha implementado).
fuente
CycleChop
, que se puede usar para extraer el encabezado de la cadena, ahorrando así 4 bytes. Sin embargo, hay un mejor enfoque que ahorra 9 bytes. Algunos ahorros más que creo que también funcionaron en ese momento: el valorReflect
predeterminado es un reflejo a la derecha, guardando un byte adicional, y una de las variables está predefinida a la primera entrada, ahorrando dos bytes.Pip ,
3225 bytesToma la cadena de entrada como un argumento de línea de comandos. Pruébalo en línea!
Explicación
fuente
R con paquete stringi, 225 Bytes
Si ejecuta R en código interactivo, después de pegar mi respuesta simplemente ingrese cualquier cosa. Necesitará instalar el paquete stringi R (espero que no esté en contra de las reglas).
Explicación:
La idea básica es agregar espacios al lado izquierdo, luego cortarlo a la longitud correcta. Después de eso, péguelo con su versión invertida como el lado derecho. Aquí hay una versión más larga y legible de la función:
fuente
Ruby,
928985 bytesMi proceso fue eliminar el primer carácter de la mitad derecha de cada línea después de invertir la primera mitad. Me gusta esto:
No estoy acostumbrado a jugar al golf, así que avíseme si hay algo que pueda hacer para acortarlo.
fuente
Lote,
186185 bytesLas líneas 1 y 6 tienen un espacio final. Editar: Guardado 1 byte gracias a @ ConorO'Brien.
fuente
@set
y elimine@echo off
, insertando@
según sea necesario.set
s me habrían ahorrado suficientes bytes para que valiera la pena.Haskell , 76 bytes
v
es la función principal, tomar unString
argumento y dar unString
resultado.Pruébalo en línea!
Notas:
i
es el argumento / entrada inicial.s
es inicialmentei
conlength i
espacios anexados.v i
llamar s
, luego une las líneas de resultados.r
Devuelve una lista deString
líneas.t
ess
con el último caracter cortado.r t
produce las líneas excepto la primera, menos el espacio inicial en cada línea.fuente
v
. : Dunlines.r.((++)<*>(' '<$))
.Jalea , 13 bytes
Pruébalo en línea!
¿Cómo?
fuente
Ruby,
8583 byteseditar: eliminó el exceso de espacio en blanco
De hecho, me resultó bastante difícil jugar golf en Ruby. Después de agregar espacios en blanco, se expande a un fragmento de código bastante legible:
fuente
s=ARGV[0];(s+=' '*s.size).size.times{|i|puts s+s[i..-2].reverse;s=' '+s[0..-2]}
MATLAB (R2016b),
223183 bytesCódigo Golf por primera vez. ¡Las propinas son bienvenidas!
Salida del programa:
Editar:
Guardado 40 bytes gracias a Luis Mendo.
fuente
's'
deinput
. Además, no veo por qué lo estás usandoevalc(disp(...))
, pero creo que puedes usarlo decell2mat
esta maneraflip
es más corto queend:-1:1
, mira aquíPHP,
959285807877 bytesNota: utiliza la codificación IBM-850
Corre así:
Explicación
Ajustes
str_pad
espacio predeterminado es el que necesitamos)substr
~"0"
caso (ASCII 207), ya que se puede suponer que todas las entradas son ascii imprimibles (Thx @Titus)fuente
echo$s,strrev($s=" $s"^$s^$s),~§;
ahorra 5 bytes.~$s[$i++]
es suficiente (la entrada es ASCII imprimible, y también lo es$s
)Javascript (ES6),
169157 bytes(-10 bytes gracias a Conor O'Brien)
Una solución recursiva. Soy nuevo en JavaScript, ¡así que sé gentil! Cualquier consejo de golf es muy apreciado. :)
Y, por supuesto, un muy feliz cumpleaños para ti
V
!Fragmento de prueba
Mostrar fragmento de código
fuente
s.split("")
se puede cambiar a[...s]
, ya.join("")
puede sera.join
seguido por un par de backticks. Puede guardar 3 bytes adicionales reemplazando[r='repeat']
y[r]
con simple ol 'repeat, lo mismo conslice
.CJam , 26 bytes
Feliz cumpleaños de tu viejo amigo CJam!
Pruébalo en línea!
Explicación
fuente
PowerShell,
126 bytes124 bytesLlámelo con un solo parámetro, como
.\V.ps1 Hello
.Editar: 2 bytes guardados con propina de AdmBorkBork
fuente
$l=($s="$args")|% Le*;
Pyke , 14 bytes
Pruébalo en línea!
fuente
JavaScript (ES6), 94 bytes
Casos de prueba
Mostrar fragmento de código
fuente
J, 44 bytes
fuente
|."0 1
a|."{
(guardado 2 bytes)