Este desafío está inspirado en una serie de libros para niños pequeños de Fiona Watt y Rachel Wells, que recientemente he estado disfrutando con mi hija.
En cada libro, un mouse (ilustrado, pero no parte del texto) se queja de que una sucesión de 5 cosas del mismo tipo no son lo suyo. Luego respalda esto al declarar que algún componente de la cosa no tiene la propiedad que espera.
En la sexta vez que pregunta, el ratón encuentra lo suyo y está contento porque tiene la propiedad esperada.
Aquí está el texto de un ejemplo típico:
That's not my bunny, its tail is too fluffy.
That's not my bunny, its paws are too rough.
That's not my bunny, its tail is too woolly.
That's not my bunny, its eyes are too shiny.
That's not my bunny, its nose is too wrinkled.
That's my bunny! Its ears are so soft.
Ahora, la mayoría de la gente de programación se daría cuenta de que este es un método muy algorítmico para producir texto. Debido a que es un proceso tan claro, deberíamos poder reproducir esto escribiendo algún código.
Comencemos con tres colecciones de palabras:
things = ["dinosaur", "lamb", "princess", "reindeer", "train"]
parts = ["back", "bells", "body", "bows", "crown", "dress", "ears",
"engine", "fan", "flippers", "funnel", "hooves", "horns", "neck",
"nose", "roof", "sash", "side", "spines", "spots", "tail", "teeth",
"tiara", "wheels", "windows"]
properties = ["bumpy", "fluffy", "furry", "fuzzy", "glittery", "glossy",
"hairy", "red", "rough", "rusty", "shiny", "silky", "slippery",
"soft", "sparkly", "squashy", "thick", "velvety", "woolly"]
- Primero, decidimos qué tipo de cosas describiremos.
- Luego, 5 veces, generaremos la línea "Esa no es mi [cosa], su [parte] es también [propiedad].
- Finalmente, generamos la línea "¡Esa es mi [cosa]! Su [parte] es tan [propiedad]!
El reto
- Genere el texto de una historia de "Ese no es mi ...".
- No debe reproducir constantemente el mismo texto.
- Es un código de golf, así que intente hacerlo en el menor número de bytes.
- Use cualquier idioma que desee.
- El espacio en blanco no importa, pero debe haber un carácter de nueva línea entre líneas.
- Las listas de palabras de origen no son parte de su respuesta (en TIO se pueden agregar al encabezado).
- Puede cambiar el nombre de las listas de palabras de origen.
- La salida puede enviarse a un terminal o texto generado en un objeto.
- Incluya un enlace a un intérprete en línea.
- Ignora los plurales, "sus cuernos es" está bien.
- No tiene que tener sentido. Si el embudo de tu princesa es demasiado esponjoso, solo dilo.
Salida de muestra:
That's not my train, its engine is too rusty.
That's not my train, its hooves is too thick.
That's not my train, its sash is too fuzzy.
That's not my train, its tail is too velvety.
That's not my train, its horns is too glittery.
That's my train! Its hooves is so hairy.
¡Feliz golf!
Respuestas:
05AB1E , 63 bytes
Pruébalo en línea.
Versión de 68 bytes que no genera partes ni propiedades duplicadas:
Pruébalo en línea.
Ambos programas asumen que la lista de cosas es la primera entrada, y una lista que contiene la lista de partes y la lista de propiedades es la segunda entrada.
Explicación:
Vea esta sugerencia mía 05AB1E (sección ¿Cómo usar el diccionario? ) Para comprender por qué
“€Š's€¯ ÿ!€ç ÿ€ˆ€Ê ÿ.“
es"that's my ÿ! its ÿ is so ÿ."
y“€Š's€–€¯ ÿ,€ç ÿ€ˆ…« ÿ.“
es"that's not my ÿ, its ÿ is too ÿ."
.fuente
Python 3 , 149 bytes
Pruébalo en línea!
-9 bytes gracias a movatica
fuente
Carbón de leña , 72 bytes
Pruébalo en línea! El enlace es a la versión detallada del código. Espera que las matrices de las cosas, las partes y propiedades para estar en las variables
θ
,η
yζ
, que está más fácilmente dispuesto proporcionándoles en la entrada en lugar de la cabecera. Explicación:Elige una cosa al azar.
Imprime cinco oraciones negativas.
Imprime la oración positiva.
fuente
Japt v2.0a0
-R
, 73 bytesToma las tres listas como
U
,V
yW
. Esas son las variables de entrada predeterminadas de todos modos, así que solo ponga las tres listas en la sección de entrada.Intentalo
fuente
Potencia Shell , 147 bytes
Este programa principal no repetirá ninguna parte o propiedad en una ejecución y tiene una aleatorización razonable.
Pruébalo en línea!
¡Escribir
get-random
tantas veces cuesta tantos caracteres! Sin embargo, a menos que esté dispuesto a permitir que las partes y propiedades se repitan, no puedo ver una forma de reducir esto en PowerShell. A menos que mueva las primeras 3 líneas al final de las 3 líneas de asignación en el encabezado. Tener algo comoPero parece que está haciendo trampa, y todavía no supera la respuesta de Neil.
Editar: Gracias por los consejos Matt, y gracias AdmBorkBork por desarrollarlos, eliminar los 3 conjuntos de
get-
texto lo redujo a 159 bytes, luego un poco más de golf de Adm lo redujo a 147. El código en el que estaba pensando permitía duplicados y declaraciones contradictorias fueron 144 caracteres después de aplicar los mismos consejos de golf.Pruébalo en línea!
Sin embargo, no solo tiene la tendencia de decir lo mismo varias veces, sino que requiere que sus entradas tengan la misma cantidad de elementos. Creo que el generador de números pseudoaleatorios que se usa depende en gran medida del reloj, y las llamadas rápidas repetidas a menudo pueden dar como resultado el mismo resultado. Luego tiene la condición de que solo use la lista completa si todas las listas tienen la misma longitud. Con solo guardar 3 ~ 5 caracteres y tener tantas advertencias, prefiero el código al comienzo de esta publicación.
fuente
Get-
deGet-Random
. Es el verbo predeterminado probado al evaluar comandos.Jalea , 72 bytes
Pruébalo en línea!
fuente
JavaScript, 129
la entrada es tres matrices, devuelve cadena
fuente
Ruby , 128 bytes
Pruébalo en línea!
fuente
C # ,
204203 bytesEs mi primera respuesta en este sitio, así que espero que funcione bien. También necesita esas tres cosas, pero según la pregunta, esas no cuentan:
Pruébalo en línea!
Un byte menos gracias a Sok.
fuente
\r
no es obligatorio, lo que te ahorrará 2 bytes.APL (Dyalog Unicode) , SBCS de 117 bytes
Pruébalo en línea!
?N
genera un índice aleatorio entre los primeros N índices.M?N
genera M índices aleatorios (sin reemplazo) entre los primeros N índices.,
es concatenaciónt←T⊃⍨
... elige una cosa al azar y la llamat
para su reutilización en la última línea.∘,¨
concatena la cadena de la izquierda a cada cadena de la derecha.,¨
concatena cada cadena a la izquierda con cada cadena a la derecha.↑
cambia la lista de cadenas en una matriz de caracteres para que se imprima correctamente.fuente
Pyth ,
887876 bytesPruébalo en línea!
El código presentado anteriormente requiere el siguiente encabezado:
Hay un pequeño problema con el uso de la función 'Encabezado' en TIO con Pyth, ya que parece que TIO une los bloques de código en las nuevas líneas, y las nuevas líneas son importantes en Pyth. Aquí hay un enlace al mismo código usando el bloque 'Encabezado', con una línea basura en la salida.
Editar: reescribir a golf 10 bytes, versión anterior:
J+" my "ONV5%"That's not%s, its %s is too %s."[JOGOH;%"That's%s! Its %s is so %s."[JOGOH
fuente
Perl 5.10, 127 bytes
Corre con
perl -M5.010 -f filename.pl
.fuente
JavaScript ES6, 149 (+15?) Bytes
fuente
Archivo por lotes,
434424 + 7 bytesEjecutado vía
cmd/q/c
.Código no contado
Código contado
Revisaré algunos desafíos que debes enfrentar y explicaré / justificaré lo que hice para que otros puedan mejorar.
Elija un elemento aleatorio de una matriz.
Hice esto generando un número aleatorio entre
1
yn
dónden
está la cantidad de elementos en esa matriz. Luego usé este número aleatorio como el token para agarrar en cadafor
bucle (tokens=%r%
). Debido a que lo hice de esta manera, ya no podía anidar estosfor
bucles, ya quetokens=!r!
no funcionaba para mí (con una expansión retrasada). Esto habría ahorrado bastantes bytes, ya que habría eliminado la necesidad de guardar los tokens como variables (set x=%%x
).Generación de números aleatorios
m
es mi macro de generación de números aleatorios. Hacerlo de esta manera ahorra 32 bytes al hacerlo comoset/ar=%random%%%n+1
cada línea. Se podría semi-trampa y decide que los tokensy
yz
está siendo el mismo elemento:Esto, si bien aún conserva algo de aleatoriedad, excluiría los 6 elementos finales de
c
. Esto ahorraría un mínimo de 20 bytes, pero no creo que esto sea fiel a los requisitos del operador.Mejoras teóricas
Pasé bastante tiempo tratando de hacer que este "pseudocódigo" funcione, sin dejar de guardar bytes:
Desafortunadamente, la configuración para esto está probando tomar demasiados bytes para ser rentable (tiene que implementarse en <144 bytes), pero no puedo evitar la sensación de que agregar las últimas 4 líneas de código es superfluo y extraño.
fuente
The lists of source words are not part of your answer (in TIO they can be added to the header).
set a=%~1
, etc.tinta , 119 bytes
Con las listas definidas como
Pruébalo en línea!
Aunque dependiendo de lo que cuenta como una lista, hay otros enfoques. Si una lista puede ser una función que devuelve aleatoriamente un elemento de la lista, el siguiente enfoque es de solo 91 bytes:
(con las "listas" definidas de la siguiente manera)
Pruébalo en línea!
También existe el siguiente enfoque.
Pruébalo en línea!
Esta solución es de 389 bytes, pero si los literales aleatorios (que en este escenario realmente no se pueden mover) cuentan como definiciones de lista y pueden excluirse del recuento de bytes, esto se reduce a 80 bytes.
fuente
Bash + awk, 209 bytes
Pruébalo en línea!
Acepta entradas como
things parts properties
donde cada una es un archivo con un elemento por línea del tipo deseado.Este es un enfoque centrado en el archivo. Puede intentar un enfoque centrado en la matriz más adelante para ver si se puede mejorar.
fuente
Python 3, 130 bytes
Tomando sus requisitos literalmente, y tomando los retornos de carro para que sean un byte cada uno:
fuente