Какой текущий зодиак?

15

Показать эмодзи восточного зодиака данного времени, в соответствии с данной страной.

Восточный зодиак - это схема классификации, которая присваивает животному и его предполагаемым атрибутам каждый год в повторяющемся 12-летнем цикле. Это также назначено на часы.

Правила:

  1. Страна должна указываться в виде кода ISO 3166-1 alpha-3. Список здесь.

  2. Формат входного сигнала должен быть таким: <ISO code> HH:MM. Ввод должен быть одной строкой. Любой ввод, который не соответствует этому формату, попадает в безразличную ситуацию.

  3. Если данное время лежит в границах приведенной ниже таблицы, вы можете вывести любой знак зодиака.

  4. Поскольку это кодовый гольф, выигрывает самый короткий код в байтах.

Зодиаки:

Зодиаки без указанной страны являются значениями по умолчанию.

  • Первый зодиак (23:00 - 01:00):

    • Крыса 🐀 (U + 1F400)
    • Мышь 🐁 (U + 1F401) в Персии (IRN)
  • Второй зодиак (01:00 - 03:00):

    • Ох 🐂 (U + 1F402)
    • Water Buffalo 🐃 (U + 1F403) во Вьетнаме (VNM)
    • Корова 🐄 (U + 1F404) в Персии
  • Третий зодиак (03:00 - 05:00):

    • Тигр 🐅 (U + 1F405)
    • Леопард 🐆 (U + 1F406) в Персии
  • Четвертый зодиак (05:00 - 07:00):

    • Кролик 🐇 (U + 1F407)
    • Кот 🐈 (U + 1F408) во Вьетнаме
  • Пятый зодиак (07:00 - 09:00):

    • Дракон 🐉 (U + 1F409)
    • Крокодил 🐊 (U + 1F40A) / Кит 🐋 (U + 1F40B) в Персии (вы можете вывести либо)
    • Улитка 🐌 (U + 1F40C) в Казахстане (КАЗ)
  • Шестой зодиак (09:00 - 11:00):

    • Змея 🐍 (U + 1F40D)
  • Седьмой зодиак (11:00 - 13:00):

    • Лошадь 🐎 (U + 1F40E)
  • Восьмой зодиак (13:00 - 15:00):

    • Ram 🐏 (U + 1F40F)
    • Коза 🐐 (U + 1F410) во Вьетнаме
    • Овца 🐑 (U + 1F411) в Персии
  • Девятый зодиак (15:00 - 17:00):

    • Обезьяна 🐒 (U + 1F412)
  • Десятый зодиак (17:00 - 19:00):

    • Петух 🐓 (U + 1F413)
    • Цыпленок 🐔 (U + 1F414) в Персии
  • Одиннадцатый зодиак (19:00 - 21:00):

    • Собака 🐕 (U + 1F415)
  • Двенадцатый зодиак (21:00 - 23:00):

    • Свинья 🐖 (U + 1F416)
    • Кабан 🐗 (U + 1F417) в Японии (JPN)
    • Слон 🐘 (U + 1F418) в Таиланде (THA)

Кодовые точки отсюда.

Пример:

Учитывая следующий вход:

KOR 19:42

Выход должен быть:

🐕
Dannyu NDos
источник
Интересно - я знал, что такие ездят каждые 12 лет. Я никогда не слышал о 24-часовом цикле. Тем не менее, задача четко определена в нынешнем виде. «Исправление» его до 12 лет может привести к путанице.
Уровень Река St
Что случилось с Персией, имеющей так много разных версий? Какие-то конкретные причины?
Caird Coneheringaahing
@cairdcoinheringaahing Я не иранец, так что я не знаю.
Dannyu NDos
1
У @cairdcoinheringaahing старого персидского поэта и автора словаря по имени «Абу Наср Фарахи» или на персидском «ابونصر_فراهی» есть короткое стихотворение в одной из его книг, в котором названы эти животные в указанном порядке и, таким образом, они являются животными, использованными в Иране для каждый из этих 12 лет. Он не был очень известным поэтом, поэтому о нем можно найти не много английских ресурсов, но я проверил текст его книги на персидском языке, и поэт был там.
Night2

Ответы:

11

JavaScript (ES6),  168 165 160 157  155 байтов

Сохранено 4 байта благодаря @Neil

Возвращает крокодила за 5- й зодиак в Персии.

([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])

Попробуйте онлайн!

Как?

Кчас

Кзнак равно((час+1)модификация24)/2

ИксКбК

бКзнак равно2К+ИксК

128000+бК+сКсК

Это обобщено в следующей таблице:

   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

комментарии

( [ 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
источник
1
String.fromCodePoint(128e3+~~экономит 4 байта.
Нил
@Neil Спасибо! :)
Арно
5

PHP , 185 символов, 263 байта

Спасибо Dannyu NDos за исправление ошибки.

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]

Попробуйте онлайн!

Просто простое отображение массива, должны быть лучшие способы игры в гольф. Часовая часть времени ввода преобразуется в четное число (0-22), а затем делится на 2, чтобы получить индекс массива от 0 до 11 в отображении. Периоды времени с особыми случаями представляют собой подмассив с индексом 0, сопоставленным со знаком по умолчанию, и 1-5, сопоставленным со специальным знаком для IRN, VNM, KAZ, JPN и THA в том же порядке.

night2
источник
4

Древесный уголь , 73 байта

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

Попробуйте онлайн! Ссылка на подробную версию кода. Explantion:

℅⁺×¹²⁸φ

0x1F400= 128 000 ( φпредопределено до 1000). Это добавляется к сумме остальной части выражения и преобразуется в символ для неявной печати.

⊕﹪÷⊕I…粦²¦¹²

Час извлекается и преобразуется в зодиакальный индекс.

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

Сжатая строка IRN VNMIRN IRN VNM IRNIRNKAZ VNMIRN IRN JPNTHAразбивается на пробелы и усекается до длины, заданной этим индексом.

ΣE⮌...

Затем массив переворачивается, отображается и суммируется.

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

Для первого элемента строка разбивается на группы по три символа и берется индекс страны, в противном случае подсчитывается количество стран. Для первого элемента индекс необходимо преобразовать из 0-индексации в 1-индексирование, в то время как для других элементов результат должен быть увеличен для страны по умолчанию, так что это делается за пределами троичной системы.

Нил
источник
3

Python 3 , 168 байт

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)

Попробуйте онлайн!

Мэтью Дженсен
источник
2
147 байт, если вы не против перейти на Python 3.8.
Арно