Gracias a @ComradeSparklePony por el título.
Este desafío debería ser muy simple. Te dan tres listas.
El primero es una lista de nombres, en caso de título.
El segundo es una lista de adjetivos, en minúsculas.
El tercero es una lista de sustantivos, en minúsculas.
Seleccione al azar un nombre, adjetivo opcional, nombre y salida <Name>'s <adjective> <noun>
. Sin embargo, cada palabra debe comenzar con la misma letra. Puede suponer que todas las palabras comienzan con una letra. También puede suponer (pero tenga en cuenta en su respuesta si lo hace):
- que todas las palabras están compuestas únicamente por caracteres alfabéticos
- que hay al menos un sustantivo para cada nombre
- que hay al menos un nombre para cada sustantivo
Sin embargo, no puede suponer que existe un adjetivo para un par particular de nombre y nombre, ya que el adjetivo es opcional, por lo que la salida seguirá siendo válida.
No tiene que seleccionar la letra compartida de manera uniforme, aunque todas las letras disponibles deben tener una probabilidad distinta de cero. Sin embargo, debe asegurarse de que todas las salidas para una letra dada tengan la misma probabilidad de ocurrir dentro de los límites del generador de números aleatorios de su idioma. En el caso del adjetivo, esto es equivalente a tener una entrada adicional que significa "sin adjetivo para esta letra" que tiene la misma posibilidad que todos los otros adjetivos para esa letra.
Ejemplo de listas de entrada:
Joan Neil Nicola Oswald Sherman Stephanie
new novel old original second silent
jeep noun novel output second sheep snake
Ejemplo de salidas para estas entradas (cada línea es un ejemplo separado):
Stephanie's second second
Sherman's silent snake
Oswald's original output
Nicola's novel novel
Neil's noun
Joan's jeep
Tenga en cuenta que no hay espacio adicional entre las palabras en los últimos dos ejemplos.
Este es el código de golf , por lo que gana el código más corto que no rompa ninguna laguna estándar
En el improbable caso de que ayude, puede ingresar todo en mayúsculas, pero aún necesita emitir en mayúsculas y minúsculas.
j
adjetivo, ¿la probabilidad sería 4 en 9? Podría valer la pena colocar probabilidades contra los resultados, o enumerar todos los resultados, ya que entiendo que no solo "todos los resultados para una letra dada ..." sino también todos los resultados distintos deberían tener la misma probabilidad (dados valores distintos dentro de cada lista).Respuestas:
Jalea ,
27 2524 bytes-1 gracias a Erik the Outgolfer (usa un carácter cero en lugar de un espacio)
Un programa completo que acepta un argumento en forma de una lista con formato de Python de listas de cadenas que imprime el resultado en STDOUTt.
Pruébalo en línea!
¿Cómo?
fuente
05AB1E ,
24 2321 bytesAsume que hay un nombre para cada nombre, según lo permitido por el desafío.
Pruébalo en línea!
Explicación
fuente
¯ª
y€˜
son inteligentes! Tenía una respuesta de 26 bytes, pero estaba teniendo problemas para arreglar el doble espacio cuando no hay un adjetivo ..¯
lugar de llenar con cadenas vacías que tuve que limpiar manualmente más tarde.R ,
155148 bytes-7 bytes gracias a Giuseppe (usando
*
parasample
)Pruébalo en línea!
Utiliza el muestreo de rechazo: dibuja al azar un nombre, un adjetivo (posiblemente la cadena vacía) y un sustantivo hasta que coincidan las primeras letras. Esta condición se verifica contando si el número de elementos únicos en el vector formado por las primeras letras, más la cadena vacía, es de longitud 2; esto permite un adjetivo vacío.
Luego imprima el resultado, con un espacio adicional si el adjetivo no está vacío.
Las diferentes posibilidades que comienzan con la misma letra tienen probabilidades de ocurrencia iguales, ya que se
sample
basa en la distribución uniforme. La forma más fácil de ver esto es condicionar en el caso de que el nombre y el nombre comiencen con la misma letra (lo cual está bien: si no lo hacen, lo rechazaríamos). Ahora condicione el evento que aceptamos: esto significa que dibujamos el adjetivo vacío o un adjetivo que comienza con la misma letra. Cada una de estas posibilidades todavía tiene la misma probabilidad.fuente
sample
basa en la distribución uniforme. La forma más fácil de ver esto es condicionar en el caso de que el nombre y el nombre comiencen con la misma letra (lo cual está bien: si no lo hacen, lo rechazaríamos). Ahora condicione el evento que aceptamos: esto significa que dibujamos el adjetivo vacío o un adjetivo que comienza con la misma letra. Cada una de estas posibilidades todavía tiene la misma probabilidad.JavaScript (ES6),
139124122120 bytesAhorre 2 bytes gracias a @Neil
Toma entrada como
(names,adjectives)(nouns)
.Pruébalo en línea!
O verifique la distribución en 5 millones de sorteos
¿Cómo?
Luego verificamos si todas las letras iniciales son idénticas con la siguiente expresión regular:
fuente
+[(o=g([,...a]))&&o+' ']+
ahorra 2 bytes, creo?Python 3 ,
161 154 151 147145 bytes(¡ Gracias ArBo, EmbodimentOfIgnorance, Neil que han contribuido con 2, 3 y 4 bytes a mi primer golf! )
Pruébalo en línea! (con 500k ejecuciones)
Toma tres listas como entradas.
Asume al menos un sustantivo para cada nombre.
Mismo puntaje, más golf-y:
Python 3 , 145 bytes
Pruébalo en línea! (con 500k ejecuciones)
Es solo 140 si se permiten espacios en blanco al final (al quitar la cara cuadrada
[:-1]
)fuente
while t>""<t[0]!=w
. También puede reemplazar la última líneaprint(s+"'s",t+(t and" ")+o)
dejando caeru=
la tercera línea.t
una vez, por lo que puede guardar 4 bytes al incluir el código. Creo que puede cambiaro
para usar un patrón de código similart
y luego guardar otros 4 bytes al incluirlo también.o
: llego a esto:from random import*
c=choice
def f(N,a,n):
s=c(N);y=lambda p,e=[]:c([x for x in p if x[0]==s[0].lower()]+e);print(s+"'s",y(a,[""])+y(n))
( 137 ) pero agregar el espacio en blanco condicional, a través de un argumento opcional ay
, me cuesta 11 bytesJalea , 28 bytes
Pruébalo en línea!
Escribí esto antes de ver la respuesta más corta de @ JonathanAllan, pero pensé que valía la pena publicarla, ya que utiliza un enfoque diferente. Guardado 3 bytes por la sugerencia de @ EriktheOutgolfer sobre esa respuesta.
Un programa completo que toma una lista de listas de cadenas e imprime implícitamente una aliteración seleccionada al azar. Asume al menos un sustantivo por nombre.
fuente
C # (compilador interactivo de Visual C #) , 176 bytes
Pruébalo en línea!
fuente
Rojo , 179 bytes
Pruébalo en línea!
Explicación:
fuente
Scala ,
234226234206 bytes-28 debido al hecho de que pensé que tenía que aceptar StdIn, ahora es una función
Pruébalo en línea!
Sin golf:
fuente
Ruby , 94 bytes
Pruébalo en línea!
fuente
Icono ,
167163 bytesPruébalo en línea!
Utiliza el mismo algoritmo que mi
Red
respuesta.fuente