Obrigado a @ComradeSparklePony pelo título.
Esse desafio deve ser muito simples. Você recebe três listas.
O primeiro é uma lista dos primeiros nomes, em maiúsculas.
O segundo é uma lista de adjetivos, em minúsculas.
O terceiro é uma lista de substantivos, em minúsculas.
Selecione aleatoriamente um nome, adjetivo opcional e substantivo e saída <Name>'s <adjective> <noun>
. No entanto, cada palavra deve começar com a mesma letra. Você pode assumir que todas as palavras começam com uma letra. Você também pode supor (mas anote na sua resposta, se o fizer):
- que todas as palavras são compostas apenas por caracteres alfabéticos
- que existe pelo menos um substantivo para cada nome
- que existe pelo menos um nome para cada substantivo
No entanto, não é possível supor que exista um adjetivo para um par específico de nome e substantivo, pois o adjetivo é opcional, portanto a saída ainda será válida.
Você não precisa selecionar a letra compartilhada de maneira uniforme, embora todas as letras disponíveis devam ter uma chance diferente de zero. Você deve, no entanto, garantir que todas as saídas para uma determinada letra tenham a maior chance possível de ocorrer dentro dos limites do gerador de números aleatórios do seu idioma. No caso do adjetivo, isso equivale a ter uma entrada extra que significa "nenhum adjetivo para esta carta", que tem a mesma chance que todos os outros adjetivos para essa carta.
Exemplos de listas de entrada:
Joan Neil Nicola Oswald Sherman Stephanie
new novel old original second silent
jeep noun novel output second sheep snake
Exemplo de saídas para essas entradas (cada linha é um exemplo separado):
Stephanie's second second
Sherman's silent snake
Oswald's original output
Nicola's novel novel
Neil's noun
Joan's jeep
Observe que não há espaço extra entre as palavras nos dois últimos exemplos.
Isso é código-golfe , então o código mais curto que não quebra brechas padrão vence!
No caso improvável de ajudar, você pode inserir tudo em maiúsculas, mas ainda precisará produzir em maiúsculas.
j
adjetivos, a chance seria de 4 em 9? Pode valer a pena colocar probabilidades em relação às saídas ou enumerar todas as saídas - como eu entendo não apenas "todas as saídas para uma determinada letra ...", mas também todas as saídas distintas devem ter a mesma probabilidade (dados distintos em cada lista).Respostas:
Geléia ,
27 2524 bytes-1 graças a Erik the Outgolfer (use um zero em vez de um caractere de espaço)
Um programa completo que aceita um argumento na forma de uma lista formatada em Python de listas de strings que imprime a saída em STDOUTt.
Experimente online!
Quão?
fonte
05AB1E ,
24 2321 bytesAssume que existe um substantivo para cada nome, conforme permitido pelo desafio.
Experimente online!
Explicação
fonte
¯ª
e€˜
são inteligentes! Eu tinha uma resposta 26 byte, mas estava tendo dificuldade para fixar o espaço duplo, quando não há um adjetivo ..¯
vez de encher com cordas vazias, que precisei limpar manualmente mais tarde.R ,
155148 bytes-7 bytes graças a Giuseppe (usando
*
parasample
)Experimente online!
Utiliza amostragem por rejeição: desenhe aleatoriamente um nome, um adjetivo (possivelmente a string vazia) e um substantivo até que as primeiras letras correspondam. Essa condição é verificada contando se o número de elementos únicos no vetor formado das primeiras letras, mais a sequência vazia, é de comprimento 2 - isso permite um adjetivo vazio.
Em seguida, imprima o resultado, com um espaço extra se o adjetivo não estiver vazio.
As diferentes possibilidades que começam com a mesma letra têm probabilidades de ocorrência iguais, uma vez que se
sample
baseiam na distribuição uniforme. A maneira mais fácil de ver isso é condicionar, no evento, que o nome e o nome comecem com a mesma letra (o que é bom: se não o fizerem, rejeitaremos). Agora, condicione o evento que aceitamos: isso significa que desenhamos o adjetivo vazio ou um adjetivo começando com a mesma letra. Cada uma dessas possibilidades ainda tem igual probabilidade.fonte
sample
baseia na distribuição uniforme. A maneira mais fácil de ver isso é condicionar, no evento, que o nome e o nome comecem com a mesma letra (o que é bom: se não o fizerem, rejeitaremos). Agora, condicione o evento que aceitamos: isso significa que desenhamos o adjetivo vazio ou um adjetivo começando com a mesma letra. Cada uma dessas possibilidades ainda tem igual probabilidade.JavaScript (ES6),
139 124 122120 bytesEconomize 2 bytes graças a @Neil
Toma entrada como
(names,adjectives)(nouns)
.Experimente online!
Ou verifique a distribuição em 5 milhões de empates
Quão?
A função auxiliarg pega uma matriz e retorna um elemento aleatório dessa matriz, com uma distribuição uniforme.
Invocandog três vezes, geramos uma sequência aleatória s com um formato válido, mas sem levar em consideração as letras iniciais. Para o adjetivo, anexamos uma entrada vazia e certifique-se de não inserir um espaço à direita, se for escolhido.
Em seguida, verificamos se todas as letras iniciais são idênticas à seguinte expressão regular:
Não, simplesmente tentamos novamente atés é válido.
fonte
+[(o=g([,...a]))&&o+' ']+
economiza 2 bytes, eu acho?Python 3 ,
161 154 151 151 147145 bytes( Obrigado ArBo, EmbodimentOfIgnorance, Neil, que contribuiu com 2, 3 e 4 bytes para o meu primeiro golfe! )
Experimente online! (com 500k execuções)
Toma três listas como entradas.
Assume pelo menos um substantivo para cada nome.
Mesma pontuação, mais golfe:
Python 3 , 145 bytes
Experimente online! (com 500k execuções)
É apenas 140 se os espaços em branco à direita forem permitidos (removendo a face quadrada
[:-1]
)fonte
while t>""<t[0]!=w
. Você também pode substituir a última linhaprint(s+"'s",t+(t and" ")+o)
, soltando au=
na terceira linha.t
uma vez para poder salvar 4 bytes incorporando o código. Eu acho que você pode mudaro
para usar um padrão de código semelhantet
e salvar outros 4 bytes, incorporando isso também.o
: eu chegar a este: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 ), mas acrescentando o espaço em branco condicional, através de uma arg opcionaly
, custa-me 11 bytesGelatina , 28 bytes
Experimente online!
Escrevi isso antes de ver a resposta mais curta de @ JonathanAllan, mas achei que valeria a pena postar, pois usa uma abordagem diferente. Salvo 3 bytes pela sugestão de @ EriktheOutgolfer nessa resposta.
Um programa completo que obtém uma lista de listas de seqüências de caracteres e imprime implicitamente uma aliteração selecionada aleatoriamente. Assume pelo menos um substantivo por nome.
fonte
C # (compilador interativo do Visual C #) , 176 bytes
Experimente online!
fonte
Vermelho , 179 bytes
Experimente online!
Explicação:
fonte
Scala ,
234226234206 bytes-28 devido ao fato de eu ter que aceitar o StdIn, agora é uma função
Experimente online!
Ungolfed:
fonte
Ruby , 94 bytes
Experimente online!
fonte
Ícone ,
167163 bytesExperimente online!
Usa o mesmo algoritmo da minha
Red
resposta.fonte