¿Alguna vez has querido preguntarle al compilador "¿Por qué?" La mayoría de nosotros nos hemos sentido frustrados cuando el código no funciona como debería. Mathworks por lo tanto ha implementado una pequeña y agradable función why
que responde a la pregunta. Para dar algunos ejemplos de MATLAB:
why
The programmer suggested it.
why
To fool the tall good and smart system manager.
why(2)
You insisted on it.
why(46)
Bill insisted on it.
Su tarea es implementar la why
función en su idioma. La función debería funcionar con y sin un argumento de entrada (alternativamente, use input 0
o -1
). La función debe ser nombrada why
(o, escribir why(n)
en STDIN debería dar como resultado que se imprima la cadena apropiada).
Si no se proporciona ningún argumento, o el argumento es cero o negativo, la cadena de salida debe ser una frase aleatoria y válida. Por lo tanto, no debería ser una función why
, why()
, why(0)
o why(-1)
que devuelve una frase al azar.
Si se proporciona un argumento de entrada n
(argumento de función, no STDIN), la salida debería ser la enésima cadena (definida a continuación). Por lo tanto, why(1)
siempre debe generar (imprimir / mostrar) el mismo resultado.
Las oraciones se construyen de la siguiente manera (Tipo 1, Tipo 2 y Especial). Todas las oraciones terminan con!
.
"Person" "ending" !
"Verb" "adjective" "Person" !
A list of special cases
La lista de personas:
Stewie
Peter
Homer
The programmer
The system manager
You
La lista de finales:
suggested it
insisted on it
did it
La lista de verbos son:
To fool
To satisfy
To please
La lista de adjetivos:
the smart
the bald
the tall
the rich
the stupid
La lista de casos especiales:
How should I know?
Stop asking!
Don't ask!
La forma de seleccionar una numerada es:
Tipo de oraciones:
Odd number => Type 1
Even number => Type 2
n % 7 = 0 => Type 3 (% is the modulus operator)
Nombres: el enésimo nombre se define mediante el módulo (%).
n = 1: 1 % 7 => Stewie
n = 2: 2 % 7 => Peter
...
n = 6: 6 % 7 => You
n = 7: 7 % 7 => How should I know?
n = 11: 11 % 7 => The programmer
n = 14: 14 % 7 => Stop asking!
n = 21: 21 % 7 => Don't ask!
Terminaciones: la enésima terminación también se define utilizando el módulo. Suponga que las terminaciones (1, 2 y 3) se enumeran como (1 2 2 3)
. Como los números siempre son impares, use((n+1)/2 % 4)
n = 1: ((1+1)/2 % 4) => suggested it
n = 3: ((3+1)/2 % 4) => insisted on it
n = 13: ((13+1)/2 % 4) => did it
Adjetivos: el enésimo adjetivo se define utilizando el módulo. Como los números son siempre pares, use:(n % 10)/2
n = 2: (2 % 10)/2 => Smart
n = 6: (6 % 10)/2 => The tall
...
Verbos: el enésimo verbo también se define utilizando el módulo. Suponga que los verbos (1, 2 y 3) se enumeran como (1 2 2 3)
Como los números son siempre pares para los verbos, use(n % 8) / 2
n = 2: (2 % 8)/2 => To fool
n = 4: (4 % 8)/2 => To satisfy
n = 6: (6 % 8)/2 => To satisfy
n = 8: (8 % 8)/2 => To please
Ahora, la forma de crear una aleatoria debería ser bastante simple, simplemente seleccione una aleatoria n
.
Algunos ejemplos:
why
You suggested it!
why
To fool the tall Homer!
why
Don't ask!
why(1)
Stewie suggested it!
why(14)
Stop asking!
why(8)
To please the rich Stewie!
Se aplican reglas estándar de golf de código. Se seleccionará un ganador una semana a partir del día en que se publicó el desafío.
why
o seríaWHY
aceptable?/2
funcionar. Eso da valores fraccionarios.13
también debe serinsisted
(14/2 = 7% 4 = 3 = 2do de insistido).the rich The programmer
el especificadothe
?The
yTo
en sus listas, probablemente debería estar en minúsculas para que coincida con sus ejemplos ...Respuestas:
JavaScript (ES6) 345
No estoy seguro acerca de los números, pero aquí está mi intento.
Pruebe a ejecutar el fragmento a continuación en un navegador compatible con EcmaScript.
fuente
0
como delimitador de cadena en lugar de,
!split(0)
es la misma longitud desplit','
(fingir que son backticks)C #, 502 bytes
Este proyecto debe tener el nombre de ensamblado establecido en por qué, lo que producirá un ejecutable con el nombre correcto.
Completamente golfizado:
Sangría y nuevas líneas para mayor claridad:
Ejemplo de entrada / salida:
fuente
Powershell
437461453 BytesEditar: se perdieron los verbos duplicados
División entre el corpus y los cálculos para el conteo de bytes
to
,the
,it
y!
lugares, ya que han fijas).Establece el argumento predeterminado en 0 si no se especifica. Si el argumento es,
<1
entonces obtiene un número aleatorio<99
fn:1
y vuelve a ejecutar. Técnicamente, esto significa-50
que funcionará también, siendo tratado como un caso aleatorio.Explicación:
fn:1
99 Elegido para guardar un byte. Si hay más de 99 posibles oraciones anteriores (no se calcularon) aumente a 999 o 9999 según corresponda (+1/2 bytes)fuente
MUMPS, 379 bytes
Cuando no se proporciona ninguna entrada, se genera un número aleatorio en 0..839.
Uso:
La estrategia de evaluación de izquierda a derecha de MUMPS ahorra unos pocos bytes entre paréntesis aquí.
Nota al margen: ¿ves esas cadenas que se parecen
"foo^bar^baz^qux"
? Esas son las llamadas "cadenas delimitadas", y son la forma estándar de almacenar listas que se ajustan dentro del límite máximo de tamaño de cadena, ya que MUMPS en realidad no tiene listas / matrices (o, de hecho, ninguna estructura de datos además de árboles). Para listas demasiado grandes para caber en una sola cadena, en su lugar utilizamos árboles de profundidad 1 y colocamos los valores en las hojas del árbol. ¡Divertido!fuente
why
función. ;)Emacs Lisp 473 Bytes
Más grande 'de desecho' es probablemente el
format
,%s
... secciones. Si las variables pudieran integrarse en las cadenas sin la especificación, ahorraría 10 bytes%s
y otros 12 enformat
fuente
Ruby
396378372 bytesEstoy seguro de que esto no se juega al máximo.
Editar: Me acabo de dar cuenta de que no sé la precedencia del operador. Oh bien..
fuente
CJam, 281 bytes
Enlace permanente
No he usado CJam antes, así que tomaré algunos consejos. ¡Estoy seguro de que hay muchos trucos que no sé!
(No pude entender cómo nombrar esto como una función llamada "por qué", parece que las funciones no existen en CJam, así que no estoy seguro de si una respuesta de CJam está bien o no ...)
fuente
Lua 5.3.0,
452460446 bytesEste es mi primer intento en un código de golf, ¡así que corríjame si hice algo mal!
Sin golf:
fuente
Python (2), 692 bytes
Todavía estoy aprendiendo, ¡así que por favor sé gentil! :)
Funciona con o sin un int como argumento de línea de comando.
Traté de enfatizar código de corrección tanto como sea posible, al igual que con la generación de números aleatorios a partir
-sys.maxint - 1
desys.maxint
y visualización de frases en el caso correcto.El código se basa en gran medida en sentencias if que estoy seguro de que podrían reemplazarse con algo más eficiente.
¡La retroalimentación es muy bienvenida!
Sin golf (1341 bytes)
fuente
argument%8/2-1
y elimine el segundo. También puede reemplazar==0
con<1
.