Qual é o zodíaco atual?

15

Exiba o emoji do zodíaco oriental de um determinado momento, de acordo com o país.

O zodíaco oriental é um esquema de classificação que atribui um animal e seus atributos de renome a cada ano em um ciclo repetido de 12 anos. Também é atribuído a horas.

Regras:

  1. O país deve ter o código ISO 3166-1 alfa-3. A lista está aqui.

  2. O formato de entrada deve ser assim: <ISO code> HH:MM. A entrada deve ser uma única sequência. Qualquer entrada que não se encaixe nesse formato se enquadra na situação não se importa .

  3. Se o tempo determinado estiver no limite do gráfico abaixo, você poderá gerar um ou outro zodíaco.

  4. Como este é um código de golfe, o código mais curto em bytes vence.

Os zodiacs:

Os zodiacs sem país especificado são padrões.

  • O primeiro zodíaco (23:00 - 01:00):

    • Rato 🐀 (U + 1F400)
    • Mouse 🐁 (U + 1F401) na Pérsia (IRN)
  • O segundo zodíaco (01:00 - 03:00):

    • Boi 🐂 (U + 1F402)
    • Búfalo de água 🐃 (U + 1F403) no Vietnã (VNM)
    • Vaca 🐄 (U + 1F404) na Pérsia
  • O terceiro zodíaco (03:00 - 05:00):

    • Tigre 🐅 (U + 1F405)
    • Leopardo 🐆 (U + 1F406) na Pérsia
  • O quarto zodíaco (05:00 - 07:00):

    • Coelho 🐇 (U + 1F407)
    • Cat 🐈 (U + 1F408) no Vietnã
  • O quinto zodíaco (07:00 - 09:00):

    • Dragão 🐉 (U + 1F409)
    • Crocodilo 🐊 (U + 1F40A) / Baleia 🐋 (U + 1F40B) na Pérsia (você também pode produzir)
    • Caracol 🐌 (U + 1F40C) no Cazaquistão (KAZ)
  • O sexto zodíaco (09:00 - 11:00):

    • Cobra 🐍 (U + 1F40D)
  • O sétimo zodíaco (11:00 - 13:00):

    • Cavalo 🐎 (U + 1F40E)
  • O oitavo zodíaco (13:00 - 15:00):

    • Ram 🐏 (U + 1F40F)
    • Cabra 🐐 (U + 1F410) no Vietnã
    • Ovinos 🐑 (U + 1F411) na Pérsia
  • O nono zodíaco (15:00 - 17:00):

    • Macaco 🐒 (U + 1F412)
  • O décimo zodíaco (17:00 - 19:00):

    • Galo 🐓 (U + 1F413)
    • Frango 🐔 (U + 1F414) na Pérsia
  • O décimo primeiro zodíaco (19:00 - 21:00):

    • Cão 🐕 (U + 1F415)
  • O décimo segundo zodíaco (21:00 - 23:00):

    • Porco 🐖 (U + 1F416)
    • Javali 🐗 (U + 1F417) no Japão (JPN)
    • Elefante 🐘 (U + 1F418) na Tailândia (THA)

Os pontos de código são daqui.

Exemplo:

Dada a seguinte entrada:

KOR 19:42

A saída deve ser:

🐕
Dannyu NDos
fonte
Interessante - eu sabia que essas pedalavam a cada 12 anos. Eu nunca ouvi falar do ciclo de 24 horas. Ainda assim, o desafio está claramente especificado como está. "Corrigir" para 12 anos pode causar confusão.
Level River St
O que há com a Pérsia tendo tantas versões diferentes? Alguma razão específica?
caird coinheringaahing
@cairdcoinheringaahing Não sou iraniano, então não sei.
Dannyu NDos
1
@cairdcoinheringaahing, um antigo poeta e escritor persa chamado "Abou Nasr Farahi" ou em persa "ابونصر_فراهی", tem um poema curto em um de seus livros, que nomeia os animais nessa ordem e, portanto, são os animais usados ​​no Irã para todos esses 12 anos. Ele não é um poeta muito famoso; portanto, não há muitos recursos em inglês sobre ele, mas verifiquei o texto de seu livro em persa e o poeta estava lá.
night2
Relacionado .
agtoever

Respostas:

8

05AB1E , 66 64 63 bytes

þт÷;ò12%ЕkÄ$ó·;@è₂Èαвλã…7q¼#∍o•5в6ä.•xиʒaàÒ¾Äλ•u3ôIákèsèžy₄*Oç

Experimente online!

Grimmy
fonte
11

JavaScript (ES6),  168 165 160 157  155 bytes

Guardado 4 bytes graças a @Neil

Retorna o crocodilo para o zodíaco na Pérsia.

([a,b,c,,d,e])=>String.fromCodePoint(127998-~'00111321211'[k=-~(d+e)%24>>1]+k*2-~(1e12+{IRN:121010020100,VNM:1010001e4,KAZ:3e7,JPN:1,THA:2}[a+b+c]+a)[k+1])

Experimente online!

Quão?

kh

k=((h+1)mod24)/2

xkbk

bk=2k+xk

128000+bk+ckck

Isso está resumido na tabela a seguir:

   k =  |   0 |   1 |   2 |   3 |   4 |   5 |   6 |   7 |   8 |   9 |  10 |  11
--------+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----
  b(k)  |  +0 |  +2 |  +5 |  +7 |  +9 | +13 | +14 | +15 | +18 | +19 | +21 | +22
  = 2k  |   0 |   2 |   4 |   6 |   8 |  10 |  12 |  14 |  16 |  18 |  20 |  22
  +x(k) |   0 |   0 |   1 |   1 |   1 |   3 |   2 |   1 |   2 |   1 |   1 |   0
--------+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----
   IRN  |  +1 |  +2 |  +1 |     |  +1 |     |     |  +2 |     |  +1 |     |
   VNM  |     |  +1 |     |  +1 |     |     |     |  +1 |     |     |     |
   KAZ  |     |     |     |     |  +3 |     |     |     |     |     |     |
   JPN  |     |     |     |     |     |     |     |     |     |     |     |  +1
   THA  |     |     |     |     |     |     |     |     |     |     |     |  +2

Comentado

( [ a, b, c,               // a,b,c = country code
    ,                      // the space is ignored
    d, e ] ) =>            // d,e = hour (minutes are ignored)
  String.fromCodePoint(    // return the character whose code point is:
    127998                 //   127998
    -~'00111321211'[       //   + 1 + x(k)
      k = -~(d + e)        //   where k is defined as:
          % 24 >> 1        //     floor(((hour + 1) mod 24) / 2)
    ] +                    //
    k * 2                  //   + 2k
    -~(                    //   + 1 + the country offset
      1e12 +               //     each pattern being encoded as 10**12
      {                    //     + a specific value, leading to:
        IRN: 121010020100, //       IRN -> 1121010020100
        VNM: 1010001e4,    //       VNM -> 1010100010000
        KAZ: 3e7,          //       KAZ -> 1000030000000
        JPN: 1,            //       JPN -> 1000000000001
        THA: 2             //       THA -> 1000000000002
      }[a + b + c]         //     according to the country code
      + a                  //     coerced to a string
    )[k + 1]               //   extract the correct offset for this zodiac
  )                        //   (gives something NaN-ish for the other countries)
Arnauld
fonte
1
String.fromCodePoint(128e3+~~salva 4 bytes.
Neil
@ Neil Thanks! :)
Arnauld
5

PHP , 185 caracteres, 263 bytes

Obrigado ao Dannyu NDos pela correção de bugs.

fn($i)=>strlen($b=[[🐀,🐁],[🐂,🐄,🐃],[🐅,🐆],[🐇,🐇,🐈],[🐉,🐊,🐉,🐌],🐍,🐎,[🐏,🐑,🐐],🐒,[🐓,🐔],🐕,[🐖,4=>🐗,5=>🐘]][(($t=$i[4].$i[5])%2?$t+1:$t)%24/2])?$b:$b[strpos(____IRN_VNM_KAZ_JPN_THA,substr($i,0,3))/4]

Experimente online!

Apenas um mapeamento de matriz simples, deve haver maneiras melhores de jogar isso. A parte da hora do tempo de entrada é convertida em um número par (0-22) e, em seguida, é dividida por 2 para obter o índice de matriz de 0 a 11 no mapeamento. Os períodos de tempo com casos especiais são uma sub-matriz com o índice 0 mapeado para o sinal padrão e 1-5 mapeado para o sinal especial para IRN, VNM, KAZ, JPN e THA na mesma ordem.

Night2
fonte
4

Carvão , 73 bytes

℅⁺×¹²⁸φΣE⮌…⪪”&↖∨∧h↘X⁷↘H⪫³Jºρ⁷s,⟲⌈3A‖Cc>χ§₂25:×” ⊕﹪÷⊕I…粦²¦¹²⊕⎇κ÷Lι³⌕⪪ι³θ

Experimente online! Link é a versão detalhada do código. Explicação:

℅⁺×¹²⁸φ

0x1F400= 128.000 ( φé predefinido para 1.000). Isso é adicionado à soma do restante da expressão e convertido em um caractere para impressão implícita.

⊕﹪÷⊕I…粦²¦¹²

A hora é extraída e convertida em um índice do zodíaco.

…⪪”&↖∨∧h↘X⁷↘H⪫³Jºρ⁷s,⟲⌈3A‖Cc>χ§₂25:×” ...

A cadeia compactada IRN VNMIRN IRN VNM IRNIRNKAZ VNMIRN IRN JPNTHAé dividida em espaços e truncada para o comprimento fornecido por esse índice.

ΣE⮌...

A matriz é então invertida, mapeada e somada.

⊕⎇κ÷Lι³⌕⪪ι³θ

Para o primeiro elemento, a sequência é dividida em grupos de três caracteres e o índice do país é obtido, caso contrário, o número de países é contado. Para o primeiro elemento, o índice precisa ser convertido da indexação 0 para a indexação 1, enquanto para os outros elementos o resultado precisa ser incrementado para o país padrão, portanto, isso é feito fora do ternário.

Neil
fonte
3

Python 3 , 168 bytes

lambda s,a='BA EDC GF HIH KJMJ N O RQP S UT V WWWXYW'.split():chr(ord(a[(int(s[4:6])+1)//2][min('IRNVNMKAZJPNTHA'.find(s[:3])//3,len(a[(int(s[4:6])+1)//2])-1)])+127935)

Experimente online!

Matthew Jensen
fonte
2
147 bytes se você não se importa de mudar para o Python 3.8.
Arnauld