Esse desafio é inspirado em uma série de livros infantis de Fiona Watt e Rachel Wells, que eu tenho gostado recentemente com minha filha.
Em cada livro, um mouse (ilustrado, mas não parte do texto) reclama que uma sucessão de 5 coisas do mesmo tipo não é o que faz. Depois, confirma isso declarando que algum componente da coisa não tem a propriedade que espera.
Na sexta vez em que é perguntado, o mouse encontra o que procura e fica satisfeito porque possui a propriedade esperada.
Aqui está o texto de um exemplo 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.
Agora, a maioria das pessoas da programação perceberia que esse é um método muito algorítmico de produzir algum texto. Por ser um processo tão claro, poderemos reproduzir isso escrevendo algum código.
Vamos começar com três coleções de palavras:
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"]
- Primeiro, decidimos que tipo de coisa iremos descrever.
- Então, cinco vezes, geraremos a linha "Essa não é a minha coisa, a sua parte é demais.
- Finalmente, geramos a linha "Essa é a minha coisa! Sua parte é tão propriedade!
O desafio
- Gere o texto de uma história "Essa não é a minha ...".
- Ele não deve reproduzir consistentemente o mesmo texto.
- É código de golfe, então tente fazê-lo no menor número de bytes.
- Use qualquer idioma que desejar.
- O espaço em branco não importa, mas deve haver um caractere de nova linha entre as linhas.
- As listas de palavras-fonte não fazem parte da sua resposta (no TIO elas podem ser adicionadas ao cabeçalho).
- Você pode renomear as listas de palavras-fonte.
- A saída pode ser enviada para um terminal ou texto gerado em um objeto.
- Inclua um link para um intérprete online.
- Ignorar plurais ", seus chifres são" está bom.
- Não precisa fazer sentido. Se o funil da sua princesa estiver fofo demais, basta dizer.
Saída de amostra:
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 golfe!
Respostas:
05AB1E , 63 bytes
Experimente online.
Versão de 68 bytes que não gera peças nem propriedades duplicadas:
Experimente online.
Ambos os programas assumem que a lista de itens é a primeira entrada e uma lista contendo a lista de partes e a lista de propriedades é a segunda entrada.
Explicação:
Veja esta dica 05AB1E (seção Como usar o dicionário? ) Para entender por que
“€Š's€¯ ÿ!€ç ÿ€ˆ€Ê ÿ.“
é"that's my ÿ! its ÿ is so ÿ."
e“€Š's€–€¯ ÿ,€ç ÿ€ˆ…« ÿ.“
é"that's not my ÿ, its ÿ is too ÿ."
.fonte
Python 3 , 149 bytes
Experimente online!
-9 bytes graças a movatica
fonte
Carvão , 72 bytes
Experimente online! Link é a versão detalhada do código. Espera que as matrizes de coisas, peças e propriedades para estar nas variáveis
θ
,η
eζ
, o que é mais facilmente dispostas, proporcionando-lhes na entrada, em vez do cabeçalho. Explicação:Escolha uma coisa aleatória.
Imprima cinco frases negativas.
Imprima a frase positiva.
fonte
Japt v2.0a0
-R
, 73 bytesToma as três listas como
U
,V
eW
. De qualquer forma, essas são as variáveis de entrada padrão; basta colocar as três listas na seção de entrada.Tente
fonte
PowerShell , 147 bytes
Este programa principal não repetirá nenhuma parte ou propriedade em uma execução e possui uma randomização razoável.
Experimente online!
Escrever
get-random
tantas vezes custa tantos caracteres! No entanto, a menos que você esteja disposto a permitir que partes e propriedades sejam repetidas, não vejo mais como diminuir isso no PowerShell. A menos que você mova os 3 primeiros tubos de linha para o final das 3 linhas de atribuição no cabeçalho. Ter algo comoMas isso parece estar enganando, e ainda não supera a resposta de Neil.
Edit: Obrigado pelas dicas Matt, e obrigado AdmBorkBork por aprimorá-las, remover os 3 conjuntos de
get-
texto reduziu para 159 bytes e, em seguida, um pouco mais de golfe do Adm reduziu para 147. O código que eu pensava que permitia duplicatas e declarações contraditórias foram 144 caracteres após a aplicação das mesmas dicas de golfe.Experimente online!
No entanto, ele não apenas tem a tendência de dizer a mesma coisa várias vezes, mas também exige que suas entradas tenham o mesmo número de elementos. Acredito que o gerador de números pseudo-aleatórios que está sendo usado depende muito do relógio, e chamadas rápidas e repetidas para ele frequentemente podem resultar no mesmo resultado. Em seguida, ele tem a condição de que só use a lista inteira se todas as listas tiverem o mesmo comprimento. Com apenas 3 a 5 caracteres e com tantas advertências, prefiro o código no início deste post.
fonte
Get-
partirGet-Random
. É o verbo padrão testado ao avaliar comandos.Geléia , 72 bytes
Experimente online!
fonte
JavaScript, 129
entrada é três matrizes, retorna string
fonte
Ruby , 128 bytes
Experimente online!
fonte
C # ,
204203 bytesÉ a minha primeira resposta neste site, por isso espero que funcione bem. Ele também precisa dessas três coisas, mas, de acordo com a pergunta, elas não contam:
Experimente online!
Menos um byte graças a Sok.
fonte
\r
não é necessário, o que economizará 2 bytes.APL (Dyalog Unicode) , 117 bytes SBCS
Experimente online!
?N
gera um índice aleatório entre os primeiros N índices.M?N
gera M índices aleatórios (sem substituição) entre os primeiros N índices.,
é concatenaçãot←T⊃⍨
... escolhe uma coisa aleatória e chamat
para reutilização na última linha.∘,¨
concatena a string da esquerda para cada string da direita.,¨
concatena cada string à esquerda para cada string à direita.↑
altera a lista de cadeias de caracteres em uma matriz de caracteres para que ela seja impressa corretamente.fonte
Pitão ,
887876 bytesExperimente online!
O código apresentado acima requer o seguinte cabeçalho:
Há um pequeno problema ao usar o recurso 'Cabeçalho' no TIO com Pyth, pois parece que o TIO une os blocos de código nas novas linhas, e as novas linhas são significativas no Pyth. Aqui está um link para o mesmo código usando o bloco 'Header', com uma linha de lixo eletrônico na saída.
Edit: Reescreva para golf 10 bytes, versão anterior:
J+" my "ONV5%"That's not%s, its %s is too %s."[JOGOH;%"That's%s! Its %s is so %s."[JOGOH
fonte
Perl 5.10, 127 bytes
Corra com
perl -M5.010 -f filename.pl
.fonte
JavaScript ES6, 149 (+15?) Bytes
fonte
Arquivo em lote,
434424 + 7 bytesExecutado via
cmd/q/c
.Código não contado
Código contado
Vou enfrentar alguns desafios que você deve enfrentar e explicar / justificar o que fiz para que outros possam melhorar.
Escolha um elemento aleatório de uma matriz
que fiz isso gerando um número aleatório entre
1
en
onden
está a quantidade de elementos nessa matriz. Em seguida, usei esse número aleatório como o token para capturar cadafor
loop (tokens=%r%
). Porque eu fiz dessa maneira, não consegui aninhar essesfor
loops, poistokens=!r!
não estava funcionando para mim (com expansão atrasada). Isso economizaria alguns bytes, pois eliminaria a necessidade de salvar os tokens como variáveis (set x=%%x
).A geração aleatória de números
m
é minha macro de geração aleatória de números. Fazer dessa maneira economiza 32 bytes, como emset/ar=%random%%%n+1
todas as linhas. Você pode semi-trapacear e decidir esses tokensy
ez
deve ser o mesmo elemento:Isso, embora ainda retenha alguma aleatoriedade, excluiria os 6 elementos finais do
c
. Isso economizaria no mínimo 20 bytes, mas não acho que isso seja verdade para os requisitos da operação.Melhorias teóricas
Passei um bom tempo tentando fazer esse "pseudo-código" funcionar, enquanto ainda salvava bytes:
Infelizmente, a configuração para isso está demorando muitos bytes para ser lucrativa (precisa ser implementada em <144 bytes), mas não posso deixar de pensar que adicionar as últimas 4 linhas de código é supérfluo e irregular.
fonte
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
Com as listas definidas como
Experimente online!
Embora, dependendo do que conta como lista, existem outras abordagens. Se uma lista puder ser uma função que retorna aleatoriamente um item da lista, a abordagem a seguir será de apenas 91 bytes:
(com as "listas" definidas da seguinte forma)
Experimente online!
Há também a seguinte abordagem.
Experimente online!
Essa solução tem 389 bytes, mas se os literais aleatórios (que neste cenário não podem ser realmente movidos) contam como definições de lista e podem ser excluídos da contagem de bytes, isso cai para 80 bytes.
fonte
Bash + awk, 209 bytes
Experimente online!
Aceita entradas como
things parts properties
onde cada um é um arquivo com um item por linha do tipo desejado.Essa é uma abordagem centrada em arquivos. Pode tentar uma abordagem centrada na matriz posteriormente para ver se ela pode ser aprimorada.
fonte
Python 3, 130 bytes
Tomando seus requisitos literalmente e tendo retornos de carro com um byte cada:
fonte