Escreva seu próprio Death Note

14

Kira precisa de sua ajuda!


Formato de entrada:

Date [and/or Time]
Name
Gender
Reason

Formato de saída:

<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>.


Detalhes, detalhes:


Seu programa deve contabilizar pelo menos os seguintes formatos de entrada de data:

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

Formatos de hora:

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

Os seguintes formatos de entrada de nome:

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


Casos de teste:


Entrada:

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

Resultado:

Tolkien, JRR morreu em 2 de setembro de 1973.

Ele morreu de pneumonia.


AVISO LEGAL: Se ele realmente morrer nesta data, a culpa é de Kira , não minha.

ATUALIZAÇÃO: Stephen Harper não morreu na data listada

Entrada:

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

Resultado:

Harper, Stephen morrerá em 21 de dezembro de 2012 às 23:59:59.

Harper, Stephen vai morrer de ataque cardíaco sem motivo.



Bônus:

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

--

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

Adicione <st/nd/rd/th>no final de DDpara entrada.

Mateen Ulhaq
fonte
Ahaha Acabei de ler esta série: D Não deveria ser "ataque cardíaco" por "sem motivo"?
Ry-
Um, 2 de setembro é 9/2/11, não 2/7/11;)
Ry- 3/11/11
O gênero não afeta a produção?
Peter Olson
Além disso, temos que aceitar datas anteriores a 1970?
Peter Olson
5
Como desambiguar a entrada com DD / MM / AAAA e MM / DD / AAAA?
Peter Olson

Respostas:

6

Javascript (561)

Provavelmente, isso pode ser reduzido significativamente, mas aqui vai:

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]+".");

E / S de amostra:

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

Tolkien, JRR morreu em 2 de setembro de 1973. Ele morreu de pneumonia.

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

Todos morrerão no dia 18 de janeiro de 2038 às 21: 14: 8. Todo mundo vai morrer de Y2K38.

Experimente no JsFiddle .

Peter Olson
fonte
Só quero salientar que i="9 November 2003 03:14:08 GMT\nDouglas Adams\nMale\nI forgot";me dá o 8th of November.
Mateen Ulhaq
4
@muntoo Isso acontece porque se ajusta ao seu fuso horário. Se você mora no fuso horário GMT, deve dar o nono.
Peter Olson
Vou te culpar se eu morrer no meu aniversário. : P
nyuszika7h
5

VB.NET, 727 695

Ok, jogou um pouco de golfe. Requer 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

Ele aceita as datas em todos os casos de teste e em muitos outros formatos graças a Date.Parse. Ele aceita muitos gêneros (como você pode ver) também. Se Kira decidir colocar apenas o nome ou sobrenome da pessoa, o programa falhará.

Ry-
fonte
Parece que você pode ser capaz de deixar cair algumas bytes, substituindo o seu argumento de divisão com uma MonthName(d.Month)chamada
Taylor Scott
2

CSharp - 463 caracteres

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));}
Roubar
fonte
1

PHP, 509 474 462 461 caracteres

<?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];

Adicionei novas linhas após cada uma, ;mas não as contei, pois elas não precisam estar lá.
Se o código manipula datas além de 19 de janeiro de 2038 03:14:07, depende de ser executado em uma máquina de 64 bits.

Gareth
fonte
1

VBA, 384 366 bytes

Golfe

subRotina completa que recebe entrada do tipo esperadoVariant\String e gera a mensagem da nota de morte associada para a janela do VBE

Nota: O VBA é incapaz de manipular fusos horários sem declarar funções da API do Windows, portanto, como não são necessárias para a pergunta, elas foram excluídas

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

Verison bônus, 394 376 bytes

Versão ligeiramente modificada acima, que lida com todos os casos de bônus, com exceção dos fusos horários (correção para manipulação de monônimos)

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

Uso

sequência de entrada e saída dos problemas de exemplo, como visto na janela imediata do 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.
Taylor Scott
fonte