yes
, de coreutils, tiene 91 líneas de largo . Muchos de ellos son los comentarios, pero que todavía es MANERA demasiado tiempo.
Editar desde septiembre de 2019: el archivo fuente creció en los últimos cinco años y ahora tiene 126 líneas de largo.
Escribe un programa que imite yes
:
- dando salida a
stdout
un flujo infinito de "y \ n" - debe haber una opción para detenerlo que no sea matar el proceso con
SIGKILL
: butSIGINT
andSIGPIPE
are fine - no puede usar "y" o "\ n" o sus valores ASCII (121, 0x79, 0171, 10, 0xA o 012)
La respuesta más corta gana.
Prima:
- reste 10 de la longitud de su código, si puede recibir una frase
stdin
e imprimirla en lugar de "y" (pero aún incluye el salto de línea).
code-golf
restricted-source
Ramon Snir
fuente
fuente
y
o\n
dentro de una cadena literal"?true.c
tiene 80 líneas de largo.yes
toma un argumento opcional en la línea de comando, nostdin
.y
mensajes usted mismo.Respuestas:
CJam, 13 bytes - 10 = 3
Necesitará usar el intérprete de Java para esto, porque el intérprete en línea solo regresa una vez que finaliza el programa.
Puede abortar el programa con SIGINT (presionando Ctrl-C). Leerá una línea de STDIN e imprimirá esa línea, o
y
si la entrada estaba vacía.Explicación
Después de la aclaración del OP, lo siguiente parece más específico:
Sin embargo, esperaré con la actualización del envío hasta que el OP responda a mi comentario.
fuente
/no/i
, teniendo en cuenta cuál es el desafío.Brainfuck - 38 bytes
No usa 10 o 121, porque de
+-<>.,[]
todos modos son todos los caracteres significativos en el idioma, pero los calcula bastante ingenuamente (0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 = 10, 10 * 12 + 1 = 121).Esto probablemente depende del intérprete, pero se muere
^C
en mi máquina.Brainfuck - (63-10) = 53
fuente
Python 3, 27 bytes
Funciona con al menos CPython y Jython.
SIGINT lo detiene.
fuente
while 1:print`help`[1]
.chr(11**2)
para guardar algunos caracteres121
.Maravilloso 14 bytes
Esto es bastante sencillo, el dispositivo '/ \' coloca dos copias a su izquierda y derecha, la derecha se incrementa
++
y luego se cae del tablero y se imprime. El]]
dispositivo empuja cualquier canica hacia la derecha si STDIN está vacío, pero deja caer el primer byte de STDIN si no lo está. Esto activará el!!
dispositivo, que sale de la placa. Entonces esto imprimirá y \ n hasta que ingrese algo en stdin.Esto solo funciona en el intérprete de Python.
fuente
Pyth,
1096 bytes - 10 =0-1-4Llevo años intentando conseguir uno que me satisfaga. Básicamente se convierte a:
fuente
#
tiene una funcionalidad equivalenteW1
yePG
es una forma mucho más corta de obtener el personajey
queC^hT2
.C #,
817876 bytesNo puede competir con los otros idiomas, pero aquí está de todos modos:
Se puede matar con SIGINT presionando Ctrl+ C.
Sin bonificación, porque tomaría más de 10 bytes para obtenerlo.
fuente
while(1)
? Guarda dos personajes.for(;;)
Debería funcionar.y
. Por favor examineSystem
.System
no se puede eliminar. es el espacio de nombres superior en .NET Framework, todas las clases / otros espacios de nombres están en él, por lo que la reflexión no ayudará aquí. Pero no estoy seguro si es inválido. Vea el comentario de Ramon: "nada que se evalúe como y o \ n". Esto no evalúa ay
. Dejo un comentario sobre la pregunta para preguntarle a Ramón si esto es válido.Java, 178
La impresión requiere
System
, pero ely
personaje está prohibido. Por lo tanto, tuve que usar la reflexión.fuente
;
poniendochar c='x'+1;
en lafor
declaración de bucle, de modo quefor(char c='x'+1;;)
ya que tiene un punto y coma vacío de todos modosPerl: 18 bytes - 10 = 8
La cadena es de STDIN.
fuente
y\n
repetidamente si no recibe información de STDIN? Si no, entonces no imita adecuadamenteyes
.yes
no recibe informaciónSTDIN
después de todo :)y\n
.Ruby,
302318 bytesSe puede matar con SIGINT presionando Ctrl+ C.
¡Gracias a manatwork por compartir mejoras!
fuente
loop{puts [*?x..?z][1]}
- 23 caracteres,loop{puts ?x.succ}
- 18 caracteresPerl, 26 bytes
Entrada personalizada del argumento (como si
yes
realmente funcionara), 22 bytes-10 = 12Entrada personalizada desde stdin, 22 bytes-10 = 12
fuente
C,
6455534540-10 = 30main(int c,int**a){for(;;)puts(a[c>1]);}
No estoy muy contento con esto, ya que requiere que el programa se llame "y" y se llame solo con `y`, por lo que debe estar en $ PATH, pero bueno, primero codegolf :)
Alternativa:
C, 30 (+ 1 nombre de archivo)
main(){for(;;)puts(__FILE__);}
Usando la misma técnica que mi estimado colega @Matt Windsor
fuente
Linux Bash, 33-10 = 23
Se puede matar con SIGINT presionando Ctrl+ C.
fuente
yes
sinocat
programas.read a;for((;;));{ echo $a;}
Óxido, 52 caracteres
Al parecer, no hay una buena manera de computar
y
sin ser descarado en Rust: han hecho un trabajo demasiado bueno haciendo caracteres de manera segura. YO:println!
, por lo que no se permiten trucos allí;'x'
, porque en Rust los caracteres no son números;Tampoco vale la pena el bono de código, porque leer
stdin
requiere un manejo de errores = 3Gran parte de las reducciones de código que pude encontrar involucraron hacer cosas que infringen cada vez más las reglas con el entorno del compilador:
Rust, 44 caracteres (+ al menos 1 carácter para nombre de archivo)
Obsoleado por abajo. Este probablemente no cuenta, ya que el nombre del archivo fuente debe comenzar
y
.Editar: Rust, 36 caracteres (35 fuente, 1 nombre de archivo)
Como el anterior, pero el archivo tiene que ser llamado
y
(noy.rs
,y
). ¡Humorísticamente, Rust sobrescribirá la fuente con el binario! Al menos en mi máquina, el binario funciona después de eso.Rust, 37 caracteres (+ equivalente de
env K='y'
en su plataforma)Éste es aún peor: es necesario establecer la variable de entorno
K
ay
en tiempo de compilación .Editar : si se establece
K
quey\n
, usted podría caer elln
enprintln!
, para un gran total de35 caracteres yvarios facepalms:fuente
x
una manera, pero aún no es corto:(b'x' + 1) as char
Linux Bash - 19 bytes
Probablemente esto sea trampa y esté sujeto a fallas si no tiene / usr / bin / yes o tiene / usr / bin / xes o / usr / bin / zes:
Creo que cumple con los requisitos, aunque tal vez está violando la regla "nada que se evalúe como y". Y tal vez imitar
yes
al correr realmente va enyes
contra de las reglas.Esto podría optimizarse un poco (aunque es menos probable que funcione) para reducirlo a 11 bytes:
No pude descubrir cómo obtener la bonificación de 10 puntos leyendo una cadena de stdin sin agregar más de 10 bytes al código
fuente
/*/*/?es `line`
, o/*/*/?es `head -n1`
si no tienes/usr/bin/line
.sed q
paraline
.dc, 12
Solo salidas
y\n
. No lee de stdin, así que no hay bonificación.30986 es 0x790A (es decir, "y \ n"). El
P
comando simplemente convierte el número a base 256 e imprime el carácter correspondiente para cada base 256 dígitos.fuente
y\n
?P
pero no sabía que puede hacer más de un personaje a la vez.Lisp común: (30-10) = 20
(read)
de flujo de entrada(format t ... )
format
argumentos (solo uno aquí):~@{ ... ~}
dentro del bucle, para cada argumento:
~A
seguido de una nueva línea~%
~:*
(bucle infinito)Puede romper el ciclo con Ctrl+C, lo que indica un error con las opciones de reinicio (continuar / cancelar).
fuente
Haskell, 29 bytes
Creo que esto es detenido por ambos
SIGINT
ySIGPIPE
.fuente
'\89'
lugar desucc 'x'
Rubí, 27 bytes - 10 = 17
Es solo la solución de @ ProgramFOX con el bono (tomó mis 9 bytes para resolver la pregunta del bono).
fuente
cc, 21 bytes - 10 = 11
Tenga en cuenta que la entrada debe incluirse
[]
, por ejemplo[no]
, porque?
es la única forma de tomar la entrada, que la ejecuta comodc
código.fuente
C2
lugar de122
. De hecho, yo diría que122 1-
podrían ser reemplazados conC1
loC1
que no está prohibido explícitamente en la preguntaCommodore 64 Basic:
1413 bytesComo de costumbre, he realizado sustituciones de caracteres en PETSCII que no están presentes en Unicode.
|
se usa para representarSHIFT+H
, mientras que╭
representaSHIFT+U
. Tenga en cuenta que esto genera ASCII 'y' (valor de byte 121) en lugar de un carácter que el conjunto de caracteres Commodore predeterminado muestra como 'y'.BASIC es supuestamente un lenguaje de programación fácil de aprender, similar al inglés. Agregue los atajos de mecanografía presentes en muchos dialectos tempranos, y obtendrá algo que es más corto y menos legible que Perl.
EDITAR : En el "modo desplazado", esto se acorta dos bytes, gracias a que "y" se codifica en minúscula con el valor decimal 89. El uso de un conjunto de caracteres no ASCII para sortear la regla "no está permitido usar sus valores ASCII" podría ser trampa, sin embargo.
fuente
SHIFT+H
, pero el carácter de la tubería es más fácil de escribir. No hay nada que corresponda a las "líneas en los bordes superior e izquierdo" producidas por `SHIFT + O".AWK, 38 bytes
Variante que leerá la cadena en stdin: 14 bytes-10 = 4
Pero como no puede hacer las dos cosas (volver a "y" si no se proporciona ninguna entrada estándar), no estoy seguro de que cuente ...: o)
Ambos pueden salir con Ctrl + C.
fuente
Fisión , 5 bytes
Esto es bastante competitivo para Fission. :)
El flujo de control comienza con un
(1,0)
átomo a la derecha enR
.x
establece la masa en120
, y la+
incrementa para dar(121,0)
. Luego!
imprime el carácter correspondiente (y
) eN
imprime una nueva línea. El código fuente se envuelve en los bordes, por lo que el átomo pasa deR
nuevo (que ahora no hace nada),x
establece la masa120
nuevamente, la+
incrementa y así sucesivamente ...fuente
C, 32 bytes
Requiere una pequeña máquina endian y compilación con -O2 (para evitar el desbordamiento de la pila).
fuente
PowerShell, 27-10 = 17
Podría no funcionar en Pash. Una alternativa más robusta debería ser
fuente
Lua, 42 bytes - 10 = 32
Lua, 49 bytes - 10 = 39
Ambos fueron probados con Lua 5.1.4 y pueden ser eliminados con SIGINT ( Ctrl+ C).
fuente
Perl, 31
Aquí hay una versión de Perl que realmente se comporta como GNU
yes
, por lo que puedo decir:Esto funciona si está bien usar los interruptores de línea de comando de perl (
-l
para la nueva línea), de lo contrario, se volverían 3 caracteres más largos:fuente
-l
(no-e
) es el interruptor para la nueva línea.CAPL 1.5+; 6 sin entrada; 10-10 = 0 con entrada
Además
, he leído en alguna parte [¿enlace?] Que los idiomas personalizados no están permitidos en las preguntas de golf, ya que podrían hacer funciones integradas que hagan exactamente lo que la pregunta pregunta, sin embargo hice CAPL para facilitar el golf en general . Si crees que esto no está permitido aquí, ¡házmelo saber!
Tengo algunas ideas de > <> y Befunge (puedes moverte entre líneas y usar caracteres hexadecimales para empujar números), algunas de Ruby y otras mías para facilitar el golf.
CAPL lee de izquierda a derecha y va una línea hacia abajo al final de la línea. Si es como la última línea, el programa se cerrará.
Como nadie conoce este idioma todavía, intentaré explicar lo más posible.
Salida y. 6 bytes
bb*.n<
bb*
b
es hexadecimal para11
, entoncesbb*
es11*11
=121
, que es el equivalente UTF-8 dey
. Este valor se empuja a la pila..
Muestra el valor superior de la pila y se muestra como UTF-8. Como121
está encima de la pila, el índice se ignora aquí.n
Emite una nueva línea<
Envía el puntero al principio de la línea, repitiendo así esa línea. Como no esperamos entradas, podemos hacerlo de forma segura sin volver a pedir la entrada.Salida de entrada. 10 bytes, 0 después de la bonificación
i~a&{X:.)}
i
Toma información del usuario, empuja como UTF-8 en la parte superior de la pila y empuja la longitud después de eso. Es decir,[72,101,108,108,111,5]
~
saca un número de la pila y luego invierte esa cantidad de bytes. Es decir,[111,108,108,101,72]
a
hexadecimal para10
, el personaje de nueva línea&{...}
hace un bucle infinito. Tenemos entrada, por lo que no podemos enviar el puntero a la línea. Podría colocar la función en la línea de abajo, lo que me ahorraría un byte, pero no se permiten nuevas líneas en este desafío.X
Elimina el valor superior de la pila (El índice del bucle):.
Duplica el valor superior, luego sale como UTF-8)
Gira la pila a la derecha. ([1,2,3,4,5]
->[5,1,2,3,4]
)Sin embargo, esto significa que comenzamos con una nueva línea, luego comenzamos a generar la entrada, luego una nueva línea, luego la entrada, etc. Si no se nos permite comenzar con una nueva línea, use el siguiente código con 12 bytes, o 2 después de restar El bono.
iXa#~&{X:.)}
El único comando nuevo aquí es
#
, que empuja la cantidad de elementos en la pila a la pila.Eliminé la longitud de
i
, porque agregar 1, luego intercambiar con la nueva línea es más largo que eliminar y obtener la longitud nuevamente.Solo por diversión, aquí hay un programa "Hello World"
La
?!
operación es la misma que la de> <>fuente
APL (Dyalog APL) , 5 - 10 = -5 bytes
Advertencia: se basa en una característica / error no documentado y no compatible.
STDIN vacío imprime líneas vacías (no "y"), lo cual está permitido y se ha sugerido .
Pruébalo en línea!
⎕
STDOUT con nuevas líneas al final,←
consigue⍣
repetidamente hasta≢
difiere de⍞
STDINes decir, nunca, pero ininterrumpible al pausar el hilo.
fuente
⍣
en la asignación←
, aunque←
no es una función real propiamente dicha y, por lo tanto, no es realmente elegible para ser un operando. Todavía funciona a través de ...> <>, 6 bytes
Al no incluir un
;
al final, el > <> seguirá nadando hasta que sea liberado por un SIGINT.Explicación
> <>, 17-10 = 7 bytes
La anterior es una solución bastante aburrida, así que aquí hay una que toma la entrada de stdin. Esto abusa del hecho de que la forma predeterminada de proporcionar entrada a un programa > <> es
echo 'input' | fish.py yes.fish
, dondeecho
proporciona el\n
carácter.Explicación
Al
0r
final, permite que el bucle suceda envolviéndose, donde todavía asumimos que la pila se invierte con una-1
en la parte superior.fuente
Aparentemente esto no es totalmente portátil. Lo
sys.version
es2.7.9 (default, Dec 11 2014, 04:42:00) \n[GCC 4.9.2]
, así que si el tuyo es diferente, esto podría no funcionar, supongo.Python 2 - (76-10) = 66
Bastante largo, pero quería obtener el bono (a pesar de que costaba más de 10 bytes). Comprobar si stdin está vacío o no sin solicitar entrada es aparentemente largo.
Al principio, leí mal la bonificación como una discusión en lugar de stdin. Estoy orgulloso de mi solución para eso, así que lo publico de todos modos;)
Python 2 - (52-10 + ∞) = ∞ (¡inválido!)
sys.argv
es una lista donde el elemento cero es el nombre del archivo y cada elemento posterior es un argumento dado al programa. Agrego un valor falsey al final de la lista; Si no hay argumentos, el primer elemento es ese valor falso, de lo contrario es el primer argumento.a or b
en Python devuelve el primer valor que confirma cuál será el resultado: sia
es verdad, ya sabemos que todo será cierto, por lo que simplemente se devuelve. Si es falso,b
se devuelve (ya queFalse or b
==b
).fuente
y\n
inmediato si el stdin estaba vacío.r=raw_input();p=r if r else`help`[1]\nwhile 1:print p
52 personajesy
, la segunda también.