Напишите программу, которая принимает в качестве входных данных дату рождения (месяц и день месяца) и выводит соответствующий знак, элемент и качество западного зодиака . Для целей этой задачи они определены точно так же, как в таблице на связанной странице википедии:
Sign Date Range Element Quality
Aries March 21 to April 19 Fire Cardinal
Taurus April 20 to May 20 Earth Fixed
Gemini May 21 to June 21 Air Mutable
Cancer June 22 to July 22 Water Cardinal
Leo July 23 to August 22 Fire Fixed
Virgo August 23 to September 22 Earth Mutable
Libra September 23 to October 23 Air Cardinal
Scorpio October 24 to November 20 Water Fixed
Sagittarius November 21 to December 22 Fire Mutable
Capricorn December 23 to January 20 Earth Cardinal
Aquarius January 21 to February 21 Air Fixed
Pisces February 22 to March 20 Water Mutable
правила
- Знак, элемент и качество будут рассчитываться по дате ввода точно в соответствии с таблицей википедии.
- Я даю некоторую свободу над входным форматом даты (см. Раздел « Ввод » ниже). Вы должны четко указать в своем ответе, какой формат вы используете.
- Если указана недопустимая дата (непарсируемая дата или месяц или день месяца вне диапазона), программа завершит работу с сообщением
Invalid date
. - Программа должна правильно обрабатывать високосные годы. то есть, если 29-е февраля является входом, то выход должен быть правильно
Pisces, Water, Mutable
. - Библиотеки / API-интерфейсы Date вашего языка разрешены, но любые API-интерфейсы, которые специально рассчитывают знаки зодиака, запрещены.
- Стандартные «лазейки», которые больше не смешны
- Это код-гольф , поэтому выигрывает самый короткий ответ в байтах.
вход
- Программа может считывать введенную дату из STDIN, командной строки, переменных среды или любого другого метода, удобного для вашего языка.
- Это в первую очередь не упражнение при разборе даты-строки, поэтому входная строка может быть предоставлена в любом формате, который вы выберете, при условии, что она состоит только из компонентов месяца и дня месяца, а не других значений (таких как год или время) , Например,
Jul 24
или,24th of July
или,7/24
или24/07
любой другой удобный формат. Если введен ввод, не соответствующий выбранному вами формату ввода, тоInvalid date
должна быть выдана ошибка.
Выход
- Программа выведет на STDOUT, диалоговое окно или любой другой способ отображения, подходящий для вашего языка.
- Выходным форматом будет знак, элемент и качество, разделенные запятой и пробелом:
Sign, Element, Quality
Примеры
Input Output
1/1 Capricorn, Earth, Cardinal
2/29 Pisces, Water, Mutable
7/24 Leo, Fire, Fixed
13/1 Invalid date
2/31 Invalid date
-1/-1 Invalid date
1st of Golfember Invalid date
code-golf
kolmogorov-complexity
date
Цифровая травма
источник
источник
Jan 21 -> 21
,Feb 5 -> 36
) допустимым форматом ввода?Ответы:
JavaScript, 285 байт
(Мой первый ответ здесь, после того, как я прятался здесь некоторое время)
Первый
prompt()
- это месяц в числовой форме, а второйprompt()
- день месяца (игнорируйте текст приглашения). Ведущие нули необязательны для обоих. Выход отображается с помощьюalert()
. (Спасибо bitpwner, Snack, edc65 и core1024 за помощь в сокращении кода.)Попробуйте это выше, используя фрагменты стека или на http://jsfiddle.net/8vq89/5/ .
Добавлен код с пробелами и комментариями для объяснения запутанных частей:
источник
'Cardinal0Fixed0Mutable'.split(0)
и'Earth0Air0Water0Fire'.split(0)
,['Cardinal','Fixed','Mutable']
и['Earth','Air','Water','Fire']
немного короче.z='Air9Water9Fire9Earth9Fixed9Mutable9Cardinal9Aquarius9Pisces9Aries9Taurus9Gemini9Cancer9Leo9Virgo9Libra9Scorpio9Sagittarius9Capricorn'.split(9); [m,d]=prompt().split(/\D/); alert([m-->0&m<12&d>0&d<(32-'020101001010'[m])?z[(m+=(18-~'121012333413'[m]<d)+11)%12+7]+', '+z[m%4]+', '+z[m%3+4]:'Invalid date'])
. Взгляните на один сплитInvalid left-hand side in assignment
об ошибке, когда пытаюсь его запустить, возможно, из-за приглашенияp=prompt().split(/\D/),m=p[0],d=p[1]
должно работать (но так дольше)'...ScorpioSagittarius'.match(/[A-Z][a-z]+/g)
вместо'...Scorpio0Sagittarius'.split(0)
С 353
352Редактировать Исправлена ошибка и опечатка, 1 символ больше
Прежде чем спросить: да, даже без #include действует и работающий стандарт Си.
Формат ввода: два числа, первый месяц, затем день.
Тестовое задание
источник
Ivalid
;-)Perl 287 (286 + 1 за
-p
флаг)Вход от STDIN, а выход идет на STDOUT. Вот тесты от OP:
источник
Python,
447387 символовПринимает ввод как MM / DD, всегда должно быть две цифры.
источник
[20,21,20,19,20,21,22,22,22,23,20,22][a%12]
->19+int('121012333413'[a%12])
и[32,30,32,31,32,31,32,32,31,32,31,32][a]
->30+int('202121221212'[a])
Javascript,
403396 байтДругой подход. Я думаю, что я могу играть в гольф больше, но позже.
Введите месяц в первом приглашении, дату во втором приглашении.
источник
PHP - 294 байта (без тегов php *)
* Как и другие записи PHP
Ввод: в
Month Day
виде целых чисел, ведущий ноль не требуется.Пример:
php starsign.php <<< "2 29"
на 29 февраля.Гольф (не копируйте это напрямую, см. Ниже):
Hexdump файла php:
Чтобы сгенерировать гольф-файл, запустите следующий скрипт php (генерирует в
starsign.php
):Совершенно негольфированная версия:
источник
short_open_tag = On
чтобы это работало. Работает для этого ответа, но другой ответ PHP все еще с ошибками. +1 за это.Python 3 - 332 байта
Принимает ввод как отдельные аргументы (то есть
1 1
)Один сплит для всех строк
Индексирование байтов в py3 дает заказ
or E
это дешевый способ создания исключения (NameError
)Есть ли более дешевый способ объединения строк?
+
и литералы оказались меньше чемjoin
.Нет никаких веских причин для того, чтобы поиск в одном байте начинался с 1, а с другого - с 0, я просто забыл 29-дневный февраль и изменил 0-> 1 вместо того, чтобы повторить все это.
источник
PHP
548524502419 (без тегов php)Требуется PHP> = 5.4.0
Ввод:
Day Month
(числовое значение, начинающееся с 1), например,2 3
для 2 марта.EDIT:
A non well formed numeric value
уведомление вызвано выполнение Преинкремента на струне$m
. Независимо от уведомления, следующий вывод все еще должен быть правильным. Это уведомление зависит от версииPHP
. Чтобы исправить это, простая строка в целочисленное преобразование должна быть помещена перед второй последней строкой. Я обновил код с преобразованиями.Пример ввода / вывода (в Windows):
источник
echo 2 3 | php -f zod.php
, но он просто перекликается с самим сценарием в STDOUT<?php
вместо<?
.PHP Notice: A non well formed numeric value encountered in /home/ubuntu/zod.php on line 6
. Я использую php 5.5.9 на Ubuntu 14.04