Mi colega me envió recientemente la siguiente pieza de JavaScript en broma:
let butScript = (nrOfButs) => {
for(var i = 0; i < nrOfButs; i++){
if(i % 3 == 0){
console.log("Yeah")
}
if(i % 2 == 0){
console.log("But")
}
if(i % 3 == 1){
console.log("No")
}
}
}
Dado que el código fue escrito durante las horas de trabajo, obviamente fue un gran desperdicio de recursos de la compañía. Para evitar eventos similares en el futuro, debemos minimizar el desperdicio de horas trabajadas. Y como es de conocimiento común que un programa más corto es más rápido de escribir, ¡debemos desarrollar este código para ser lo más corto posible!
Entrada
Un solo entero no negativo. No debe manejar entradas defectuosas.
Salida
Su programa debe producir una salida idéntica a la del script anterior. Debe generar una palabra por línea, y el número de palabras debe ser coherente con el guión original.
Se permite incluir caracteres de espacio en blanco que no sean de nueva línea al final de cada línea (pero no al principio) ya que son invisibles. Se permite un carácter de nueva línea adicional al final de la salida.
Ejemplos
Input: 0
Output:
Input: 1
Output:
Yeah
But
Input: 2
Output:
Yeah
But
No
Input: 10
Output:
Yeah
But
No
But
Yeah
But
No
Yeah
But
No
But
Yeah
nrOfButs
variable está mal nombrada y es engañosa. Bonito desafío simple de todos modos.if
caída de s y continuar en el bucle actual si su condición se cumplió.Respuestas:
Excel, 78 bytes
Asume la entrada en la celda A1, y ese formato de Wordwrap está activado para la celda. Use Alt + Intro para agregar saltos de línea dentro de la cadena y observe el espacio en blanco. Solo maneja la entrada hasta 3570 debido al límite de la función REPT (aunque, buena suerte, conseguir que una celda sea tan alta).
Reimpresión, con puntos para espacios en blanco
Cómo funciona: el patrón se repite cada 6 números:
Cada uno de estos se puede expresar con 9 caracteres, por lo que una cadena se compone de 54 caracteres (9 * 6), luego se repite tan grande como Excel lo permita. Luego toma los 9 * caracteres izquierdos (número de entrada) como salida.
El salto de línea para el "pero y nadie" se coloca después del espacio en blanco para que el Sí para # 6, # 12, (etc.) esté formateado a la izquierda en lugar de a la derecha, y para que no se agregue un salto de línea en blanco cada sexta línea para ese artículo
fuente
JavaScript (ES6),
5957 bytesPruébalo en línea!
¿Cómo?
Usamos una función recursiva que va de a lugar de a .1 0 n - 1norte 1 0 0 n - 1
Como resultado, las pruebas están desactivadas en comparación con el código de referencia:1
Esto nos permite almacenar el caso más simple como la primera entrada de nuestra matriz de búsqueda, donde podemos definir : una variable que contiene una o una cadena vacía.sn ≡ 0( mod3 ) s
"But\n"
Las otras dos entradas se definen como
"Yeah\n" + s
ys + "No\n"
respectivamente.Nota: Al iterar de a , también podríamos definir en la primera entrada, pero eso costaría dos paréntesis adicionales .0 sn - 1 0 0 s
Comentado
fuente
LOLCODE , 257 bytes
Pruébalo en línea!
fuente
VISIBLE "But"
refiere a la falta de pantalones del programa?Espacio en blanco ,
315304300277276 bytesGracias a @JoKing por -11 bytes (reduciendo la cantidad de etiquetas utilizadas de 8 a 7) y -24 bytes más (cambiando el flujo general del programa y reduciendo la cantidad de etiquetas utilizadas de 7 a 5 en el proceso).
Se agregaron letras
S
(espacio),T
(tabulación) yN
(nueva línea) solo como resaltado.[..._some_action]
agregado solo como explicación.Pruébelo en línea (solo con espacios en bruto, pestañas y nuevas líneas).
El espacio en blanco definitivamente no es el lenguaje adecuado para este desafío. En el espacio en blanco, tanto los bucles como las declaraciones if se realizan con etiquetas y saltos a etiquetas, y dado que no son casos if-elseif-else sino múltiples if-cases,
significa que yo tendré que saltar hacia atrás después de cada si, por lo que es bastante largosignifica que tendré que modificar ligeramente los controles para omitir algunas impresiones (gracias @JoKing ).Explicación en pseudocódigo:
Explicación adicional:
En general, pasa de la entrada a 0, empujando una nueva línea y la palabra invertida (por lo tanto, en el orden "\ noN", "\ ntuB", "\ nhaeY" en lugar de "Sí \ n", "Pero \ n "," No \ n "). Y después de que la entrada se haya reducido a 0 y todos los caracteres estén en la pila, imprimirá esos caracteres en reversa (por lo tanto, el orden de salida correcto).
Sin embargo, más en profundidad: aunque necesitamos imprimir palabras en el rango
(input, 0]
, en su lugar se repetirá[input, 0)
. Debido a esto, podemos usar laif(i%3 == 2)
marca de verificación para "\ noN" (o en realidad,if(i%3 != 2)
omitir el empuje de "\ noN"), y usamos laif(i%2 != 1)
marca de verificación para "\ ntuB" (o en realidad,if(i%2 == 0)
omitir la inserción de "\ ntuB" ) Solo después de estas dos comprobaciones disminuimos la iteracióni
en 1. Y luego hacemos la comprobaciónif(i%3 == 0)
para presionar "\ nhaeY", similar al código de ejemplo JS en la descripción del desafío. Saltar con cheques if-not en lugar de ir a una etiqueta y regresar de la etiqueta con if-cheques guardados 23 bytes.Además, en los espacios en blanco, los valores de los caracteres se almacenan en la pila como sus valores unicode (es decir,
10
para líneas nuevas,65
para 'A',97
para 'a', etc.). Como ya necesito recorrer la pila para imprimir los caracteres, también puedo usar mi punta de espacio en blanco para reducir el recuento de bytes agregando una constante a los valores numéricos, antes de imprimirlos como caracteres.Esta constante es
104
en este caso, que se genera con este programa Java que también he usado para jugar otra respuesta de Whitespace mía antes . Esa es también la razón por la cual esta parte del código:tiene los valores
-94
para la nueva línea,7
para la 'o' y-26
para la 'N'. Debido a la adición de la constante de la104
voluntad correctamente dar a nuestros valores Unicode10
,111
y78
para estos caracteres, respectivamente.fuente
if i modulo-3 != 1 jump to next if else push NO
i
antes de queif(i is 0) call PRINT
sea cierto, pero el otro es verificari
antes de restarlo y omitir las impresiones. Bastante inteligente en realidad. Continuará implementándolo.Python 3 ,
8582 bytesPruébalo en línea!
Python 3 ,
7976 bytesLa respuesta de Excel del Puerto de Keeta .
Pruébalo en línea!
fuente
Perl 6 ,
6350 bytesPruébalo en línea!
Bloque de código anónimo que toma un número y devuelve una lista de líneas
Explicación:
fuente
C (gcc) , 75 bytes
Pruébalo en línea!
C (gcc) , 60 + 11 = 71 bytes (usando
-D$=||puts(
)Pruébalo en línea!
fuente
05AB1E (heredado) ,
272524 bytesGuardado 1 byte gracias a Kevin Cruijssen .
Pruébalo en línea!
Explicación
fuente
×
, ¡no había pensado en eso!Θ
ahora que ya no está usando×
, yaÏ
que solo verá1
s solo, por lo que ignora el2
(y,0
por supuesto).Python 2 , 73 bytes
Pruébalo en línea!
fuente
Python 2 ,
979592908381 bytesPruébalo en línea!
-2 bytes, gracias a los ovs
Python 3 ,
92908583 bytesPruébalo en línea!
-4 bytes, gracias a los ovs
-4 bytes, gracias a Jo King
fuente
len(w)<3
->'N'in w
, 81 bytes :len(w)%2
->(w<'N')
Lienzo , 27 bytes.
Pruébalo aquí!
fuente
Groovy (función), 79 bytes
Desde que inicialmente envié mi respuesta, he examinado algunas discusiones históricas aquí sobre lo que constituye una respuesta adecuada. Dado que parece comúnmente aceptado proporcionar solo un método en Java (incluyendo el tipo de retorno y las declaraciones de parámetros), aquí hay un método más corto, Groovy, que tiene el valor de retorno del método como respuesta. El uso de
def
significa que se infiere el tipo de retorno.A diferencia de la respuesta original a continuación, que se repite desde 0 hasta n-1, esta se llama a sí misma desde n hasta 1, pero disminuye la entrada para el resto de la línea en la llamada recursiva.
Pruébalo en línea!
Groovy (programa), 87 bytes
Los scripts Groovy no requieren ciertas importaciones comunes, por lo que este puede ser un programa que imprime la respuesta a STDOUT de Java sin tener que declararlo
System.out.
antesprint
. También proporciona algunos métodos de utilidad comunes, como este,toLong()
que nos permite analizar el argumento de entrada de manera razonablemente concisa.Esencialmente, la respuesta de Java 10, pero aprovechando la sintaxis de bucle más corto de Groovy y la capacidad de evaluar declaraciones verdaderas.
Pruébalo en línea!
fuente
Retina 0.8.2 , 45 bytes
Pruébalo en línea! Explicación:
Convierta la entrada a unario.
Para cada número entero
0...n-1
, genere tres líneas de texto, una para cada palabra, cada una coni
1
s antes, a excepción deNo
, que tiene dos1
s adicionales para que calculemos(i+2)%3==0
cuál es equivalente ai%3==1
.Eliminar pares de
1
s antes deB
s.Elimine
1
s en grupos de tres en todas partes.Eliminar todas las líneas que todavía tienen un
1
.fuente
11No¶
calcular(i+2)%3==0
(por lo que los tres son verificaciones si==0
) parece tan obvio, pero yo no habría pensado en eso, así que en realidad es bastante ingenioso. +1 de mi parte, buena respuesta!Java 10,
10099 bytes-1 byte gracias a @ OlivierGrégoire .
Pruébalo en línea.
Explicación:
fuente
++i%3>1
probablemente te ahorrará un bytePowershell,
7574726766 bytes-1 byte gracias TessellatingHeckler
Prueba de guión y explicación:
Salida:
Script sencillo, 72 bytes:
fuente
======
. Solo generaYeah,But,No
cadenas. El script de prueba muestra un separador para facilitar la lectura de los resultados solamente.(" Yeah\nBut No But Yeah But\nNo "*($j="$args")|% s*t 32)[1..$j]-ne''
Haskell , 71 bytes
Pruébalo en línea!
Explicación
Bastante simple, guardó dos bytes usando en
[1..n]
lugar de[0..n-1]
y ajustó los restos: las(?)
pruebas del operador toman cuatro argumentos, devolviendo una lista vacía o la cadena provista como un singleton si el resultado es correcto.Al cursar el cuarto argumento de
(?)
podemos utilizar(<>)
para concatenar los resultados de cada función, es decir:fuente
C # (compilador interactivo de Visual C #) ,
10599949689bytesPruébalo en línea!
fuente
x++%3==1?
puede ser++x%3>1?
. Alguien más acaba de darle una propina para mi respuesta de Java, pero lo mismo se aplica a su respuesta de C #. :)Pip ,
373533 bytes(Observe el espacio después
But
.) Toma la entrada como un argumento de línea de comandos. Pruébalo en línea!Explicación
Esta explicación es para la versión anterior; consulte a continuación el registro de cambios
Inspirado por Jo King's Perl 6 respuesta . Construimos esta lista:
y generar los primeros
a
elementos de la misma mediante indexación cíclica.Actualización: me di cuenta de que no necesito usar reemplazar para cambiar 0/1/2 en cadenas; puedo usar esos números para indexar directamente en una lista. Para hacer esto, debemos asegurarnos de que los números de varios dígitos se dividan en listas de sus dígitos (de lo contrario, seleccionaremos el índice 10 en lugar de los índices 1 y 0). Afortunadamente, el uso de una lista anidada arbitrariamente como índice en Pip funciona como se esperaba, dando una lista (anidada) de resultados. Para la entrada de 3, obtenemos esta progresión de datos (donde
_
representa una nueva línea):Como antes, el resultado final se concatena y se imprime automáticamente.
fuente
Adjunto , 48 bytes
Pruébalo en línea!
Explicación
fuente
C (gcc) ,
7771747269 bytesYa hay una mejor respuesta en C aquí, pero esta es recursiva y me tomó un tiempo aclararla, así que la publico.
Hasta 69 bytes gracias a @ceilingcat y @JonathanFrech
(Nunca pienso usar n- ~ -i en lugar de n-i + 1)
Pruébalo en línea!
fuente
j
te ahorró dos bytes.n-~-i
es equivalente an-i+1
- noi<n+1
- y, por lo tanto, en realidad no guarda ningún byte ...Rubí, 69
7274BytesRespuesta muy directa, buscando un método más corto y recursivo en este momento.
Guardado dos bytes gracias a @BWO :)
Guardado otros tres bytes usando símbolos en lugar de cadenas
fuente
Python 3, 93 bytes
Esta no es exactamente la mejor solución, pero es mi opinión.
Pruébalo en línea!
fuente
R, 65 bytes
Debido al hecho de que estamos replicando un programa ligeramente defectuoso (se pierde cada cuarto "pero", debería haber usado
%4 == 1
y%4 == 3
no%3
condiciones), tenemos que usar una llamada incómodac
y trabajar en la base siete. Aún así, es más corto que LOLCODE ...(Esperaba que (3,1,2,3,2,1,2) o una permutación similar pudiera aparecer en el
lh
conjunto de datos en alguna parte, pero no lo parece)fuente
sed -E ,
179150 bytesLa parte más difícil no fue construir la lista sino analizar el número decimal.
Se pueden guardar 2 bytes si no se requiere la nueva línea al final:
c\
→d
.Todavía requiere optimización.
Pruébalo en línea .
Explicación
fuente
Limpio , 116 bytes
Pruébalo en línea!
fuente
F #,
108106 bytesPruébalo en línea!
-2 bytes cambiando de
i=0 to p-1
ai=1 to p
y ajustando módulos. Aparte de eso, bastante sencillo.fuente
v
función imprimiera todo.i=1 to p
(y módulos de ajuste, naturalmente). Los rangos inversos están vacíos. :)PHP,
6568 bytesEjecutar como tubería
-nR
o probarlo en línea .fuente
VBA (Excel),
105, 101,99 bytesEditar: -4 bytes de Keeta! ¡Gracias!
Edición 2: -2 bytes de Chronocidal! Woot! (Me di cuenta de que los casos de prueba solo funcionaban para 10. Corregido ahora)
Sí, Excel venció a VBA esta vez. Lo que sea. (Vamos por ti)
^ Esto se pega en la ventana Inmediato y sale a la ventana de depuración
Sin golf
fuente
&
IIf(..)
Jalea , 22 bytes
Un enlace monádico que produce una lista de líneas (que parece haberse permitido en los comentarios)
Pruébalo en línea! (el pie de página llama a Link usando
Ç
y se une a las nuevas líneas usandoY
ya que la impresión implícita en Jelly rompe todo junto si puede)¿Cómo?
Ahora tenga en cuenta que los primeros seis valores son:
Entonces, la lista resultante de líneas debe ser estos valores repetidos (o truncados) a una longitud
n
concatenada juntos.Ahora tenga en cuenta que el conjunto de potencia de
"Yeah", "But", "No"
es:Entonces, cada período son estos valores indexados 1 del conjunto de potencias de
"Yeah", "But", "No"
:El código crea esta lista, la moldea a medida
n
, la indexa en el conjunto de alimentación y luego elimina las listas internas (que también elimina las cadenas vacías, ya que las cadenas son listas en Jelly) ...fuente
Python 2 ,
939283 bytesPruébalo en línea!
Un enorme 9 bytes guardados gracias a @Jonathan Frech
fuente
('','Yeah\n')[x%3<1]
es equivalente a"Yeah\n"*(x%3<1)
.