Una de las tareas estándar más comunes (especialmente cuando se muestran lenguajes de programación esotéricos) es implementar un "programa cat" : lea todo STDIN e imprímalo en STDOUT. Si bien esto lleva el nombre de la utilidad de shell Unix cat
, por supuesto, es mucho menos potente que el real, que normalmente se utiliza para imprimir (y concatenar) varios archivos leídos del disco.
Tarea
Debe escribir un programa completo que lea los contenidos de la secuencia de entrada estándar y los escriba textualmente en la secuencia de salida estándar. Si y solo si su idioma no admite flujos de entrada y / o salida estándar (como se entiende en la mayoría de los idiomas), puede tomar estos términos como su equivalente más cercano en su idioma (por ejemplo, JavaScript prompt
y alert
). Estas son las únicas formas admisibles de E / S, ya que cualquier otra interfaz cambiaría en gran medida la naturaleza de la tarea y haría que las respuestas fueran mucho menos comparables.
La salida debe contener exactamente la entrada y nada más . La única excepción a esta regla es la salida constante del intérprete de su idioma que no se puede suprimir, como un saludo, códigos de color ANSI o sangría. Esto también se aplica a las nuevas líneas finales. Si la entrada no contiene una nueva línea final, ¡la salida tampoco debería incluir una! (La única excepción es si su idioma siempre imprime una nueva línea final después de la ejecución).
La salida a la secuencia de error estándar se ignora, siempre que la secuencia de salida estándar contenga la salida esperada. En particular, esto significa que su programa puede terminar con un error al llegar al final de la secuencia (EOF), siempre que no contamine la secuencia de salida estándar. Si hace esto, le animo a que también agregue una versión sin errores a su respuesta (como referencia).
Como esto pretende ser un desafío dentro de cada idioma y no entre idiomas, existen algunas reglas específicas del idioma:
- Si es posible en su idioma distinguir bytes nulos en el flujo de entrada estándar del EOF, su programa debe admitir bytes nulos como cualquier otro bytes (es decir, también deben escribirse en el flujo de salida estándar).
- Si es posible en su idioma admitir una secuencia de entrada infinita arbitraria (es decir, si puede comenzar a imprimir bytes en la salida antes de presionar EOF en la entrada), su programa debe funcionar correctamente en este caso. Como ejemplo
yes | tr -d \\n | ./my_cat
debería imprimir una corriente infinita dey
s. Depende de usted con qué frecuencia imprime y vacía el flujo de salida estándar, pero debe garantizarse que suceda después de un período de tiempo finito, independientemente del flujo (esto significa, en particular, que no puede esperar un carácter específico como un salto de línea antes de imprimir).
Agregue una nota a su respuesta sobre el comportamiento exacto con respecto a bytes nulos, flujos infinitos y salidas extrañas.
Reglas adicionales
No se trata de encontrar el idioma con la solución más corta para esto (hay algunos en los que el programa vacío hace el truco), se trata de encontrar la solución más corta en cada idioma. Por lo tanto, ninguna respuesta se marcará como aceptada.
Las presentaciones en la mayoría de los idiomas se puntuarán en bytes en una codificación preexistente apropiada, generalmente (pero no necesariamente) UTF-8.
Algunos idiomas, como las carpetas , son un poco difíciles de puntuar. En caso de duda, pregunte por Meta .
Siéntase libre de usar un idioma (o versión de idioma) incluso si es más nuevo que este desafío. Los idiomas escritos específicamente para enviar una respuesta de 0 bytes a este desafío son juegos justos pero no particularmente interesantes.
Tenga en cuenta que debe haber un intérprete para que se pueda probar el envío. Está permitido (e incluso alentado) escribir este intérprete usted mismo para un lenguaje previamente no implementado.
También tenga en cuenta que las lenguas no tienen que cumplir con los criterios habituales para lenguajes de programación .
Si su idioma de elección es una variante trivial de otro lenguaje (potencialmente más popular) que ya tiene una respuesta (piense en dialectos BASIC o SQL, shells Unix o derivados triviales de Brainfuck como Headsecks o Unary), considere agregar una nota a la respuesta existente que la misma solución o una muy similar también es la más corta en el otro idioma.
A menos que se hayan anulado anteriormente, se aplican todas las reglas estándar de código de golf , incluido http://meta.codegolf.stackexchange.com/q/1061 .
Como nota al margen, no desestime las respuestas aburridas (pero válidas) en idiomas donde no hay mucho para jugar golf; todavía son útiles para esta pregunta, ya que trata de compilar un catálogo lo más completo posible. Sin embargo, sobre todo vota las respuestas en idiomas en los que el autor realmente tuvo que esforzarse para jugar golf en el código.
Catálogo
El Fragmento de pila al final de esta publicación genera el catálogo a partir de las respuestas a) como una lista de la solución más corta por idioma yb) como una tabla de clasificación general.
Para asegurarse de que su respuesta se muestre, comience con un título, utilizando la siguiente plantilla de Markdown:
## Language Name, N bytes
¿Dónde N
está el tamaño de su envío? Si mejora su puntaje, puede mantener los puntajes antiguos en el título, tachándolos. Por ejemplo:
## Ruby, <s>104</s> <s>101</s> 96 bytes
Si desea incluir varios números en su encabezado (por ejemplo, porque su puntaje es la suma de dos archivos o desea enumerar las penalizaciones de la bandera del intérprete por separado), asegúrese de que el puntaje real sea el último número en el encabezado:
## Perl, 43 + 2 (-p flag) = 45 bytes
También puede hacer que el nombre del idioma sea un enlace que luego aparecerá en el fragmento:
## [><>](http://esolangs.org/wiki/Fish), 121 bytes
cat
sh
respuesta usandocat
que también contiene una solución más corta usandodd
.)Respuestas:
sed, 0
El
sed
programa vacío hace exactamente lo que se requiere aquí:fuente
yes | tr -d \\n | sed ''
?yes
es en un búfer de patrón hasta que se quede sin memoria. Una advertencia, supongo ...Ziim ,
222201196185182 bytesEsto probablemente no se mostrará correctamente en su navegador, por lo que aquí hay un diagrama del código:
No puedo pensar en una estructura más simple para resolver el problema en Ziim, pero estoy seguro de que el código real sigue siendo bastante fácil de encontrar.
Ziim no puede manejar flujos infinitos porque solo es posible imprimir cualquier cosa al final del programa.
Explicación
Dado que Ziim tiene un modelo de flujo de control declarativo bastante único, un algoritmo de pseudocódigo imperativo no lo cortará aquí. En cambio, explicaré los conceptos básicos de Ziim y presentaré la estructura ordenada del código anterior (de manera gráfica similar) como el arte ASCII.
El flujo de control en Ziim ocurre por todas partes: cada flecha que no está apuntada por otra flecha inicializa un "hilo" que se procesa independientemente de los demás (no realmente en paralelo, pero no hay garantías en qué orden se procesan) , a menos que los sincronice mediante concatenación). Cada uno de estos hilos contiene una lista de dígitos binarios, comenzando como
{0}
. Ahora cada flecha en el código es una especie de comando que tiene una o dos entradas y una o dos salidas. El comando exacto depende de cuántas flechas lo apuntan desde qué orientaciones.Aquí está la lista de los comandos, donde
m -> n
indica que el comando tomam
entradas y producen
salidas.1 -> 1
, no-op : simplemente redirige el hilo.1 -> 1
, invert : niega cada bit en el hilo (y también lo redirige).1 -> 1
, leer : reemplaza el valor del hilo por el siguiente bit de STDIN, o por la lista vacía si hemos alcanzado EOF.2 -> 1
, concatenate : esta es la única forma de sincronizar hilos. Cuando un hilo golpea un lado de la flecha, se suspenderá hasta que otro hilo golpee el otro lado. En ese punto, se concatenarán en un solo hilo y continuarán la ejecución.2 -> 1
, etiqueta : esta es la única forma de unir diferentes rutas de ejecución. Esto es simplemente un no-op que tiene dos entradas posibles. Por lo tanto, los hilos que ingresan a la "etiqueta" a través de cualquiera de las rutas simplemente serán redirigidos en la misma dirección.1 -> 2
, split : toma un solo hilo y envía dos copias en diferentes direcciones.1 -> 1
, isZero? : consume el primer bit del hilo y lo envía en una de dos direcciones dependiendo de si el bit era 0 o 1.1 -> 1
, EstaVacia? : consume toda la lista (es decir, la reemplaza con una lista vacía) y envía el hilo en una de dos direcciones, dependiendo de si la lista ya estaba vacía o no.Con eso en mente, podemos encontrar una estrategia general. Usando concatenate queremos agregar repetidamente nuevos bits a una cadena que representa la entrada completa. Simplemente podemos hacer esto haciendo un bucle de la salida de la concatenación en una de sus entradas (e inicializamos esto en una lista vacía, borrando a
{0}
con isEmpty? ). La pregunta es cómo podemos terminar este proceso.Además de agregar el bit actual, también antepondremos un 0 o 1 que indica si hemos alcanzado EOF. Si enviamos nuestra cadena a través de isZero? , eliminará ese bit nuevamente, pero distingamos el final de la secuencia, en cuyo caso simplemente dejamos que el hilo deje el borde de la cuadrícula (lo que hace que Ziim imprima el contenido del hilo en STDOUT y finalice el programa) .
¿Se puede determinar si hemos alcanzado EOF o no usando isEmpty? en una copia de la entrada.
Aquí está el diagrama que prometí:
Algunas notas sobre dónde comenzar a leer:
{0}
esquina superior izquierda es el disparador inicial que inicia el bucle de entrada.{0}
esquina superior derecha se borra inmediatamente a una lista vacía y representa la cadena inicial que gradualmente llenaremos con la entrada.{0}
s se introducen en un bucle "productor" (uno invertido, otro no), para darnos un suministro ilimitado de0
sy1
s que necesitamos anteponer a la cadena.fuente
Hexagonía , 6 bytes.
Esto solía ser de 3 bytes (ver más abajo), pero esa versión ya no funciona desde la última actualización del idioma. Como nunca introduje intencionalmente el error que utilizaba la versión, decidí no contarlo.
Una solución sin errores (es decir, una que funciona con el intérprete fijo) resulta mucho más complicada. He tenido algunos problemas para incluirlo en una cuadrícula de 2x2, pero ahora encontré una solución, aunque necesito los 7 bytes completos :
Después de desplegarnos, obtenemos:
Dado que el borde de memoria inicial es 0,
<
desvía incondicionalmente el puntero de instrucciones hacia la diagonal noreste, donde se ajusta al camino gris. El.
es un no-op. Ahora,
lee un byte, lo)
incrementa de tal manera que los bytes válidos (incluidos los bytes nulos) son positivos y EOF es 0.Entonces, en EOF, la IP se ajusta a la ruta roja, donde
@
termina el programa. Pero si aún leemos un byte, entonces la IP se ajusta a la ruta verde, en lugar de eso,(
disminuye el borde al valor original, antes de;
imprimirlo en STDOUT. La IP ahora vuelve incondicionalmente a la ruta gris, repitiendo el proceso.Después de escribir un script de fuerza bruta para mi respuesta de Truth Machine, lo configuré para encontrar una solución de 6 bytes sin errores para el programa cat también. Sorprendentemente, encontró una: sí, exactamente una solución en todos los posibles programas de Hexagonía de 6 bytes. Después de las 50 soluciones de la máquina de la verdad, eso fue bastante sorprendente. Aquí está el código:
Despliegue:
El uso de
~
(negación unaria) en lugar de()
es interesante, porque a) es un no-op en cero, b) intercambia los lados de la rama, c) en algunos códigos, un solo~
podría usarse dos veces para deshacer la operación consigo mismo . Así que aquí está lo que está pasando:La primera vez (camino morado) que pasamos
~
es un no-op. El/
refleja la IP en la diagonal noroeste. La ruta gris ahora lee un carácter y multiplica su código de carácter por-1
. Esto convierte el EOF (-1
) en un valor verdadero (positivo) y todos los caracteres válidos en valores falsos (no positivos). En el caso de EOF, la IP toma la ruta roja y el código termina. En el caso de un carácter válido, la IP toma el camino verde, donde~
deshace la negación e;
imprime el carácter. Repetir.Finalmente, aquí está la versión de 3 bytes que solía funcionar en el intérprete original de Hexagony.
Al igual que la respuesta de Labyrinth, esto termina con un error si el flujo de entrada es finito.
Después de desplegar el código, corresponde a la siguiente cuadrícula hexadecimal:
La
.
hay-ops. La ejecución comienza en el camino morado.,
lee un byte,;
escribe un byte. Luego, la ejecución continúa en el camino del salmón (¿ish?). Necesitamos&
restablecer el borde de la memoria actual a cero, de modo que la IP salte nuevamente a la fila púrpura cuando toque la esquina al final de la segunda fila. Una vez,
que llegue a EOF, volverá-1
, lo que provoca un error al;
intentar imprimirlo.Diagramas generados con Timwi increíble 's HexagonyColorer .
fuente
TeaScript , 0 bytes
TeaScript es un lenguaje de golf conciso compilado en JavaScript
En una actualización reciente, la entrada se agrega implícitamente como la primera propiedad.
Pruébalo en línea
Alternativamente, 1 byte
x
contiene la entrada en TeaScript. La salida es implícitafuente
Brian y Chuck , 44 bytes
Originalmente creé este lenguaje para Crear un lenguaje de programación que solo parece inutilizable . Sin embargo, resulta ser un ejercicio muy agradable para el golf.
Lo básico: cada una de las dos líneas define un programa similar a Brainfuck que opera en el código fuente del otro programa: el primer programa se llama Brian y el segundo se llama Chuck. Solo Brian puede leer y solo Chuck puede escribir. En lugar de los bucles de Brainfuck que tiene,
?
que pasa el control al otro programa (y también cambian los roles del puntero de instrucción y el cabezal de la cinta). Es una adición a Brainfuck{
y}
escanea la cinta para la primera celda que no sea cero (o el extremo izquierdo). Además,_
se reemplazan con bytes nulos.Si bien no creo que esto sea óptimo todavía, estoy bastante contento con esta solución. Mi primer intento fue de 84 bytes, y después de varias sesiones de golf con Sp3000 (y tomando algo de inspiración de sus intentos), logré reducirlo lentamente a 44, unos pocos bytes a la vez. Especialmente el
+}+
truco brillante fue su idea (ver más abajo).Explicación
La entrada se lee en la primera celda de la cinta de Chuck, luego se copia minuciosamente al final de la cinta de Brian, donde está impresa. Al copiarlo hasta el final, podemos guardar bytes al establecer el carácter anterior en cero.
El
#
es solo un marcador de posición, porque el control de conmutación no ejecuta la celda que activamos.{<{
asegura que el cabezal de la cinta esté en la primera celda de Chuck.,
lee un byte de STDIN o-1
si golpeamos EOF. Por lo tanto, incrementamos eso+
para que sea cero para EOF y distinto de cero.Asumamos por ahora que aún no estamos en EOF. Entonces la celda es positiva y
?
cambiará el control a Chuck.}>
mueve la cabeza de la cinta (en Brian) a+
la_
y?
pasa el control de nuevo a Brian.{-
ahora disminuye la primera celda de Chuck. Si aún no es cero, pasamos el control a Chuck nuevamente con?
. Esta vez}>
mueve la cabeza de la cinta en Brian dos celdas a la derecha de la última celda distinta de cero. Inicialmente eso es aquí:Pero más adelante, ya tendremos algunos personajes allí. Por ejemplo, si ya hemos leído e impreso
abc
, se vería así:Donde los
1
s son en realidad 1 bytes (veremos de qué se trata más adelante).Esta celda siempre será cero, por lo que esta vez
?
no cambiará el control.>
mueve otra celda a la derecha e+
incrementa esa celda. Esta es la razón por la cual el primer carácter en la entrada termina tres celdas a la derecha de la?
(y cada una de las siguientes tres celdas más a la derecha).<<<
retrocede al último carácter de esa lista (o?
si es el primer carácter) y{>
vuelve a la+
cinta de Brian para repetir el bucle, que transfiere lentamente la celda de entrada al final de la cinta de Brian.Una vez que la celda de entrada esté vacía, el
?
after{-
ya no cambiará de control. Luego>}<
mueve la cabeza de la cinta en Chuck hacia el_
interruptor y cambia el control de modo que se ejecute la segunda mitad de Chuck.}>>
se mueve a la celda que hemos escrito más allá del final de la cinta de Brian, que es el byte que hemos leído de STDIN, por lo que lo imprimimos nuevamente.
. Para}
pasar este nuevo carácter en la cinta, necesitamos cerrar la brecha de dos bytes nulos, por lo que los incrementamos1
con<+<+
(por eso hay 1 bytes entre los caracteres reales en la cinta final). Finalmente{<{
vuelve al principio de la cinta de Brian y?
comienza todo desde el principio.Quizás se pregunte qué sucede si el personaje que leemos era un byte nulo. En ese caso, la celda recién escrita sería en sí misma cero, pero dado que está al final de la cinta de Brian y no nos importa dónde está ese final, simplemente podemos ignorar eso. Eso significa que si la entrada fue
ab\0de
, entonces la cinta de Brian realmente terminaría luciendo así:Finalmente, una vez que lleguemos a EOF, lo primero
?
en la cinta de Brian será un no-op. En este punto terminamos el programa. La solución sería ingenuo para pasar a la final de la cinta y el interruptor de control de Chuck, de tal manera que los termiantes programa:>}>}<?
. Aquí es donde la idea realmente inteligente de Sp3000 ahorra tres bytes:+
convierte la primera celda de Chuck en1
. Eso significa que}
tiene un punto de partida y lo encuentra_
en el medio de la cinta de Chuck. En lugar de saltarlo, simplemente cerramos la brecha convirtiéndolo en un1
con+
también. Ahora veamos qué hace el resto del código de Brian con este Chuck modificado ...{
vuelve a la primera celda de Chuck como siempre, y la-
convierte en un byte nulo. Eso significa que?
es un no-op. Pero ahora>}<
, que usualmente mueve el cabezal de la cinta al centro de la cinta de Chuck, pasa al final de la cinta de Chuck y?
luego pasa el control a Chuck, terminando el código. Es agradable cuando las cosas simplemente funcionan ... :)fuente
Haskell, 16 bytes
interact
lee la entrada, la pasa a la función dada como argumento e imprime el resultado que recibe.id
es la función de identidad, es decir, devuelve su entrada sin cambios. Gracias a la pereza de Haskellinteract
puede funcionar con una entrada infinita.fuente
sh + binutils,
32 bytesBueno, no tan obvio. De @ Random832
Original:
Lo dolorosamente obvio ...: D
fuente
dd
.cat
?Funciton , 16 bytes
(Codificado como UTF-16 con una lista de materiales)
Explicación
El cuadro devuelve el contenido de STDIN. El extremo suelto lo emite.
fuente
Código de máquina Motorola MC14500B , 1.5 bytes
Escrito en hexadecimal:
Escrito en binario:
Explicación
Los códigos de operación son de 4 bits cada uno.
fuente
Mornington Crescent , 41 bytes
No tengo idea de si Mornington Crescent puede manejar bytes nulos, y todas las entradas se leen antes de que comience el programa, ya que esa es la naturaleza del lenguaje.
fuente
Brainfuck, 5 bytes
Equivalente al pseudocódigo:
Esto maneja flujos infinitos, pero trata los bytes nulos como EOF. El hecho de que BF pueda o no manejar bytes nulos correctamente varía de implementación en implementación, pero esto supone el enfoque más común.
fuente
+[,.]
bien?Laberinto , 2 bytes
Si el flujo es finito, esto terminará con un error, pero toda la salida producida por el error va a STDERR, por lo que el flujo de salida estándar es correcto.
Como en Brainfuck,
,
lee un byte (empujándolo a la pila principal de Labyrinth) y.
escribe un byte (sacándolo de la pila principal de Labyrinth).La razón de este bucle es que ambos
,
y.
son "callejones sin salida" en el laberinto (muy trivial) representado por el código fuente, de modo que el puntero de instrucción simplemente gira en el lugar y vuelve al otro comando.Cuando presionamos EOF
,
empuja en su-1
lugar y.
arroja un error porque-1
no es un código de carácter válido. Esto podría cambiar en el futuro, pero aún no lo he decidido.Como referencia, podemos resolver esto sin un error en 6 bytes de la siguiente manera
Aquí,
)
aumenta el byte que leemos, lo que da0
en EOF y algo positivo de lo contrario. Si el valor es0
, la IP se mueve directamente, presionando el botón@
que finaliza el programa. Si el valor fue positivo, la IP en cambio girará a la derecha hacia la(
que disminuye la parte superior de la pila a su valor original. El IP ahora está en una esquina y simplemente seguirá girando a la derecha, imprimiendo con.
, leyendo un nuevo byte con.
, antes de que llegue a la bifurcación de)
nuevo.fuente
C, 40 bytes
fuente
getchar
devuelve -1 , por lo que su código imprimirá una secuencia infinita de 0xFF bytes después de la entrada (finita).> <> , 7 bytes
Probarlo aquí . Explicación:
Si desea que continúe hasta que le dé más información, reemplace
;
con!
.fuente
io
(2 bytes) hace lo mismo, pero se bloquea y escribesomething smells fishy...
en STDERR al final de la ejecución, lo cual está permitido.Conjunto X86, 70 bytes
Desmontaje con
objdump
:La fuente:
fuente
objdump
desmontó como código de 32 bits, mientras que parece haber compilado como 16 bits. Que creer Desde su usoint 0x80
, supongo que está destinado a Linux, pero ¿por qué compilar como 16 bits?Lambda universal , 1 byte
Un programa Universal Lambda es una codificación de un término lambda en binario, cortado en trozos de 8 bits, rellenando fragmentos incompletos con cualquier bit, convertido en un flujo de bytes.
Los bits se traducen a un término lambda de la siguiente manera:
00
introduce una abstracción lambda.01
representa una aplicación de dos términos posteriores.111..10
, Con n repeticiones de la broca1
, se refiere a la variable de la n º lambda padre; es decir, es un índice de De Bruijn en unario.Por esta conversión,
0010
es la función de identidadλa.a
, lo que significa que cualquier programa de un solo byte del formulario0010xxxx
es uncat
programa.fuente
!
es que0x21
no0x4_
?PowerShell,
884130 bytesEDITAR: olvidé que puedo usar la
$input
variable automática para la entrada de la tubería ... EDIT2: no es necesario probar la existencia de$input
Sí, entonces ... STDIN en PowerShell es ... raro, digamos. Con el supuesto de que necesitamos aceptar aportes de todos los tipos de STDIN, esta es una posible respuesta a este catálogo, y estoy seguro de que hay otros. 1
Sin embargo, la entrada de canalización en PowerShell no funciona como se podría pensar. Dado que las tuberías de PowerShell es una función de la lengua, y no una función del medio ambiente / shell (y PowerShell no es exclusivamente un lenguaje de todos modos), hay algunas peculiaridades en el comportamiento.
Para empezar, y lo más relevante para esta entrada, la tubería no se evalúa instantáneamente (la mayoría de las veces). Es decir, si tenemos
command1 | command2 | command3
en nuestro shell,command2
no tomaremos información o comenzará el procesamiento hasta que secommand1
complete ... a menos que encapsule sucommand1
conForEach-Object
... que es diferente aForEach
. (aunqueForEach
es un alias paraForEach-Object
, pero ese es un tema separado, ya que estoy hablandoForEach
como la declaración, no alias)Esto significaría que algo así
yes | .\simple-cat-program.ps1
(aunqueyes
realmente no existe, pero lo que sea) no funcionaría porqueyes
nunca se completaría. Si pudiéramos hacerForEach-Object -InputObject(yes) | .\simple-cat-program.ps1
eso debería (en teoría) funcionar.Conociendo ForEach y ForEach-Object en Microsoft "¡Hola, Scripting Guy!" Blog.
Entonces, todos esos párrafos explican por qué
if($input){$input}
existe. Tomamos un parámetro de entrada que se crea especialmente automáticamente si la entrada de la tubería está presente, probamos si existe y, de ser así, la enviamos.Luego, tomamos información del usuario a
(read-host)
través de lo que es esencialmente una secuencia STDIN separada, y la retiramoswrite-host
, con la-n
bandera (abreviatura de-NoNewLine
). Tenga en cuenta que esto no admite la entrada de longitud arbitraria, yaread-host
que solo se completará cuando se ingresa un salto de línea (técnicamente cuando el usuario presiona "Enter", pero funcionalmente equivalente).Uf.
1 Pero hay otras opciones:
Por ejemplo, si nos preocupamos solo por la entrada de la tubería, y no requerimos un programa completo, podría hacer algo como
| $_
lo que simplemente generaría lo que fuera entrada. (En general, eso es algo redundante, ya que PowerShell tiene una salida implícita de cosas "dejadas atrás" después de los cálculos, pero eso es algo aparte).Si solo nos interesa la entrada interactiva del usuario, podríamos usar solo
write-host(read-host)-n
.Además, esta función tiene la característicapeculiarde aceptar entradas de línea de comandos, por ejemplo.\simple-cat-program.ps1 "test"
, llenaría (y luego generaría) la$a
variable.fuente
Cubix ,
65 bytes¡Ahora maneja bytes nulos!
Cubix es un esolang bidimensional basado en pila. Cubix es diferente de otros idiomas 2D en que el código fuente está envuelto alrededor del exterior de un cubo.
¡Pruébalo en línea! Nota: hay un retraso de 50 ms entre iteraciones.
Explicación
Lo primero que hace el intérprete es averiguar el cubo más pequeño en el que se ajustará el código. En este caso, la longitud del borde es 1. Luego, el código se rellena sin operaciones
.
hasta que se llenen los seis lados. El espacio en blanco se elimina antes del procesamiento, por lo que este código es idéntico al anterior:Ahora se ejecuta el código. El IP (puntero de instrucción) comienza en el extremo izquierdo, apuntando hacia el este.
El primer carácter que encuentra la IP es
_
, que es un espejo que da vuelta a la IP si está orientada al norte o al sur; actualmente está orientado al este, por lo que esto no hace nada. El siguiente esi
, que ingresa un byte desde STDIN.?
gira la IP hacia la izquierda si el elemento superior es negativo, o hacia la derecha si es positivo. Hay tres caminos posibles aquí:@
, lo que finaliza el programa.o
._
. Esto lo da vuelta, enviándolo de vuelta al?
, que lo vuelve a girar a la derecha y genera el byte.Creo que este programa es óptimo. Antes de que Cubix pudiera manejar bytes nulos (EOF era 0, no -1), este programa funcionó para todo menos bytes nulos:
He escrito una fuerza bruta para encontrar todos los programas de gato de 5 bytes. Aunque tarda unos 5 minutos en terminar, la última versión ha encontrado 5 programas:
fuente
Vitsy, 2 bytes
z
obtiene toda la pila de entrada y la empuja a la pila del programa activo.Z
imprime toda la pila activa en STDOUT.Metodo alternativo:
fuente
MarioLANG , 11 bytes
No estoy completamente seguro de que esto sea óptimo, pero es el más corto que encontré.
Esto admite flujos infinitos y terminará con un error al llegar a EOF (al menos la implementación de referencia de Ruby lo hace).
Hay otra versión de esto que convierte a Mario en un ninja que puede hacer doble salto:
En cualquier caso, Mario comienza a caer por la columna izquierda, donde
,
lee un byte y.
escribe un byte (que arroja un error en EOF porque,
no devuelve un carácter válido).>
asegura que Mario camina hacia la derecha (=
es solo un terreno para caminar). Luego se mueve hacia arriba, ya sea a través de un salto doble con^
un elevador ("
y el#
par) antes de que<
le diga que vuelva a la columna de la izquierda.fuente
rs , 0 bytes
Seriamente. rs solo imprime lo que se obtiene si el script dado está completamente vacío.
fuente
GolfScript, 3 bytes
El programa vacío hace eco de la entrada estándar. El lenguaje no puede manejar secuencias infinitas. Sin embargo, agrega una nueva línea, como mencionó @Dennis. Lo hace envolviendo toda la pila en una matriz y llamando
puts
, que se define comoprint n print
, donden
hay una nueva línea. Sin embargo, podemos redefinirn
para ser STDIN y luego vaciar la pila, que es precisamente lo que:n;
hace.fuente
Coche medio roto en tráfico pesado , 9 + 3 = 12 bytes
Half-Broken Car in Heavy Traffic (HBCHT) toma la entrada como argumentos de línea de comando, así que corre como
Tenga en cuenta que el +3 es para la
-s
bandera, que sale como caracteres. Además, HBCHT no parece manejar NUL, ya que todos los ceros se eliminan de la salida (por ejemplo,97 0 98
se emite como dos caracteresab
).Explicación
En HBCHT, su automóvil comienza en la
o
y su objetivo es la salida#
.^>v<
dirija el movimiento del automóvil, mientras modifica simultáneamente una cinta tipo BF (^>v<
traduzca a+>-<
). Sin embargo, como sugiere el nombre del idioma, su automóvil solo puede girar a la derecha; cualquier intento de girar a la izquierda se ignora por completo (incluidos sus efectos de memoria). Tenga en cuenta que esto es solo para girar: su automóvil es perfectamente capaz de avanzar / retroceder.Otras partes interesantes sobre HBCHT son que la dirección inicial de su automóvil es aleatoria y la cuadrícula es toroidal. Por lo tanto, solo necesitamos que el automóvil llegue a la salida sin modificar la cinta para las cuatro direcciones iniciales:
Arriba y abajo son sencillos y se dirigen directamente a la salida.
A la izquierda, ajustamos y ejecutamos
<
e incrementamos con^
. No podemos girar a la izquierda en el siguiente,<
así que ajustamos y decrementamosv
, negando el incremento anterior. Como nos dirigimos hacia abajo ahora podemos girar a la derecha en<
y salir, después de haber movido el puntero dos veces y no modificar los valores de las celdas.Para la derecha, hacemos lo mismo que la izquierda, pero omitimos la primera
^
ya que no podemos girar a la izquierda.Editar : Resulta que el intérprete HBCHT le permite ejecutar solo una ruta a través de un indicador de línea de comando, por ejemplo
Sin embargo, no solo el indicador es demasiado costoso para esta pregunta en particular (al menos 5 bytes
" -d u"
), parece que todas las rutas aún deben poder llegar a la salida para que el código se ejecute.fuente
Minkolang , 5 bytes
Pruébalo aquí
Explicación
o
lee un carácter de la entrada y empuja su código ASCII a la pila (0
si la entrada está vacía).d
luego duplica la parte superior de la pila (el carácter que se acaba de leer).?
es un trampolín condicional, que salta la siguiente instrucción de la parte superior de la pila no lo es0
. Si la entrada estaba vacía, entonces.
no se salta y el programa se detiene. De lo contrario,O
genera la parte superior de la pila como un personaje. La naturaleza toroidal de Minkolang significa que esto gira hasta el principio.fuente
INTERCALL , 133 bytes
wat
fuente
500
(no estoy seguro), seríaPRINT D
, ¿verdad? (excluyendo el encabezado)PUSH XX<newline>PRINT
oPUSH XX AND PRINT
. Ah, y yo soy el creador de INTERCALLV , 0 bytes
Pruébalo en línea!
La idea de V de "memoria" es solo una gigantesca matriz 2D de personajes. Antes de ejecutar cualquier programa, toda la entrada se carga en esta matriz (conocida como "The Buffer"). Luego, al final de cualquier programa, se imprime todo el texto en el búfer.
En otras palabras, el programa vacío es un programa cat.
fuente
Muñeco de nieve 1.0.2 , 15 caracteres
Tomado directamente del
examples
directorio de Snowman . Lee una línea, imprime una línea, lee una línea, imprime una línea ...Tenga en cuenta que debido a un detalle de implementación, cuando STDIN está vacío,
vg
devolverá lo mismo que lo haría para una línea vacía. Por lo tanto, esto imprimirá repetidamente nuevas líneas en un bucle infinito una vez que STDIN esté cerrado. Esto puede corregirse en una versión futura.Explicación del código:
fuente
FireType , 7 bytes
Requiere algunos cambios que acabo de presionar . Las reglas dicen:
así que estoy en claro
fuente
Fisión , 4 bytes.
¿No es agradable cuando superas los programas de muestra en el repositorio del lenguaje? :) Como referencia, tiene la solución de 7 bytes
Explicación
Entonces,
R
comienza el flujo de control con un átomo que va hacia la derecha.?
lee un personaje de STDIN en la masa del átomo. Mientras estemos leyendo personajes, la energía permanece en cero, por lo que elJ
árbitro no funciona y!
imprime el personaje. El átomo regresa al inicio (R
ahora no funciona) y repite todo el proceso.Cuando presionamos EOF,
?
estableceremos la energía del átomo en1
, por lo que elJ
árbitro ahora omitirá el comando de impresión. Pero cuando un átomo golpea?
después de que EOF ya ha sido devuelto, destruirá el átomo en su lugar, lo que termina el programa.(La solución del autor del lenguaje utiliza un explícito
;
para finalizar el programa, que de lo0
contrario se omite con dos portales).fuente
Shtriped , 20 bytes
Esto demuestra descaradamente que casi cualquier cadena ASCII imprimible es un identificador válido en Shtriped.
Cómo funciona:
No hay una forma real de detectar EOF, por lo que esto se repite para siempre como la respuesta de Python .
Sin embargo, puede detenerlo fácilmente cuando se proporciona una línea vacía (30 bytes):
Tenga en cuenta que Shtriped I / O solo admite ASCII imprimible , pestañas, línea, retornos de carro, pestañas verticales y alimentaciones de formularios (100 caracteres en total). Esto se debe a que internamente, las cadenas se representan como enteros de precisión arbitraria no negativa, y debe haber un alfabeto finito de caracteres para poder codificar todas las cadenas.
fuente