Objetivo: escribir un programa o función que imprima una cadena de entrada en forma sinusoidal.
La sinusoide ASCII
Aquí hay un período de la sinusoide:
.......
... ...
.. ..
. .
. .
. .
. . .
. .
. .
. .
.. ..
... ...
.......
Tenga en cuenta que hay exactamente un punto en cada columna.
- Cada carácter en la cadena de entrada reemplazará un punto en la forma anterior, de izquierda a derecha.
- Los espacios en la entrada deben emitirse como caracteres normales, en lugar de un punto.
- El carácter inicial corresponde al punto más a la izquierda en la figura de arriba.
- Este es solo un período, las entradas pueden ser más largas que la cantidad de puntos anteriores.
Entrada
- Las entradas son cadenas ASCII que contienen solo caracteres entre ASCII decimal 32 (espacio) y ASCII decimal 126 (Tilde ~).
- Las entradas siempre serán de una sola línea (sin saltos de línea).
- Las entradas se pueden tomar a través de STDIN, parámetros de función, argumentos de línea de comando o cualquier cosa similar.
Salida
- La salida debe imprimirse exactamente como en los casos de prueba indicados.
- Los espacios finales en las líneas están permitidos siempre que la longitud de la línea con esos espacios finales no exceda la longitud de la línea más larga (la que tiene el último carácter).
- No se permiten líneas iniciales / finales.
Casos de prueba
- Entrada:
.................................................
Salida:
.......
... ...
.. ..
. .
. .
. .
. . .
. .
. .
. .
.. ..
... ...
.......
- Entrada:
Programming Puzzles & Code Golf Stack Exchange is a question and answer site for programming puzzle enthusiasts and code golfers. It's 100% free, no registration required.
Salida:
ng Puzz ion and siasts stratio
mmi les est an thu and egi n r
ra & qu sw en c r eq
g e o o u
o C a r e d n i
r o l e r
P d s s z , e
e i i z g e d
t u o e .
G e e p l r
ol ng f g fe f
f S cha or min rs. 00%
tack Ex program It's 1
- Entrada:
Short text.
Salida:
t.
tex
t
r
o
h
S
- Entrada:
The quick brown fox jumps over the lazy dog
Salida:
brown
ick fox
qu j
u
e m
h p
T s
o
v
er
th dog
e lazy
Tanteo
Este es el código de golf , por lo que gana el programa o la función más corta en bytes.
sin
función para reproducirla, pero las posiciones están un poco apagadas.)Respuestas:
Pyth, 59 bytes (57 caracteres)
Demostración.
Una tabla de búsqueda binaria está codificada en su interior
, que tiene el valor 3912. Esto se convierte en binario, dando[1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0, 0]
. Esto se trata como las diferencias entre las alturas consecutivas. Al anteponer un 6, formando todos los prefijos y asignando cada uno a su suma, se genera el primer cuarto de la onda.sM._+6jC\2
evalúa[6, 7, 8, 9, 10, 10, 11, 11, 11, 12, 12, 12, 12]
como se describe anteriormente. Luego, el código se concatena en el reverso de esta cadena para formar la primera mitad de la onda, y luego la resta de 12 para dar la onda completa.Luego, formamos líneas de cada carácter de entrada seguido de 12 espacios. Esta línea se gira hacia la derecha por el parámetro de altura de onda correspondiente a esa ubicación, y luego las líneas se transponen y se unen en nuevas líneas.
Luego, eliminamos las líneas en blanco iniciales y finales. Sin embargo, no podemos quitar las líneas en blanco iniciales o finales que tienen espacios desde la entrada. Esto se implementa reemplazando espacios en la entrada con pestañas (
C9
), que no pueden estar en la entrada, quitando líneas en blanco y volviendo las pestañas a espacios.fuente
Python 2, 156 bytes
Explicación
Todo el código simplemente crea un bloque de espacios (
o
) y reemplaza los espacios correctos con las letras de la entradat
.La variable
l
almacena una lista de desplazamientos desde la parte superior. Para que eln
carácter de tht
esté en líneal[n]
.El bytearray
o
sirve como una cadena mutable, ya que las cadenas son inmutables en python.-~h
es lo mismoh+1
pero ahorra espacio porque no necesito paréntesis.fuente
Java,
219209199 bytesTodavía soy un novato aquí, y espero que cumpla con las reglas para introducir una subfunción (cuando los bytes de esta función se cuentan, por supuesto). Si no, intentaré convertir la
sin
función en una búsqueda inteligente de arreglos ...fuente
char[]
. Aquí, se eliminaría el()
encendidolength
y también se eliminaríacharAt()
. Si lo estoy leyendo bien, también puedes usarlo enprint()
lugar deprintln()
guardar un par más....a<24?s(24-a):-s(a-24);
y llámalos(c%48)
.Perl, 222 bytes
Requiere
-E
parasay
, almacena las posiciones como números enteros convertidos en números binarios y el volteo de la matriz probablemente no sea muy eficiente en bytes. También estoy seguro de que hay muchos ahorros que hacer, así que seguiré hurgando y empujando.Salida de ejemplo:
fuente
JavaScript,
251243224220217Implementación realmente simple: utiliza una cadena de caracteres para representar la posición y de cada carácter en la onda (compensado por
a
, que es el código ASCII 97). Luego itera a través de todas las filas posibles; Si el valor y de la fila actual es el mismo que la posición y en la onda, escribe un carácter de la cadena. También hay una limpieza al final para eliminar la fila si resultó estar completamente en blanco.Tenga en cuenta que la salida aparecerá inestable en la
alert()
ventana si no está usando una fuente monoespaciada, puede cambiarlaconsole.log()
para verificar que la salida sea correcta.EDITAR1:
++
y--
existir.EDIT2: la eliminación de la línea en blanco ahora se realiza en el mismo bucle que el resto, ahorrando 17 caracteres. Tampoco necesitaba esos corchetes, para 2 caracteres adicionales.
EDITAR3: No es necesario declarar la forma de onda como variable, ahorrando 4 caracteres.
EDITAR4: Como lo señaló Dom Hastings en los comentarios, el recuento de bytes incluyó el retorno de carro, así como el carácter de nueva línea, actualizó los recuentos de bytes para todas las revisiones para excluir el retorno de carro.
EDIT5: Guardado 3 bytes por cortesía de Dom Hastings. No he implementado la
o.splice
corrección ya que esto no puede eliminar las líneas en blanco (al menos en mi extremo).fuente
if(o[i++].trim().length<1)o.splice(--i,1)
cono.splice(i-(t=!o[i++].match(/\s/)),t)
, para -4,s=prompt() o=[]
con:,s=prompt(o=[])
-1 yfor(y=0,i=0;y<13;++y){o[i]=""
confor(y=i=0;y<13;++y){o[i]=""
, -2. Probablemente también sea posible combinar sus bucles for para ahorrar más ... Una última cosa, vale la pena señalar también que solo tengo 220 para su conteo de bytes actual, por lo que su 225 podría ser ventanas en\r\n
lugar de solo\n
lo que supongo que puede ignorar (corrígeme si me equivoco) ...for(s=prompt(),y=0;y<13;y++,v.trim()&&console.log(v))for(v="",x=0;x<s.length;x++)v+=y=="gfedccbbbaaaaaaabbbccdefghijkklllmmmmmmmlllkkjih".charCodeAt(x%48)-97?s[x]:" "
for(s=prompt(y=0);y<13;y++,v.trim()&&console.log(v))for(v="",x=0;x<s.length;x++)v+="gfedccbbbaaaaaaabbbccdefghijkklllmmmmmmmlllkkjih".charCodeAt(x%48)-97-y?" ":s[x]
Matlab,
133, 130 bytesEl único revestimiento:
Y la versión ampliada:
El one liner toma entrada de la consola (
stdin
) y tiene 130 bytes. La versión ampliada reemplaza la entrada de la consola por una definición de función (+1 byte) pero es mucho más cómoda de usar para el caso de prueba en un bucle:Descripción:
El índice de línea de cada carácter se calcula para un período medio, luego se refleja y concatena para tener un período completo.
Creamos un fondo en blanco de carácter de espacio en blanco (la misma longitud que la cadena de entrada. Colocamos cada carácter de acuerdo con su posición en la línea correspondiente. Si la cadena de entrada es más larga que un punto, el
mod
operador (módulo) lo ajusta así que no lo hacemos ' No salga del límite cuando solicite el número de línea.Caso de prueba:
Guarde la versión de la función
textsine.m
en su ruta, luego ejecute:dará salida:
Si desea probar la versión de un trazador de líneas con la entrada de
stdin
, su entrada debe ingresarse como una solastring
, por lo que tendría que encerrar su entrada entre los'
caracteres. Ejemplo:Gracias
Luis Mendo
por recortar 3 bytes ;-)fuente
s=input('');
aún funcionara.Scala 377 caracteres
primer corte. Probablemente puede obtener una mejor fórmula para traducir
x
ay
fuente
Lisp común, 205 bytes
Pruebas
Ver http://pastebin.com/raw.php?i=zZ520FTU
Observaciones
Imprima la salida línea por línea, calculando los índices en las cadenas que deben imprimirse utilizando la función seno inversa
asin
. La salida no coincide exactamente con las entradas esperadas en la pregunta, pero dado que OP reconoce que las salidas de ejemplo no son senoidal real, supongo que esto está bien. Al menos, siempre hay un solo carácter escrito para cada columna.fuente
Python 2, 172 bytes
Esto no es tan bueno como la respuesta de Alex L , pero está bastante cerca. Toma información de entrada estándar y funciona mejor en un
.py
archivo.Decidí construir la salida transpuesta (cada columna es una fila) y luego transponer el resultado, ya que en Python la transposición de una matriz es
map(*m)
.l
: La representación binaria de9960000
(después de cortar el"0b"
frombin
) es100101111111101001000000
. Este es el "paso" de la onda sinusoidal de cada columna, comenzando en el último carácter del punto más bajo. Copio esta lista, niego cada número y lo pego al final de sí mismo para formar lo que efectivamente es una derivada de la función.s
: Esta es la variable que realiza un seguimiento de en qué fila (columna en la transposición) se inserta el siguiente carácter.o
: Salida final, transpuestai
: Realiza un seguimiento del período de onda sinusoidal. Comienza a las 9 ya quel
se desplaza ligeramente.En el
for
ciclo, creo una lista de 13 espacios (estaba usando bytearrays pero las listas de caracteres tienen una declaración de impresión más corta), luego reemplazo els
carácter th con el carácter de entrada. Agregueb
al final deo
, agregue el paso apropiados
e incrementei
.Esperaba que la
print
declaración fuera tan simple como\n'.join(*zip(o))
, pero no tuve tanta suerte.zip(*o+['\n'*13])[::-1]
agrega una columna de líneas nuevas y luego invierte y transpone todo (sin la inversión, la onda sinusoidal está al revés),sum(...,())
concatena las tuplas juntas en una tupla de caracteres, y luego''.join(...)
concatena los caracteres e imprime.Otras cosas que intenté fue hacer una matriz de 12 caracteres de espacios e insertar el nuevo personaje en el lugar apropiado, y reemplazarlo
l+=[-c for c in l];
con algún tipo de matemática con algún tipo de multiplicación1
y-1
con el resultado de la indexaciónl
, pero nada de lo que se me ocurrió con terminó siendo más corto.fuente
Mathematica, 131 bytes
Son 131 caracteres, incluidos los tres para
i=foo;
. Esa parecía una forma razonable de tomar la entrada; Podría haberlo explicado directamentec
y haber guardado algunos golpes, pero eso se siente injusto.Es bastante sencillo, casi incluso legible. Divide la cadena en una lista de caracteres, y luego coloca esos caracteres en una matriz dispersa en las posiciones determinadas desde
Table
(cualquier punto en la matriz que no tenga un carácter predeterminado es un espacio). Las líneas se ensamblan por separado, luego se salpican líneas nuevas entre ellas. El StringJoin final lo cose todo.NB: Al igual que algunas otras soluciones, esto puede no ser válido porque produce una sinusoide real en lugar del ejemplo artesanal (hermoso).
Pruebas:
fuente