Configura el tótem tribal para el clima solicitado

11

Hay un pueblo sioux. Tiene un tótem:

             __
         ___|  |___
   \/    \        /    \/
   /\     ``|  |``     /\
  /^^\      |  |      /^^\
 / /\ \     |  |     / /\ \
''''''''''''''''''''''''''''

El tótem permite a los sioux dominar el clima para ayudarlos en sus diferentes tareas. Ayuda a los aldeanos a decorar adecuadamente el tótem para invocar el clima adecuado. El tótem tiene varias partes:

             __
         ___|AA|___
   \/    \BBBBBBBB/    \/
   /\     ``|CC|``     /\
  /^^\      |DD|      /^^\
 / /\ \  13 |EE| 42  / /\ \
''''''''''''''''''''''''''''
  • Aes para sol () o nubes ww
  • Bes para lluvia """""""" o nieve ::::::::
  • Ces para tormenta zz
  • Des para viento ~~
  • Ees para niebla ==

Pero eso no es todo. El tótem necesita bailarines meteorológicos. Cuantos más elementos se invoquen, mayor será el número de bailarines requeridos. Si se invoca un elemento, se necesita un bailarín. Dos elementos, dos bailarines. Más allá de cuatro elementos, siempre habrá como máximo cuatro bailarines. Si no se invoca ningún elemento, no se necesitan bailarines. El tótem necesita descansar.

Los bailarines meteorológicos deben aparecer en el orden 1234. Por ejemplo, si hay dos bailarines, las máquinas tragamonedas 1y 2deben estar ocupados. Además, cada bailarín realiza una figura diferente:

  • 1 es T
  • 2 es Y
  • 3 es K
  • 4 es X

Ahora, los aldeanos expresarán sus deseos climáticos. Pronunciarán una oración que contenga los elementos climáticos que les gustaría tener. Configura el tótem y los bailarines para cumplir sus deseos.

Desafío

Escriba un programa que tome una cadena como entrada, haga coincidir los elementos de la oración ( sol , lluvia , ...) y genere la aldea completa con el tótem correctamente configurado y sus bailarines. Su programa no tiene que verificar la corrección de la cadena de entrada (por ejemplo, no contendrá sol ni nubes ). Debe coincidir con las palabras (en sentido literal):

  • La cadena de entrada X says: "I like the wind, it blows the worries away"coincide con wind , porque la coma no es parte de la palabra
  • La cadena de entrada Y says: "I hope the weather won't get too windy"no coincide con wind , porque windy y wind son dos palabras diferentes

Se garantiza que las palabras que coincidan se encuentren en la parte entre comillas de la cadena de entrada (la primera parte que designa quién está hablando nunca contendrá una palabra que pueda coincidir).

Ejemplos

The squaw says: "I want sun and wind for drying the clothes"
             __
         ___|()|___
   \/    \        /    \/
   /\     ``|  |``     /\
  /^^\      |~~|      /^^\
 / /\ \  T  |  |  Y  / /\ \
''''''''''''''''''''''''''''

The warrior thinks: "A good thunderstorm will afraid the invaders. Or a snow storm. Or an impenetrable fog. Or an oppressive sun."
             __
         ___|()|___
   \/    \::::::::/    \/
   /\     ``|zz|``     /\
  /^^\      |  |      /^^\
 / /\ \  TK |==| XY  / /\ \
''''''''''''''''''''''''''''

The papoose shouts: "I WANNA GO OUTSIDE PLAY UNDER THE SUN!"
             __
         ___|()|___
   \/    \        /    \/
   /\     ``|  |``     /\
  /^^\      |  |      /^^\
 / /\ \  T  |  |     / /\ \
''''''''''''''''''''''''''''

The wise grandma whispers: "The totem is an illusion"
             __
         ___|  |___
   \/    \        /    \/
   /\     ``|  |``     /\
  /^^\      |  |      /^^\
 / /\ \     |  |     / /\ \
''''''''''''''''''''''''''''

The shaman confides: "I perform my magic hidden in the fog, under the rain or at least under heavy clouds"
             __
         ___|ww|___
   \/    \""""""""/    \/
   /\     ``|  |``     /\
  /^^\      |  |      /^^\
 / /\ \  TK |==|  Y  / /\ \
''''''''''''''''''''''''''''

The village chief claims: "The meat of bison is better preserved in the snow, or dried under a burning sun. My Pa' used to say that heavy wind and a thunderstorm could help too, but I have no clue how. And despite everyone contradicting me, I am persuaded a good fog will do as well"
             __
         ___|()|___
   \/    \::::::::/    \/
   /\     ``|zz|``     /\
  /^^\      |~~|      /^^\
 / /\ \  TK |==| XY  / /\ \
''''''''''''''''''''''''''''

Este es el por lo que gana la respuesta más corta en bytes. Se alientan las explicaciones.

Jim
fuente
¿Podemos suponer que no obtendremos ambos suny clouds, o ambos rainy snow?
HyperNeutrino
@HyperNeutrino Esto ya está especificado en el desafío.
Jim
Ah Lo he hecho muchas veces (faltan partes del desafío). Lo sentimos: P
HyperNeutrino
lol +1 para The papoose shouts: "I WANNA GO OUTSIDE PLAY UNDER THE SUN!". También este desafío fue mucho menos doloroso y mucho más divertido de lo que pensé que sería, así que gracias por el desafío: P :)
HyperNeutrino
Echo de menos desafíos como este. No es demasiado difícil, no es demasiado FGITW, no es demasiado golfista y en realidad requiere que codifiques en lugar de encontrar un pequeño 4-byter
Uriel

Respuestas:

2

Python, 527 524 508 504 481 474 462 461 bytes

from re import*
a=r"""!!! __
!! ___|AA|___
   \/!\BBBBBBBB/!\/
   /\! ``|CC|``! /\
  /^^\!  |DD|!  /^^\
 / /\ \  02 |EE| 31  / /\ \
""";s={'sun':'A2()','clouds':'A2w','rain':'B2"','snow':'B2:','thunderstorm':'C2z','wind':'D2~','fog':'E2='};i=0
for y in[w for w in split('\W+',input().lower())if w in s]:i+=1;z=s[y];w=int(z[1]);a=sub(z[0]*w,(z[2:]*w)[:w],a)
for y in range(min(i,4)):a=sub(str(y),'TYKX'[y],a)
print(sub('!',' '*4,sub('[ABCDE0123]',' ',a))+"'"*28)

Pruébalo en línea!

Uriel
fuente
En mi último desafío, me decepcionó cómo todos usaban expresiones regulares. Pensé que con este, no tendría ninguno. Bueno, estoy un poco sorprendido ...
Jim
@Jim bueno, definitivamente no son la parte principal de la función
Uriel
Publiqué otra solución de Python que usa un algoritmo bastante diferente; si crees que sería mejor usarlo solo como un campo tuyo, eliminaré el mío como Demasiado similar al tuyo.
HyperNeutrino
@HyperNeutrino Estaba jugando golf y creo que golpeé algunas de las cosas que usaste por cierto. Por lo general, no me importan otras soluciones del mismo idioma que la mía, aunque generalmente prefiero no publicarlas
Uriel
485 bytes
HyperNeutrino
2

Python 3 , 473 464 460 bytes

import re
x=re.split('\W+',input().lower())
L='sun clouds rain snow thunderstorm wind fog'.split()
q=sum(map(x.count,L))
print(r'''!    __
!___|#|___
" \/"  \$/" \/
" /\"   ``|%%|``"  /\
  /^^\""  |&&|"" /^^\
 / /\ \  13 |''| 42 / /\ \
'''.translate({33:' '*9,34:' '*2,35:' (w )w'[(L[0]in x)+2*(L[1]in x)::3],36:' ":'[(L[2]in x)+2*(L[3]in x)]*8,37:' z'[L[4]in x],38:' ~'[L[5]in x],39:' ='[L[6]in x],49:' T'[q>0],50:' Y'[q>1],51:' K'[q>2],52:' X'[q>3]})+"'"*28)

Pruébalo en línea!

-9 bytes
-4 bytes gracias a ovs

Hiperneutrino
fuente
No veo por qué lo necesitarías s. Simplemente combine sus dos últimas líneas print(r...28)para 460 bytes.
ovs
@ovs whoops se olvidó de eso. ¡Gracias!
HyperNeutrino
1

JavaScript (ES6), 417 bytes

(s,i=x=>s.toLowerCase()[q](/\W+/).includes(x[0]),g=x=>y=>i(x)?y[0]:(j--,"  "),j=4,t="||   \\/|   /\\|  /^^\\| / /\\ \\"[q="split"]`|`.map(x=>x[p="padEnd"](9)))=>`    __    n___|${i`sun`?"()":g`clouds``ww`}|___n${"\\"[p](9,i`rain`?'"':g`snow``:`)}/n \`\`|${g`thunderstorm``zz`}|\`\` n   |${g`wind``~~`}|   n02 |${g`fog``==`}| 31`.replace(/\d/g,m=>m>j?" ":"TYKX"[m])[q]`n`.map((v,k)=>t[k]+v+t[k]).join`
`+`
`[p](28,"'")

La idea aquí era generar el tótem primero, luego agregar los tikis reflejados a ambos lados.

Incluye dos funciones auxiliares: ique comprueba si una cadena es una de las palabras en la entrada; y g, que hace iy devuelve la cadena dada o " ". gTambién cuenta cuántos elementos faltan para ser utilizados por los bailarines en la parte inferior.

Fragmento de prueba

let f=
(s,i=x=>s.toLowerCase()[q](/\W+/).includes(x[0]),g=x=>y=>i(x)?y[0]:(j--,"  "),j=4,t="||   \\/|   /\\|  /^^\\| / /\\ \\"[q="split"]`|`.map(x=>x[p="padEnd"](9)))=>`    __    n___|${i`sun`?"()":g`clouds``ww`}|___n${"\\"[p](9,i`rain`?'"':g`snow``:`)}/n \`\`|${g`thunderstorm``zz`}|\`\` n   |${g`wind``~~`}|   n02 |${g`fog``==`}| 31`.replace(/\d/g,m=>m>j?" ":"TYKX"[m])[q]`n`.map((v,k)=>t[k]+v+t[k]).join`
`+`
`[p](28,"'")

let tests = [`The squaw says: "I want sun and wind for drying the clothes"`,`The warrior thinks: "A good thunderstorm will afraid the invaders. Or a snow storm. Or an impenetrable fog. Or an oppressive sun."`,`The papoose shouts: "I WANNA GO OUTSIDE PLAY UNDER THE SUN!"`,`The wise grandma whispers: "The totem is an illusion"`,`The shaman confides: "I perform my magic hidden in the fog, under the rain or at least under heavy clouds"`,`The village chief claims: "The meat of bison is better preserved in the snow, or dried under a burning sun. My Pa' used to say that heavy wind and a thunderstorm could help too, but I have no clue how. And despite everyone contradicting me, I am persuaded a good fog will do as well"`];I.innerHTML+=tests.map(t=>"<option>"+t).join``
<select id=I oninput="O.innerHTML=(idx=I.selectedIndex)?(t=tests[idx-1])+'\n\n'+f(t):''" style="width:90vw"><option>---Tests---</select>
<pre id=O></pre>

Justin Mariner
fuente