Напишите свою собственную записку о смерти

14

Кира нуждается в вашей помощи!


Формат ввода:

Date [and/or Time]
Name
Gender
Reason

Выходной формат:

<Last Name, First Name> <will die/died> on the <DD><st/nd/rd/th> of <MMM, YYYY> [at <hh:mm:ss TT>].
<He/She> <will die/died> of <Reason>.


Детали, Детали:


Ваша программа должна учитывать как минимум следующие форматы ввода даты:

9 November 2003
9/11/2003
November 9, 2003

Форматы времени:

hh tt
hh TT
hh:mm tt
hh:mm TT
hh:mm:ss tt
hh:mm:ss TT
HH
HH:mm
HH:mm:ss

Следующие форматы ввода имени:

first        // Stephen
last         // Harper
first last   // Stephen Harper
last, first  // Harper, Stephen


Тестовые случаи:


Входные данные:

2 September 1973
J.R.R. Tolkien
Male
pneumonia

Выход:

Толкин, JRR умер 2 сентября 1973 года.

Он умер от пневмонии.


ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Если он на самом деле умирает в эту дату, это вина Киры , а не моя.

ОБНОВЛЕНИЕ: Стивен Харпер не умер в указанную дату

Входные данные:

21/12/12 23:59:59             // DD/MM/YY HH:mm:ss
Harper, Stephen               // Last, First
Unknown                       // Gender
a heart attack for no reason  // Reason

Выход:

Харпер, Стивен умрет 21 декабря 2012 года в 23:59:59.

Харпер, Стивен умрет от сердечного приступа без причины.



Бонус:

July 21, 1969 02:56:15 GMT
Armstrong, Neil
Male
poisoned moon cheese

--

January 19, 2038 03:14:08 GMT
Everyone
Unknown
Y2K38

Добавьте <st/nd/rd/th>в конце DDдля ввода.

Матин Улхак
источник
Ахаха, я только что закончил читать эту серию: D Разве это не должен быть «сердечный приступ» без причины?
Ry-
Гм, 2 сентября является 2/9/11, не 2/7/11;)
Рыбаковым
Пол не влияет на результат?
Питер Олсон
Кроме того, мы должны принять даты до 1970 года?
Питер Олсон
5
Как мы различаем ввод с ДД / ММ / ГГГГ и ММ / ДД / ГГГГ?
Питер Олсон

Ответы:

6

Javascript (561)

Это, вероятно, может быть значительно уменьшено, но здесь идет:

i=i.split("\n");d=new Date(i[0]);t=d.getDate();z=t%10;t+=z==1?"st":z==2?"nd":z==3?"rd":"th";m=['January','February','March','April','May','June','July','August','September','October','November','December'][d.getMonth()];y=d.getFullYear();a=d.getHours();b=d.getMinutes();c=d.getSeconds();l=a&&b&&c?" at "+a+":"+b+":"+c:"";g=d>new Date()?"will die":"died";n=i[1].split(" ");n[1]?n[0][n[0].length-1]==","?n=i[1]:n=n[1]+", "+n[0]:n[0];s=i[2]=="Male"?"He":i[2]=="Female"?"She":n;document.write(n+" "+g+" on the "+t+" of "+m+", "+y+l+".<br>"+s+" "+g+" of "+i[3]+".");

Пример ввода / вывода:

2 September 1973
J.R.R. Tolkien
Male
pneumonia

Толкин, JRR, умер 2 сентября 1973 года. Он умер от пневмонии.

January 19, 2038 03:14:08 GMT
Everyone
Unknown
Y2K38

Все умрут 18 января 2038 года в 21: 14: 8. Все умрут от Y2K38.

Попробуйте это на JsFiddle .

Питер Олсон
источник
Просто хочу указать, что i="9 November 2003 03:14:08 GMT\nDouglas Adams\nMale\nI forgot";дает мне 8th of November.
Матин Улхак,
4
@muntoo Это потому, что он подстраивается под ваш часовой пояс. Если вы живете в часовом поясе GMT, он должен дать вам 9-е место.
Питер Олсон
Я буду винить тебя, если умру в день рождения. : P
nyuszika7h
5

VB.NET, 727 695

Хорошо, немного поиграл в гольф. Требуется Option Strict Off.

Module M
Sub Main
Dim d=Date.Parse(Console.ReadLine),n=Console.ReadLine,o=Date.Now,g=Console.ReadLine,r=Console.ReadLine,i=n.IndexOf(" "),f=d.Day Mod 10+(d.Day\10=1)*5,a=Array.IndexOf("male|female|he|she|him|her|guy|girl|boy|lady|man|woman".Split("|"), g.ToLower),b="|st|nd|rd".Split("|"),m="|January|February|March|April|May|June|July|August|September|October|November|December".Split("|")
If n.IndexOf(",")<0 Then n=n.Substring(i+1)&", "&n.Substring(0,i)
g=If(a<0,n,If(a Mod 2,"She","He"))
Console.Write("{0} {11} on the {1}{2} of {3}, {4} at {5}:{6:00}:{7:00}.{8}{9} {11} of {10}.",n,d.Day,If(f<4,b(f),"th"),m(d.Month),d.Year,d.Hour,d.Minute,d.Second,vbCrLf,g,r,If(o<d,"will die","died"))
End Sub
End Module

Он принимает даты во всех тестовых случаях и во многих других форматах благодаря Date.Parse. Он также принимает много полов (как вы можете видеть). Если Кира решит ввести только имя или фамилию человека, программа завершится сбоем.

Рыбаковым
источник
Похоже, вы можете отбросить несколько байтов, заменив аргумент split на MonthName(d.Month)вызов
Тейлор Скотт
2

CSharp - 463 символа

void Main(){Func<String>c=()=>Console.ReadLine();var d=DateTime.Parse(c());var n=c();if(!n.Contains(",")&&n.Contains(" "))n=n.Split(' ')[1]+", "+n.Split(' ')[0];n+=" ";var g=c().ToLower();g=g.Contains("male")?g.Replace("female","She").Replace("male","He"):"They";var r=c();var f=(DateTime.Now<d);Console.Write(String.Format(n+"{0} on the {1} {2}\n{3} {0} of {4}",(f?"will die":"died"),d.ToString("dddd 'of' MMMM, yyyy"),d.Date==d?"":d.ToString("hh:mm:ss"),g,r));}
обкрадывать
источник
1

PHP, 509 474 462 461 символов

<?for($l=0;$l<4;)$i[$l++]=chop(fgets(STDIN));
putenv('TZ=GMT');
$t=strtotime(preg_match("/(\d+)\/(\d+)\/(\d+)(.*)/",$i[0],$q)?"$q[1]-$q[2]-".($q[3]<100?19+1*($q[3]<70):"").$q[3].$q[4]:$i[0]);
$z=$t<time()?" died":" will die";
$f="jS \of F, Y".($t%86400?" \a\\t g:i:s A":"");
$n=strpos($i[1],',')?$i[1]:explode(" ",$i[1]);
if(is_array($n))$n=$n[1]!=""?$n[1].", ".$n[0]:$n[0];?>
<?=$n."$z on the ".date($f,$t)."\n\n".($i[2][0]==M?He:($i[2][0]==F?She:$n))."$z of ".$i[3];

Я добавил новые строки после каждого, ;но не посчитал их, поскольку они не должны быть там.
Будет ли код обрабатывать даты после 19 января 2038 03:14:07, зависит от того, будет ли он работать на 64-битной машине.

Gareth
источник
1

VBA, 384 366 байт

Golfed

Полный sub подпрограмма, которая принимает входные данные ожидаемого типа Variant\Stringи выводит связанное сообщение deathnote в окно немедленных сообщений VBE

Примечание: VBA неспособен обрабатывать часовые пояса без объявления функций Windows API, так как они не нужны для вопроса, они были исключены

Sub x(d,n,g,r)
e=CDate(d)
f=Day(e) Mod 10
w=IIf(e>Now," will die"," died")
i=InStr(1,n," ")
n=IIf(InStr(1,n,","),n,Mid(n,i+1)&", "&Mid(n,1,i-1))
g=LCase(g)
Debug.?n;w" on the "Day(e)Split("th|st|nd|rd","|")(IIf(f>3,0,f))" of "MonthName(Month(e))", "Year(e)IIf(InStr(1,d,":")," at "&TimeValue(d),"")"."vbCr;IIf(g="male","He",IIf(g="female","She",n))w" of "r".
End Sub

Бонус Верисон, 394 376 байт

Слегка измененная версия выше, которая обрабатывает все бонусные случаи, за исключением часовых поясов (Исправление для обработки мононимов)

Sub x(d,n,g,r)
e=CDate(d)
f=Day(e) Mod 10
i=InStr(1,n," ")
w=Space(0 ^i)&IIf(e>Now,"will die","died")
n=IIf(InStr(1,n,",")^i,n,Mid(n,i+1)&", "&Mid(n,1,i))
g=LCase(g)
Debug.?n;w" on the "Day(e)Split("th|st|nd|rd","|")(IIf(f>3,0,f))" of "MonthName(Month(e))", "Year(e)IIf(InStr(1,d,":")," at "&TimeValue(d),"")"."vbCr;IIf(g="male","He",IIf(g="female","She",n))w" of "r".
End Sub

использование

последовательность ввода и вывода примеров задач, как видно из непосредственного окна VBE

?Now
01-Jun-17 1:59:35 PM

x "2 September 1973", "J.R.R. Tolkien", "Male", "pneumonia"
Tolkien, J.R.R. died on the 2nd of September, 1973.
He died of pneumonia.

x "21/12/12 23:59:59", "Harper, Stephen", "Unknown", "a heart attack for no reason"
Harper, Stephen died on the 21st of December, 2012 at 11:59:59 PM.
Harper, Stephen died of a heart attack for no reason.

x "July 21, 1969 02:56:15", "Armstrong, Neil", "Male", "poisoned moon cheese"
Armstrong, Neil died on the 21st of July, 1969 at 2:56:15 AM.
He died of poisoned moon cheese.

## Using Bonus Version

x "January 19, 2038 03:14:08","Everyone","Unknown","Y2K38"
Everyone will die on the 19th of January, 2038 at 3:14:08 AM.
Everyone will die of Y2K38.
Тейлор Скотт
источник