미국 대통령은 누구입니까?


56

도전

1789 년 4 월 30 일부터 2019 년 8 월 21 일까지 하루에 입력을 받고 그날 미국 대통령이었던 출력으로 반환되는 프로그램을 작성하십시오.

노트

를 들어 미국 대통령의 목록 , 이름의 형식과 대통령의 기간은 아래 참조 :

April 30, 1789 - March 4, 1797          George Washington
March 4, 1797 - March 4, 1801           John Adams
March 4, 1801 - March 4, 1809           Thomas Jefferson
March 4, 1809 - March 4, 1817           James Madison
March 4, 1817 - March 4, 1825           James Monroe
March 4, 1825 - March 4, 1829           John Quincy Adams
March 4, 1829 - March 4, 1837           Andrew Jackson
March 4, 1837 - March 4, 1841           Martin Van Buren
March 4, 1841 - April 4, 1841           William Henry Harrison
April 4, 1841 - March 4, 1845           John Tyler
March 4, 1845 - March 4, 1849           James K. Polk
March 4, 1849 - July 9, 1850            Zachary Taylor
July 9, 1850 - March 4, 1853            Millard Fillmore
March 4, 1853 - March 4, 1857           Franklin Pierce
March 4, 1857 - March 4, 1861           James Buchanan
March 4, 1861 - April 15, 1865          Abraham Lincoln
April 15, 1865 - March 4, 1869          Andrew Johnson
March 4, 1869 - March 4, 1877           Ulysses S. Grant
March 4, 1877 - March 4, 1881           Rutherford B. Hayes
March 4, 1881 - September 19, 1881      James A. Garfield
September 19, 1881 - March 4, 1885      Chester A. Arthur
March 4, 1885 - March 4, 1889           Grover Cleveland
March 4, 1889 - March 4, 1893           Benjamin Harrison
March 4, 1893 - March 4, 1897           Grover Cleveland
March 4, 1897 - September 14, 1901      William McKinley
September 14, 1901 - March 4, 1909      Theodore Roosevelt
March 4, 1909 - March 4, 1913           William Howard Taft
March 4, 1913 - March 4, 1921           Woodrow Wilson
March 4, 1921 - August 2, 1923          Warren G. Harding
August 2, 1923 - March 4, 1929          Calvin Coolidge
March 4, 1929 - March 4, 1933           Herbert Hoover
March 4, 1933 - April 12, 1945          Franklin D. Roosevelt
April 12, 1945 - January 20, 1953       Harry S. Truman
January 20, 1953 - January 20, 1961     Dwight D. Eisenhower
January 20, 1961 - November 22, 1963    John F. Kennedy
November 22, 1963 - January 20, 1969    Lyndon B. Johnson
January 20, 1969 - August 9, 1974       Richard Nixon
August 9, 1974 - January 20, 1977       Gerald Ford
January 20, 1977 - January 20, 1981     Jimmy Carter
January 20, 1981 - January 20, 1989     Ronald Reagan
January 20, 1989 - January 20, 1993     George H. W. Bush
January 20, 1993 - January 20, 2001     Bill Clinton
January 20, 2001 - January 20, 2009     George W. Bush
January 20, 2009 - January 20, 2017     Barack Obama
January 20, 2017 - Incumbent            Donald Trump

회장단은 첫날이 포함되고 마지막 날이 제외되도록 의도됩니다. 예를 들어, "1861 년 3 월 4 일-1865 년 4 월 15 일; 에이브 러햄 링컨"은 링컨이 1861 년 3 월 4 부터 1865 년 4 월 14 일 까지의 대통령임을 나타 냅니다.

이것은 각 언어에서 가장 짧은 프로그램 인 코드 골프입니다.

입력 : "2 월 7, 1865"출력 : "Abraham Lincoln"


18
안녕하세요, CGCC에 오신 것을 환영합니다! 이것은 좋은 도전처럼 보이지만 모든 도전은 독립적이어야합니다. Wikipedia 링크 대신 여기에 모든 대통령 및 기간 목록을 작성하십시오 (바람직하게는 코드 블록으로 표시되므로 스크롤 막대가 나타남). 또한 유연한 입력 형식을 사용하는 것이 좋습니다. 따라서 사람들은 원하는 형식에 맞는 형식, 3 개의 느슨한 정수, 날짜 개체 등의 문자열로 입력 할 수 있습니다.
케빈 크루이 센

3
또한 향후 과제에 대해서는 먼저 제안 된 도전 과제 샌드 박스에 게시하는 것이 가장 좋습니다 . 메인에 게시하기 전에 피드백을 받고 문제를 개선 할 수 있습니다. 체류를 즐길 수! :)
Kevin Cruijssen

11
IO 형식은 얼마나 유연합니까?
qwr

15
WolframAlpha["president on "<>#]&나는 순수한 Mathematica가 어딘가에 내장되어 있다고 확신하지만 그것이 무엇인지 알 때까지 W | A를 고수하고 있습니다.
Pavel

8
이 경우 @Pavel WolframAlpha["US president on "<>#]&은 출력이 정확하지 않은 원인이되게합니다.
jonatjano

답변:


27

PHP , 936 바이트

for($a=explode('-',gzinflate(base64_decode('dVTRbtswDPwV/YANKXZq+zFJ1wRts3VZtgB7Y2Mm1ipLAO0089+PtNIuHbAnAzySd+RRNkVZ6XxSJUsMdES1g66x/tgHn5iiKnSms+Q+NF7Nami7xJTajLFtE1ro1D0eDkidZJe6itnQYqfWUNsYNsV1OHgKyNHJ9G/rryfr98M7wyT2mfma8KzuYf8SG2Wx0Rqot179AK/mJ0JB8qhpZ52z0KoVehrUCoguEhjP38i2g0OS2PRK1kOqnoJ7kXAk/wn7BrjJFgYXJH2qdaHLZM0UQLW6428bSCaZZmPFHYF/cSzsySLtR+B68PmJG3oQNTdR7eyZoGG1jzx8cCMw1bnJ3wdntVH+TdT03Q1dx62+pWrJZD0jRaTYnPoG6RBY2DzlwQeUPZbmin/GRUAHi66OUGXKZNFg1yMJOKO+OcmgZdzLksIrIwuHr+jAj0VRxhz9L2h50KsFV9n/ii4n9GbNev9gvcMhMZUWDXJIGGrepNqE0EldL1j10dBwlqVv4SCgiWS7EGoKZ8VJo4hqcrkCloVeLWURVPMtC5RpPtxkAe6VhS9CcLY+ogCRaIX0jNQzkQzA8ewfU2/TD/pyccoksoFB/NjSqRVvKz4GY6rk9myPTS9Vn2yHvgnnsSs7L+h4h3epekDvsZZd3GTGTEzyOPg6ePHw3fyKzZeajZWDrNVn+3sMFzlPVPKrJXB8jmy9BIvY37btoBb8TkbWMrJugpfUDcJxlFrGxpd3v0rVLuUr7RqGqjjFnNfPZlovf4OJ1ua64C2b47HRHIifqvryDC1w1EQtfwA=')));$d=$a[+$i++];)date(Ymd,strtotime($argn))>$d?$m=$a[$i++]:die($m);echo'Donald Trump';

온라인으로 사용해보십시오!


테스트 : 온라인으로 사용해보십시오!

테스트를위한 코드는 같은 논리이지만 다른 약간은 교체 die(...)return...내가 테스트를 통해 루프가 있습니다.


회장으로 시작일에서 1 일을 뺀 형식 YYYYMMDD으로 대통령 형식으로 문자열을 만들었습니다 -. 예:17890429-George Washington-17970303-John Adams-18010303-Thomas Jefferson-...

이 문자열은 gzdeflate를 사용 하여 압축되며 압축 출력은 base-64로 변환되므로 모든 문자를 인쇄 가능한 ASCII로 여기에 게시하거나 TIO 에서 사용할 수 있습니다 .

스크립트에서 문자열은 분할되어 -반복됩니다. 각 루프 반복에 대해 :

  • $d 현재 반복 값 (사장의 시작 날짜 -1 일) 및 루프 변수 ($i )는 1 씩 증가합니다.
  • 입력 날짜보다 큰 경우 $d, 다음 $m(위한 대표 이름 인 다음 반복의 값으로 설정 $d하고, 루프 변수 ()$i 를 다시 1 씩 증가). 이를 통해 루프는 대통령 이름을 얻을 수 있지만 반복적으로 이름을 뛰어 넘습니다.
  • 입력 날짜가보다 크지 않으면 $d이전 반복이 올바른 사장 이었음을 의미하며 함수를 $m사용하여 die인쇄되므로 이름을 인쇄 한 후 전체 프로그램이 중지됩니다.

마지막으로, 루프가 완료되면 (아니오 die가 호출 되지 않았다는 의미 ) 마지막 대통령의 이름이 인쇄됩니다. 우리는 이전 대통령 중 누구도 일치 January 19, 2017하지 않더라도 마지막 대통령의 이름을 인쇄 하기 때문에 마지막 대통령의 이름이 인쇄됩니다. January 1, 3999.



PHP를 모르지만 base64를 제거하고 인쇄 할 수없는 원시 문자를 삽입 할 수 있습니다 (16 진 덤프를 제공 할 수 있음).
MilkyWay90

@RyanMoore, 더 나은 압축 문자열 덕분에 슬프게도 더 이상이 답변을 제어 할 수 없으며 많은 업 투표 (및 일부 다운 투표도)를 얻은 내 목적이 제거되었습니다 ( 이 개정판에서 ). 그래서 아직 골프를 할 가능성이 있지만 더 이상이 답변을 편집하거나 골프를 쓰지 않을 것입니다.
Night2

@ MilkyWay90, 그것은 가능합니다. 그러나 읽을 수있는 코드와 TIO 링크를 갖도록이 버전을 의도적으로 게시했습니다. 기본적으로 이것은 하드 코어 답변이 아닙니다.
Night2

15

배쉬 , 1229 1124 바이트

@GammaFunction의 탁월한 의견을 가진 -103 바이트, 비생산적인 대체 (Adams)를 제거하고 각 회장단의 절대 날짜가 아닌 이전 날짜의 날짜 오프셋을 사용하도록 코드를 리팩터링합니다.

M=(. Ja F Mar Ap May Jun Jul Au S O N D)
A=40000
B=80000
s=son
a=James
c=Andrew
d=William
e=Harri$s
f=Franklin
g=George
h=Grover#Cleveland
i=Roosevelt
j=John
k=#W.#Bush
X="304:$g#Washington
$A:$j#Adams
$B:Thomas#Jeffer$s
$B:$a#Madi$s
$B:$a#Monroe
$A:$j#Quincy#Adams
$B:$c#Jack$s
$A:Martin#Van#Buren
100:$d#Henry#$e
39900:$j#Tyler
$A:$a#K.#Polk
10405:Zachary#Taylor
29595:Millard#Fillmore
$A:$f#Pierce
$A:$a#Buchanan
40111:Abraham#Lincoln
39889:$c#$j$s
$B:Ulysses#S.#Grant
$A:Rutherford#B.#Hayes
615:$a#A.#Garfield
39385:Chester#A.#Arthur
$A:$h
$A:Benjamin#$e
$A:$h
40610:$d#McKinley
79390:Theodore#$i
$A:$d#Howard#Taft
$B:Woodrow#Wilson
20598:Warren#G.#Harding
59402:Calvin#Coolidge
$A:Herbert#Hoover
120108:$f#D.#$i
79708:Harry#S.#Truman
$B:Dwight#D.#Eisenhower
21002:$j#F.#Kennedy
58998:Lyndon#B.#$j$s
50789:Richard#Nixon
29211:Gerald#Ford
$A:Jimmy#Carter
$B:Ronald#Reagan
$A:$g#H.$k
$B:Bill#Clinton
$B:$g$k
$B:Barack#Obama"
T=($1)
D=0${T[1]%,}
for((;;)){ [[ $T =~ ${M[++i]} ]]&&break;}
N=0$i
S=$[${T[2]}-1797]${N: -2}${D: -2}
for z in $X;{ O=$[O+${z%:*}];[ $S -lt $O ]&&z=${z//#/ }&&echo ${z#*:}&&exit;}
echo Donald Trump

온라인으로 사용해보십시오!

많은 수동 압축 :)


몇 가지 더 : $ IFS에서 $ X를 분할 할 X=($X)때 반복하여 제거하십시오 for z in $X. 사용 [ -lt ]및 사용 $T대신에 ${T[0]}. 마지막 몇 줄은 전체가 1191 바이트 여야합니다.
GammaFunction

1092 ! 나는 달 구문 분석을 단순화했습니다 (예를 들어, 우리가 6 월을지나 J로 시작한다면 7 월이되어야합니다. 또한 테스트를로 변경했습니다 [ ${T#${M[++i]}*} ]. 이제 12 월을 완전히 끝낼 수 있습니다). 나는 또한 :몇 가지 이름에 선행 을 포함시켰다 (이 대신에 :John모든 구분자 :를 만드는 것을 의미 함 #).
GammaFunction

12

T-SQL, 1169 981979 977 바이트

이런 암소, SQL에서 문자열 압축을 알아 냈습니다 ( SQL 2016 이상에서 사용 가능 ).

SELECT TOP 1 STUFF(value,1,8,'')
FROM d,STRING_SPLIT(
    CAST(DECOMPRESS(CAST('H4sIAAAAAAAEAHVT23LaMBD9FX1AxiMZg+1HIAWGhDaltMz0bYMXrEaWOmsc6r/vrpw27kOHB8ZnL+fs2VWqTa6NKe+DB1epA3XNz7tU61LABRCcXtSnZ2hAQCPgGgNdUB0Tteja+s6U5STmWufU0ll/DZ7BohzlbpJRehG77Ae+PcIFJD+PKra2aXq1BLoiCZjpQhdrJEldBaoYm8XGe3uqgSr10f6KdLOJMal57H0VvFokahtq3w6RSCffapWoB/Qeq57xaVR9f7OX+qruE/XBtujrcIvE2VRnxmyAqFdfkuhKVDmZaP6tCPwLTypl+xBafEV35WhaSnSD9Ix0VZsQXmOzdMJTmCW4Vy5ZhuBsdUHBjaQfmQS9WieK6SrrLxwxkeYYQkXhpo7WDaPo2J8/nYWG+9/EgQOchZt3w2WHGkMVCMeyijIfl+1OD9Y77CUQadYkOnl1kg+ePS6KSLRA/wMa1iw+2CihKKb/KxH+Ylljy6tT80TN6Vp3NES4ZAsNtoKvgc4WndTkUdi+u9ZIZ96uLG4DPbYcm0UJX13ftlzHO1iz6TLNTFaTzX1FeHtfczGLLPNngpqHfLT+FJzg0/ydfdHx0XiI8L+LfLJIJxRc61wXO/ZKvF3xf8N2ciCLer6DnF3PpvcuyHDZ9L39Q6KegnsR1OiMUbm5Q++QBmi8O/TcZeTrJMrc8eGzmm/AN9zxVXBguKk/4/JrHPLTgVcYPnc8bK/mFTRinBkNvAuegqgfLucNhOqNVEdNhzo00Kotns9IMZAPFxO7v7XN+SSy9O/bh7bmS+WX/hut0W9jPwQAAA=='as XML).value('.','varbinary(max)'))AS varchar(max)),',')
WHERE LEFT(value,8)<i

저장하지 않습니다 나는 그것이 수도 희망으로 아마 그것 때문에 / deconvert을 변환하는 데 걸리는 코드의 양을, 많이.

다음은 인코딩 된 문자열이 압축 해제 된 후 실행되는 코드와 동일한 원래 버전입니다 (1169 바이트).

SELECT TOP 1 SUBSTRING(value,9,99)
FROM d,STRING_SPLIT(
    '20170119Donald Trump,20090119Barack Obama,20010119George W. Bush,19930119Bill Clinton,19890119George H. W. Bush,19810119Ronald Reagan,19770119Jimmy Carter,19740808Gerald Ford,19690119Richard Nixon,19631121Lyndon B. Johnson,19610119John F. Kennedy,19530119Dwight D. Eisenhower,19450411Harry S. Truman,19330303Franklin D. Roosevelt,19290303Herbert Hoover,19230801Calvin Coolidge,19210303Warren G. Harding,19130303Woodrow Wilson,19090303William Howard Taft,19010913Theodore Roosevelt,18970303William McKinley,18930303Grover Cleveland,18890303Benjamin Harrison,18850303Grover Cleveland,18810918Chester A. Arthur,18810303James A. Garfield,18770303Rutherford B. Hayes,18690303Ulysses S. Grant,18650414Andrew Johnson,18610303Abraham Lincoln,18570303James Buchanan,18530303Franklin Pierce,18500708Millard Fillmore,18490303Zachary Taylor,18450303James K. Polk,18410403John Tyler,18410303William Henry Harrison,18370303Martin Van Buren,18290303Andrew Jackson,18250303John Quincy Adams,18170303James Monroe,18090303James Madison,18010303Thomas Jefferson,17970303John Adams,17890429George Washington',',')
WHERE LEFT(value,8)<i

줄 바꿈은 읽기 쉬운 것입니다.

dINTiYYYYMMDD

바이트를 저장하는 데 사용한 몇 가지 트릭 :

  • 나는 대통령을 내림차순 으로 정렬 ORDER BY하여 코드에 추가 할 필요가 없었습니다.
  • 각 용어의 "시작"날짜에서 1을 빼서 <대신에 사용할 수 있습니다.<=
  • String-split은 and 와로 문자열을 분리해야하지만 큰 목록보다 훨씬 짧습니다 .VALUES()SUBSTRINGLEFT
  • 편집 :로 변경 SUBSTRING()하여 2 바이트 저장STUFF()

SQL에서 Base64로 인코딩 된 압축 문자열 사용

( SQL Tips 스레드에 추가됨 )

따라서 Microsoft 는 SQL 2016에서 GZIP를 처리하는 a COMPRESSDECOMPRESS함수를 다시 추가했습니다 . 문제는 바이트 수는VARBINARY 짧아도 (SQL 필드에 저장된 경우 ) 문자 (원시 16 진)로 표시 될 때 더 길어 골프에 적합하지 않다는 것입니다.VARBINARY

Base64로 전환하는 것이 정답이지만, 짧고 간단한 구현을 찾는 것이 어려웠습니다. SO에 대한이 이전 답변 의 버전을 기반으로 했으므로 새로운 GZIP 기능을 사용하지 않지만 필요한 것을 대부분 제공합니다. 방금 새 기능을 올바른 위치에 삽입하고 약간 아래로 골프를 치렀습니다.

자신의 코드에서이 방법을 사용하려면

--Run this to generate your compressed string:
DECLARE @s VARCHAR(MAX)='Your really long string goes right here'
SELECT CONVERT(VARCHAR(MAX),(SELECT CONVERT(VARBINARY(MAX),COMPRESS(@s))FOR XML PATH(''),BINARY BASE64))

--Use your compressed string and the following code to get back to the original:
DECLARE @e VARCHAR(MAX)='H4sIAAAAAAAEAIvMLy1SKEpNzMmpVMjJz0tXKC4pygRS6fmpxQpFmekZJQoZqUWpAGGwW5YnAAAA'
SELECT CAST(DECOMPRESS(CAST(@e as XML).value('.','varbinary(max)'))AS varchar(max))

그것은 인코딩 된 문자열을 압축 해제하기 위해 75 73 바이트의 추가 코드이므로 매우 긴 문자열에만 이것을 사용하십시오.

편집 : CAST대신 압축 풀기 코드에 2 바이트를 저장했습니다 CONVERT.


12

Excel, 1243 1206 1180 바이트

모든 날짜에서 빼기 -37 바이트
빼기 값으로 조정하여 -26 바이트

=CHOOSE(MATCH(A1-65^4,{39805,119679,159679,239679,319679,399679,439679,519679,559679,559779,599679,639679,650084,679679,719679,759679,799790,839679,919679,959679,960294,999679,1039679,1079679,1119679,1160289,1239679,1279679,1359679,1380177,1439679,1479679,1599787,1679495,1759495,1780497,1839495,1890184,1919495,1959495,2039495,2079495,2159495,2239495,2319495}),"George Washington","John Adams","Thomas Jefferson","James Madison","James Monroe","John Quincy Adams","Andrew Jackson","Martin Van Buren","William Henry Harrison","John Tyler","James K. Polk","Zachary Taylor","Millard Fillmore","Franklin Pierce","James Buchanan","Abraham Lincoln","Andrew Johnson","Ulysses S. Grant","Rutherford B. Hayes","James A. Garfield","Chester A. Arthur","Grover Cleveland","Benjamin Harrison","Grover Cleveland","William McKinley","Theodore Roosevelt","William Howard Taft","Woodrow Wilson","Warren G. Harding","Calvin Coolidge","Herbert Hoover","Franklin D. Roosevelt","Harry S. Truman","Dwight D. Eisenhower","John F. Kennedy","Lyndon B. Johnson","Richard Nixon","Gerald Ford","Jimmy Carter","Ronald Reagan","George H. W. Bush","Bill Clinton","George W. Bush","Barack Obama","Donald Trump")

Excel은 1900 이전의 날짜를 좋아하지 않기 때문에 입력이 A1형식으로 셀 에 YYYYMMDD있습니다.

바이트를 추가하지 않는 날짜 또는 이름에 대한 압축 방법을 모르겠습니다. "모든 날짜에서 [값] 빼기"방법은 모든 사람의 솔루션에 적용될 수 있습니다.


동일한 원리를 사용하여 Google 스프레드 시트에서 1102 바이트 솔루션을 찾았습니다. Excel에는 Split함수가 없으므로 번역 할 수 없습니다.

=Index(Split("George Washington,John Adams,Thomas Jefferson,James Madison,James Monroe,John Quincy Adams,Andrew Jackson,Martin Van Buren,William Henry Harrison,John Tyler,James K. Polk,Zachary Taylor,Millard Fillmore,Franklin Pierce,James Buchanan,Abraham Lincoln,Andrew Johnson,Ulysses S. Grant,Rutherford B. Hayes,James A. Garfield,Chester A. Arthur,Grover Cleveland,Benjamin Harrison,Grover Cleveland,William McKinley,Theodore Roosevelt,William Howard Taft,Woodrow Wilson,Warren G. Harding,Calvin Coolidge,Herbert Hoover,Franklin D. Roosevelt,Harry S. Truman,Dwight D. Eisenhower,John F. Kennedy,Lyndon B. Johnson,Richard Nixon,Gerald Ford,Jimmy Carter,Ronald Reagan,George H. W. Bush,Bill Clinton,George W. Bush,Barack Obama,Donald Trump",","),Match(A4-65^4,{39805,119679,159679,239679,319679,399679,439679,519679,559679,559779,599679,639679,650084,679679,719679,759679,799790,839679,919679,959679,960294,999679,1039679,1079679,1119679,1160289,1239679,1279679,1359679,1380177,1439679,1479679,1599787,1679495,1759495,1780497,1839495,1890184,1919495,1959495,2039495,2079495,2159495,2239495,2319495}))

2
Excel을 잘 모르고 로컬 Excel이 네덜란드어이므로 확인할 수 없습니다. 그러나 이것이 맞습니까? 날짜와 일치하는 것보다 정확하게 일치하는 것을 찾지 않습니까? 이것에 대해 아무것도 출력 할 수 19000101있습니까?
Kevin Cruijssen

3
@KevinCruijssen Nope MATCH()에는 정확한 일치를 사용할지 여부를 결정 하는 선택적 세 번째 인수 match_type 이 있습니다. 해당 인수를 제외하면 "작거나 같음"일치 인 기본값이 사용되므로이 코드가 정확합니다.
BradC

@BradC 아, 몰랐어요. 설명해 주셔서 감사합니다! 나에게서 +1 :)
Kevin Cruijssen

1
각각에서 고정 값을 빼는 멋진 트릭, 그것이 내 도움이되는지 확인해야합니다.
BradC

9

05AB1E , 587 584 568 바이트

.•6}©ß þz∊‘Îнúj7a>º ·,$_+šüÑßu?PδIëàá©ā.ǝ/¬j«Ížr‹þVwô¨"¶&ˆ₃ǝαh^¼ì∞öîNÊÌ.ÚáýиÇ÷©Mèé…—¾…тŒ¹/ÈÂÓŒš/«ª³PÉÇJúΓÁ¦';X·₅ï»/„q<ƶÚÙÊtÔιuš2βƒ¼ï\~ö…3ihD·¢ðΘmζ8É9Ïγ=^$¨Ä₆ËÂÊPv5+}þ¯ÑX4hÖdÀÒuàнº₁›ǝΘ³P@¥ùnðT“É)ó_“:Èx³«äƒæ¤∞Wgþ¶š}ô|ićcÁ‘.·ƒp>Z¬Aéγê‰ù‰¥Ó₃#/›pÐT¹Â¹J3—ΛΓkÙ»(áÌ›₃z@ìqW›Â"™raÒ›₂%ïx{
_Ωb≠¹₁ľÊÌ›}çºô|ôëKÝǝÚï,‚£=A©áāY∊~"KøVóΓyΛJÚΘ·ˆUΩ₂TнîëнÐQнĆ!!¶%Ý₃ó¸ß0ûиî€AvÙ∍Õ
'«₂θSè‡H¿ÏLôǝāqaмÑIƶ%ŸSdUbåÐÉιδJ¯4₆>θçàƶñwC¨OVÀàczdRæs?5ʒP8“ƒÍÜðαŸÝf,ƒη,™`ÿeиäƵθC≠ýzX‡)и∞úø+þćÎÌвĆ挱ðí1•™„qz„K.‡„  ¡•gpöz&»XZ1rć¾{¦¯Û¿p~Θø•Ƶaв₄R«•e½òœu#ÈĆÔFƵ•Ƶ`вŽcƵ«•9…åœòFýLÂ]FÜÔĀ=Ƶ®5¿ùK»Ωм••Rwg•в««•1L₄Æ•+I‹Oè

입력은 형식으로 연결된 날짜입니다 yyyyMMdd(예 : 201908212019 년 8 월 21 일).

@Grimy 덕분에 -16 바이트 .

온라인으로 시도 하거나 몇 가지 테스트 사례를 확인하십시오 .

설명:

시간순으로 대통령 목록을 작성하는 것으로 시작합니다.

.•6}©...ðí1            # Push compressed string "george washington  john adams  thomas jefferson  james madison  james monroe  john quincy adams  andrew jackson  martin van buren  william henry harrison  john tyler  james kz polk  zachary taylor  millard fillmore  franklin pierce  james buchanan  abraham lincoln  andrew johnson  ulysses sz grant  rutherford bz hayes  james az garfield  chester az arthur  grover cleveland  benjamin harrison  grover cleveland  william mcqinley  theodore roosevelt  william howard taft  woodrow wilson  warren gz harding  calvin coolidge  herbert hoover  franklin dz roosevelt  harry sz truman  dwight dz eisenhower  john fz kennedy  lyndon bz johnson  richard nixon  gerald ford  jimmy carter  ronald reagan  george hz wz bush  bill clinton  george wz bush  barack obama  donald trump"
                       # Titlecase each word in the string
qzK.‡                 # Replace all lowercase "q" with "K" (for McKinley),
                        # and all lowercase "z" with "."
                        # (only lowercase letters and spaces can be compressed as string)
  ¡                    # Split the string on "  " (two spaces)

그런 다음 모든 날짜의 목록을 정수 형식으로 만듭니다 yyyyMMdd(이 목록과 관련이없는 순서).

gpözXZ1rć¾{¦¯Û¿p~Θø• # Push compressed integer 57036763189461803778321913240836786322696217070172
  Ƶa                    # Push compressed integer 137
    в                   # Convert the large integer to base-137 as list:
                        #  [4,12,20,28,32,40,44,48,52,56,60,64,72,80,84,88,92,96,100,112,116,124,132,136]
     R                 # Push 1000, and reverse it to "0001"
       «                # And concat it to each item:
                        #  [40001,120001,200001,280001,320001,400001,440001,480001,520001,560001,600001,640001,720001,800001,840001,880001,920001,960001,1000001,1120001,1160001,1240001,1320001,1360001]
                        # (this is for all the March 4th dates)
e½òœu#ÈĆÔFƵ•           # Push compressed integer 47362342587646909879438102
  Ƶ`                    # Push compressed integer 223
    в                   # Convert the large integer to base-223 as list:
                        #  [155,163,171,179,183,191,195,203,211,219,222]
     ŽcƵ                # Push compressed integer 9817
        «               # And concat it to each item:
                        #  [1559817,1639817,1719817,1799817,1839817,1919817,1959817,2039817,2119817,2199817,2229817]
                        # (this is for all the January 20th dates)
1厨£ÆÊÂç-iYúΛȾEW½Ω≠tW
                        # Push compressed integer 42494608868313599134973321717434089414197466371857150907
  Rwg                 # Push compressed integer 1770507
       в                # Convert the large integer to base-1770507 as list:
                        #  [440101,530406,680112,840616,1040611,1260499,1480109,1660819,1770506]
                        # (these are the remaining dates; i.e. those who died earlier)
««                      # Merge the three lists together:
                        #  [40001,120001,200001,280001,320001,400001,440001,480001,520001,560001,600001,640001,720001,800001,840001,880001,920001,960001,1000001,1120001,1160001,1240001,1320001,1360001,1559817,1639817,1719817,1799817,1839817,1919817,1959817,2039817,2119817,2199817,2229817,440101,530406,680112,840616,1040611,1260499,1480109,1660819,1770506]
  1L₄Æ•                # Push compressed integer 17970302
        +               # Add it to each item in the list:
                        #  [18010303,18090303,18170303,18250303,18290303,18370303,18410303,18450303,18490303,18530303,18570303,18610303,18690303,18770303,18810303,18850303,18890303,18930303,18970303,19090303,19130303,19210303,19290303,19330303,19530119,19610119,19690119,19770119,19810119,19890119,19930119,20010119,20090119,20170119,20200119,18410403,18500708,18650414,18810918,19010913,19230801,19450411,19631121,19740808]

그런 다음 입력을 사용하여 목록의 날짜를 기반으로 출력 대통령 이름을 결정합니다.

I                      # Check for each value in the integer-list if the Input is smaller
                        # (1 if truthy; 0 if falsey)
  O                     # Sum these to get the amount of truthy values
   è                    # And use that to (0-based) index into the president-names list
                        # (after which the result is output implicitly)

압축 된 문자열, 정수 및 목록이 어떻게 작동하는지 이해하려면 이 05AB1E 팁 ( 사전의 일부가 아닌 문자열을 압축하는 방법? , 큰 정수 를 압축하는 방법 ?정수 목록을 압축하는 방법? ) 을 참조하십시오.


1
@ 그림은 실제로 그것을 복사 할 수 없었으므로 당신이 한 일을 본 후에 다시 압축해야했습니다. 나는 모든 대통령의 이름을 확인하고 모든 편지를 받았습니다. 그러나 첫 번째 제목을 사용하여 바이트를 저장 한 다음 더 이상 존재하지 않는 소문자를 사용하여 점과 대문자로 변환하는 좋은 방법입니다. -16 감사합니다!
Kevin Cruijssen

이러한 이름 중 다수는 사전 단어이므로 크게 개선됩니다. 시작으로, 여기에 -32
Grimmy

1
@Grimy Will은 아마도 다음 주 어딘가에 그 접근법을 시도 할 것입니다. 현재는 먹을 예정이며 내일 마감일 때문에 바쁘게 일하고 있습니다.
Kevin Cruijssen

1
464 . 이것은 여전히 ​​불가능하지만 Jelly의 426을 이길 수는 없다고 생각합니다 . 그들의 문자열 압축이 더 좋습니다.
그리미

7

젤리 ,  431 428 427  426 바이트

“¡Ẹị’ḃ4ż“ƓĠƒƝƊ!ɓa(‘ḅ⁹
“FQIȥ’ḃ8Ėẋ/€<8ż¢F1,303yo119
“f×Ð<Mk7LqƇ%_¡¤cċ⁴ẏ’Do13’⁽¤.;Äż¢ḅȷ4<VSị“¡ṀÑṅyȮÇæjRṂ~ɠƥ⁺'Ḃġ"Ƈ~Ị'9ƒȮṃ$ḶPȯṅṡḊl¥JƊ€ẊḥSṣọwɦṡ5ėṂU #Fɲẓ÷iḄþ%~%ñçŒfƒƙɼ=ɓ⁼¡⁻Q`⁵¡ḍ36)żȥÑR\ḋ⁾ḶƤ0ÞṘḳ÷¦IṂ\}ƊĊÐḳŻƈɦ!zɠ⁺ƈṖṭW⁸ƥṛU|ḄØ^ẓfḂḣƈCȦ8ɱḤH⁵AKṢzȯỵƭḊ:TʠƬ/~ƝÑȥgṖ(ṁȯDƲṫỴftlBOȧ6Ụiṃıẉ_ƈvh5ṄUɓạẓDẠẸıṣƥ"bçȥ¿çOġQẹİẊẸs*⁶ż,Ḍg®ƲW×ɗ,ẏ¡Ḅ5M5)ṀạƈCṛʂẎŒƬwġ⁶NẠṆRƇsẊ<fŀȯ⁵øȤ\⁾.>ḋTṖĠUṇŻṬTṖræ_TçṡȤOʠƥðȦe]ƈ⁵cṆWƭƲ>`½n¿O¡ṭOþV¤ṡẊ²rdS€ė)ƘIÆ&ṙḞ¬5[pṁȥLṘVỴɠ»ḲṚƑ”.ẋṭƲ€KỴ¤

YYYYMMDD대통령의 이름을 인쇄 하는 문자열 을 받아들이는 전체 프로그램 .

온라인으로 사용해보십시오! 또는 (Kevin Cruijssen 's) test-suite 참조하십시오.

어떻게?

“¡Ẹị’ḃ4ż“...‘ḅ⁹ - Link 1, getNonStandardEndMonthDays: no arguments
“¡Ẹị’           - base 250 literal       = 106467
     ḃ4         - to bijective base 4    = [1,2,1,3,3,3,1,4,3]
        “...‘   - code-page indices      = [147,196,158,150,145,33,155,97,40]
       ż        - zip together           = [[1,147],[2,196],...,[3,40]]
              ⁹ - built-in literal       = 256
             ḅ  - from base (vectorises) = [403,708,414,918,913,801,411,1121,808]

“FQIȥ’ḃ8Ėẋ/€<8ż¢F1,303yo119 - Link 2, getEndMonthDays: no arguments
“FQIȥ’                      - base 250 literal    = 1114518671
      ḃ8                    - to bijective base 8 = [8,2,3,3,4,3,2,2,1,7]
        Ė                   - enumerate           = [[1,8],[2,2],[3,3],[4,3],[5,4],[6,3],[7,2],[8,2],[9,1],[10,7]]
           €                - for each:
          /                 -   reduce with: 
         ẋ                  -     repeat          = [[1,1,1,1,1,1,1,1],[2,2],[3,3,3],[4,4,4],[5,5,5,5],[6,6,6],[7,7],[8,8],9,[10,10,10,10,10,10,10]]
            <8              - less than 8?        = [[1,1,1,1,1,1,1,1],[1,1],[1,1,1],[1,1,1],[1,1,1,1],[1,1,1],[1,1],[0,0],0,[0,0,0,0,0,0,0]]
               ¢            - call last Link (1)  = [403,708,414,918,913,801,411,1121,808]
              ż             - zip together        = [[[1,1,1,1,1,1,1,1],403],[[1,1],708],[[1,1,1],414],[[1,1,1],918],[[1,1,1,1],913],[[1,1,1],801],[[1,1],411],[[0,0],1121],[0,808],[0,0,0,0,0,0,0]]
                F           - flatten             = [1,1,1,1,1,1,1,1,403,1,1,708,1,1,1,414,1,1,1,918,1,1,1,1,913,1,1,1,801,1,1,411,0,0,1121,0,808,0,0,0,0,0,0,0]
                 1,303      - pair literal        = [1,303]
                      y     - translate           = [303,303,303,303,303,303,303,303,403,303,303,708,303,303,303,414,303,303,303,918,303,303,303,303,913,303,303,303,801,303,303,411,0,0,1121,0,808,0,0,0,0,0,0,0]
                        119 - literal             = 119
                     o      - logical OR          = [303,303,303,303,303,303,303,303,403,303,303,708,303,303,303,414,303,303,303,918,303,303,303,303,913,303,303,303,801,303,303,411,119,119,1121,119,808,119,119,119,119,119,119,119]

“...’Do13’⁽¤.;Äż¢ḅȷ4<VSị“...»ḲṚƑ”.ẋṭƲ€KỴ¤ - Main Link: list of characters, X
“...’                                     - base 250 literal    = 5999595155245555951555559593750993764595999
     D                                    - to base 10          = [5,9,9,9,5,9,5,1,5,5,2,4,5,5,5,5,9,5,1,5,5,5,5,5,9,5,9,3,7,5,0,9,9,3,7,6,4,5,9,5,9,9,9]
       13                                 - literal             = 13
      o                                   - logical OR          = [5,9,9,9,5,9,5,1,5,5,2,4,5,5,5,5,9,5,1,5,5,5,5,5,9,5,9,3,7,5,13,9,9,3,7,6,4,5,9,5,9,9,9]
         ’                                - decrement           = [4,8,8,8,4,8,4,0,4,4,1,3,4,4,4,4,8,4,0,4,4,4,4,4,8,4,8,2,6,4,12,8,8,2,6,5,3,4,8,4,8,8,8]
          ⁽¤.                             - literal             = 1797
             ;                            - concatenate         = [1797,4,8,8,8,4,8,4,0,4,4,1,3,4,4,4,4,8,4,0,4,4,4,4,4,8,4,8,2,6,4,12,8,8,2,6,5,3,4,8,4,8,8,8]
              Ä                           - cumulative sums     = [1797,1801,1809,1817,1825,1829,1837,1841,1841,1845,1849,1850,1853,1857,1861,1865,1869,1877,1881,1881,1885,1889,1893,1897,1901,1909,1913,1921,1923,1929,1933,1945,1953,1961,1963,1969,1974,1977,1981,1989,1993,2001,2009,2017]
                ¢                         - call last Link (2)  = [303,303,303,303,303,303,303,303,403,303,303,708,303,303,303,414,303,303,303,918,303,303,303,303,913,303,303,303,801,303,303,411,119,119,1121,119,808,119,119,119,119,119,119,119]
               ż                          - zip together        = [[1797,303],[1801,303],[1809,303],[1817,303],[1825,303],[1829,303],[1837,303],[1841,303],[1841,403],[1845,303],[1849,303],[1850,708],[1853,303],[1857,303],[1861,303],[1865,414],[1869,303],[1877,303],[1881,303],[1881,918],[1885,303],[1889,303],[1893,303],[1897,303],[1901,913],[1909,303],[1913,303],[1921,303],[1923,801],[1929,303],[1933,303],[1945,411],[1953,119],[1961,119],[1963,1121],[1969,119],[1974,808],[1977,119],[1981,119],[1989,119],[1993,119],[2001,119],[2009,119],[2017,119]]
                  ȷ4                      - literal 10^4        = 10000
                 ḅ                        - from base           = [17970303,18010303,18090303,18170303,18250303,18290303,18370303,18410303,18410403,18450303,18490303,18500708,18530303,18570303,18610303,18650414,18690303,18770303,18810303,18810918,18850303,18890303,18930303,18970303,19010913,19090303,19130303,19210303,19230801,19290303,19330303,19450411,19530119,19610119,19631121,19690119,19740808,19770119,19810119,19890119,19930119,20010119,20090119,20170119]
                     V                    - evaluate (X)        (i.e. X -> YYYYMMDD)
                    <                     - less than? (vectorises)
                      S                   - sum                 (a number between 0 and 44 inclusive)
                                        ¤ - nilad followed by link(s) as a nilad:
                        “...»             -   compression of dictionary words and strings
                             Ḳ            -   split at spaces
                                     €    -   for each (part):
                                    Ʋ     -     last four links as a monad:
                               Ƒ          -        invariant under?:
                              Ṛ           -          reverse (true for initials only)
                                ”.        -        literal = '.'
                                  ẋ       -        repeat
                                   ṭ      -        tack (the part - e.g. [['A'],'.'])
                                      K   -   join (back up) with spaces
                                       Ỵ  -   split at newline characters
                       ị                  - index into (that list) (1-indexed & modular)
                                          - implicit (smashing) print

나에게서 플러스 하나. 이것은 놀랍습니다
MilkyWay90

감사! 함께하는 데 꽤 오랜 시간이 걸렸습니다.
Jonathan Allan

5

젤리 , 454 바이트

“¡#<Ḷ“¡D{“ß“®“c“ƒⱮ“¡“(Ȥ“u^“£“ɠn“ƒ⁺“¥“¢r“ƈ⁶“©“ƙm“¡B⁻“¤“Pẋ“ḣ¢“¡“¡ẓk“¡CẆ“¢“S¢“ėẋ“ṄỴ“t<“Œ“¦’ḃ2$¹<?€ȷ2F4ȷ4,8ȷ4ĖF¤yÄ<⁸TṪị“€`ɲ×ƥF7ȯẒ⁼ẈẎu⁻ɠṇẠẈƊ⁻QḲỌ ỊƭʠµḢƊCṾr⁻=ßạḌ`^ḌX§®tṭN£jx,ƈ=suĖɼ_ḍf9*ÆṙỊṪṄ Jʋ ȯṡẉ ỌẏⱮøÞ⁴xḤżḅñ£ṡṭʂMṚ¶ṇwıƲṁEnÄ`:®ƥʂ_xd⁶ŒĖṁƙƝg°ṂʠkṫhO5Ịḅḳ³'ø⁵aẏṄKḂẆZØ4JḌþḂ⁸⁸XlIVḤOḲØṢÐ!}?Ọ°ḲẆiḢAr`ġƘ⁸ḷ[¿T§ẓ⁵|ḍdɓ^ṭƲfỴĖġJw(Ȯ:⁺k=£ŀnṗ*'hẹḋŻZOLæزẋ⁼ẏ&ı6ḣṗẈƥ¡:9D¢=G§⁴eỤ6wẈ6ṗw6⁺zOẉ}OṆƲdṃ'ıẠ£¤þ4¢1ȷfɓ.ṪpṀ⁴Ṡtṁ⁷ẇlŒ!ṠyaṪ66xvḍgġ¤goḍRẒ³żẎịṣ6ĿⱮ}ḲkƒiL²?Ḃ¿ḥƝ¤dėḤ½Ṗ,cRÐþɼ©ṢƈḅṬḊṬɠṅÞ»Ỵ¤

온라인으로 사용해보십시오!

YYYYMMDD 형식의 날짜를 인수로 사용하고 응답이 포함 된 문자열을 반환하는 모나드 링크입니다.

테스트 사례 ( @KevinCruijssen의 05AB1E 답변 에서 차용 ).


4

자바 스크립트 (Node.js) ,  8555151803  바이트

d=>(g=i=>(p+=parseInt((a=(require('zlib').inflateRawSync(Buffer("ZVJtct0gDLwKB1A9dSaTtGfoKWSQDc+AXgS2S09f8T6cdPqDsc2utKuVv411jTC6FV4EzzO6eD53GG26vc0Wtp+3t9uhjkwn7+0dxnf6hPu5JHiJP8524mHcr7fPV3yDF+Z79XcL48em2ASy/yP+1dRCLAuZA4sPeamc4cI+G3SYClTPCYu50DyTlI5homISuvDli7Mw3cs+tpBte1RjdkKHuaBdOzuh1JDNjtlMm1CGI8QYMBlPWZrxKHLv2hvVFkkeAutgrhxX+INWSc1UbJEFkpajODPrM7EQzIJ5jSpxDSSWHtXTplUZM+Ak6FVOGZZjPu2pXJfdYitF+WUwizaqIFv1JDOrxDSovUbl0RKVgjIHig6sp1JJ+p3O5zeBRXjXCxtpp6giMFHWOvV1jvgf5RlFsr9CjtQ0eWKnQxlhLp1VP+Pio49dcdY7Zid8GMV6XwU0WLN0u+J0n2Ax7qpsmWNwC4FONJFUbdIdfEbmhi9K3WfrQVTZkibnjrD42jkUCmU10HfT1zQPZqWcyTWILTvOPapnohL6vpzJ4XefmQSjbkvzhEtIqRmrgWkj4dwBIVwwP/9HP5hj0N0VD5POrVGFXPmETwxF/y7DEyYEd2/UTV//Ag","base64"))+"").split`,`)[i],32))<new Date(d)/864e5?g(i+1):a[i+44].replace(/\b./g,c=>c.toUpperCase()))(p=0)

온라인으로 사용해보십시오!

어떻게?

압축 된 문자열에는 89 개의 값 목록이 있습니다.

처음 44 개의 값은 일수로 표시되고 기본 32 (최고 압축 기준 인 기본)로 인코딩 된 대통령 명령의 길이입니다.

다음 45 개의 값은 소문자의 대통령 이름입니다. 타이틀 케이스는 이후에 적용됩니다 ( @KevinCruijssen의 답변 에서 빌린 트릭 ).


제목 케이스로 인해 McKinley는 "Mckinley"로 출력합니다.
TheJim01

@ TheJim01 신고 해 주셔서 감사합니다. 이제 수정되었습니다.
Arnauld

3

SOGL , 475 바이트

⁵æ“DƧ▓«ļ¶↕Q∫<⅔∑+fQyΛ‼Bī:׀═&Sf',№═׀ΔΥκ\κΗδ=6oΡΠω«i℮ī K }½6YΨδ~░pTø№ŗ◄&Λθ▒“Æš“─{1α:C'⁰%+:"⅞“*c'⁰÷+dr"⅞“*b'«*e++>?al"t!■u↔R⅝Θνj╤←⁵κP׀λc⅜-Gc⁸׀!┐)└█5¦@T¬[@∫↕‛ρ℮↑δŗιf√³I2~Δ▓η¤⁴b¡νθ@36⅛Π└Ξ±Ƨ⅜⅓mwθ:∫^⌠≥-N\T‛V;r□τθ⁹;C{¾lΠƨUΒΡ║⁸Κ≤øΔ°?U┼S→iļ┐Kπzz∑Θ⅛%τ`ωΗ2D≡ψ_;OR⁴w≡1Z⅓ēυ%─ž′ιVJοUζķπd└≈³ΘΟ‚GR2┌═NΒθ↔T²νsσ□lQMæν÷¦Π±°≡═øΡTe¼ž⁰λ_►○³1≡№╚█λΜβΤ½<Π±Cļ¬└⁴┘čgr⁰⁄▲8|}⁸ē4№╤#√⅔d?÷≥}▼eī┼^ƧX‽>≥▼k ¹Wļm║⌠¦→┘C׀ψΠ¼⁽tΠ↔:φbεļ▓Β√⁷->→⅜O∑░=`ξε↕ņ⅛╚πBπσ§T׀ķīT:‽4;%≥═pP¶G→○▼φβjτ9v⁄6Υ◄⁹¤{τ/∑a⁰}┐⁵e¬č‘ūƧkiƧKiŗƧ, Θw←

여기 사용해보십시오!

날짜 논리가 약간 개선되었을 수 있습니다.


3

PHP , 888 바이트

$_=0;$l=explode('|',gzinflate(substr($a=base64_decode('AAALMQW0C2oLagtqBbULagW1AB8FlgW1AewDyQW1BbUF3wWLC2oFtQDHBO4FtQW1BbUGdgqoBbULagNxB/kFtRFGCxgLagQMB14H6wN/BbULagW1C2oLagtqZVLtjtpADHyVfYK8Ax8FBEd7pWmR+s9kTXbLxq68CXSlffjaheNO6q8o6/HMeOw1svTojpBDpH5kqlsO5GYehlzbwANkt8XzGSVbDQbMbg8+fvhjEsZ729cpUlce3TPygje3he5i6D3IGMn9AHLzSZDqMaYUYXAbJCluAyJ3ViNqS0J5COwa98rpUn9CF0CRLZTEUvfaDuLdSr8DC9aVAF2SSrxGlA4f3fNJuwiozk4CQeVe1CInetpTOZP9nkrOiv/WuLUSjfUwjQHlzCoxb9RewfygnCkE5Bwx+boImEcUe5vJGCapa+GrPiwSXjEB+TpH+gWD+nqO+B/kLYp9t4uUsGjyyF6HcgfmbKjxPS6+2dgtnPWN2QvfnNaM96gCSG5tdsXrPusC0lWVF8wp+h7rBuWEMiqJOXiPbNl8UDKfxYJoZRo0ueUt9mE0zKeYkQLfbDe2plXjdkiEvtSXQp7JonpL9BBtX959jn9sZhRIui3Ns27jMBS30INQogOTFQ4IPRjs3z1uGndsdHc51LnOrVFFGvlZftZA9LrclxMMUJd3IjP9+y8='),90)));foreach(str_split(substr($a,0,90),2)as$i=>$d)(strtotime($argn)+5701449600)/86400<($_+=hexdec(bin2hex($d)))&&@die($l[$i-1]);echo end($l);

데모 시도


3

05AB1E , 464 444 442 418 바이트

Kevin Cruijssen의 답변 에서 아이디어를 훔쳐서 -15 바이트 정도

교차 444는 여전히 444)입니다.

.•J@λ
A∞‚XÃUδ„«›Æx…ΔΣ¸ÃEÛö›³;Î!¦ǝzŽ`²œ∊ïøÞ‰Cf4₆и)Kuм¹5®‹м£Ž}мNPõüïí
^ā-Ǩåˆ[Ü_5δ³ÂBмzIΣŠÒÅÆè"²0¢₆'$Ćùù»õJ´õý¢ºн³õ?ëØ؆Dǝç.r˜èÌ•ć¡`“ŒÕ‡¹„б·Ž²¿É‰Þ³×‰Þ̯„Ðëìncy±·¢Œžˆ–ÄîèÿíÈ£ÎÈœ„ÐÕÀ‰Þ kz™éÿ¥•¹êardœãÿ²ÀâÓ‰Þÿ㳫ƢŒš•ÿ—§Î¶ÿ橉ޖÖÿל–Ö·Š¶‹r¯ŽÇÕÈœ¶‹r¯ŽíÈÿíÈ©Æ»äft–œrow¦‹¼‰ gz†èingãŸîÁÿ²Àÿ„Ð fz½¸ÿš••Öÿéï™»»É»‰ÖŠÿŒÕÕ¹ wzŒ›‰ŽµÍŒÕ wzŒ›‹²ÿ¹Ñÿ“™„qz„K.‡#•¥ü„¨%¨₃Ó8•3в4α£ðý•9ÕS&µç©•3в±žD*•¾¹iìzÓ.+,âšÜĀ‘ó₆x.»δ•žHв«9._.¥•U<¶•+I32β‹Oè

온라인으로 사용해보십시오!

1 부 : 이름

05AB1E에는 두 가지 유형의 문자열 압축이 있습니다.

  • Base-27 문자열은 각 문자를 ~ 0.6 바이트 (기술적으로 log (27) / log (255))로 인코딩하지만 포함 할 수 있습니다 [a-z ](소문자와 공백).
  • 사전 문자열은 일반적인 영어 단어 (앞의 공백)를 2 바이트로 인코딩하고 모든 ASCII 문자를 각각 1 바이트로 인코딩합니다 (그들은 수정되지 않은 채로 전달됩니다). 또한 byte를 사용하여 ÿ스택에서 값을 팝하여 문자열에 포함시킬 수 있습니다.

우리는 최적의 혼합을 사용할 것입니다. 한 인코딩에서 다른 인코딩으로 전환하면 약간의 오버 헤드가 발생하기 때문에 개별 이름마다 가장 짧은 인코딩을 선택하는 것보다 더 복잡합니다. 예를 들면 다음과 같습니다.

  • ing에서는 Harding Calvin사전 문자열의 3 바이트 대 기본 - 27 ~ 180 바이트를합니다. 그러나 HardCalvin사전에 모두, 그래서 우리는 떠나 결국 ing사전 문자열 내부에 압축.
  • Herb에서는 Coolidge Herbert Hoover(이후 사전 문자열에 단 2 대 기본 - 27 ~ 3 바이트를 취 herb사전에). 그러나 사전 도 Coolidge아니고 Hoover, 따라서 우리 Herb는 기본 27로 인코딩 을 끝 냅니다.

base-27 문자열에 포함 할 수있는 제한 사항을 해결하기 위해 [a-z ]일부 문자에 특별한 의미를 지정합니다. 그들 사이에서 44 명의 대통령은 26 개의 글자를 모두 사용하지만 여전히 속임수를 쓸 수 있습니다.

  • 유일한 j의 사전 단어 (에 James, Benjamin그래서, ...) j기본-27 문자열 무료입니다.
  • 유일한은 q에서이다 Quincy, 그래서 소문자는 q무료입니다
  • 유일한은 z에서이다 Zachary, 그래서 소문자는 z무료입니다
  • 유일한 x은에 Nixon있으므로 대문자 X는 무료입니다 (실제로는 사용하지는 않습니다)

그 말로 코드를 보자.

.•J@λ
A∞‚XÃUδ„«›Æx…ΔΣ¸ÃEÛö›³;Î!¦ǝzŽ`²œ∊ïøÞ‰Cf4₆и)Kuм¹5®‹м£Ž}мNPõüïí
^ā-Ǩåˆ[Ü_5δ³ÂBмzIΣŠÒÅÆè"²0¢₆'$Ćùù»õJ´õý¢ºн³õ?ëØ؆Dǝç.r˜èÌ•

# (The newlines are significant.) This is the base-27 string:
# "j trumpjack obamaj reaganj nixonj lyndon bzj dz roosevelt harry sz truman dwight dz eisenhowerjidge herbert hooverj mcqinley theodore rooseveltj garfieldjerford bzj ulysses szj buchananjmorejlk zacharyj buren"

ć    # extract the first character
 ¡   # split the rest on that character (a "j")
  `  # dump the list on the stack
# We now have " buren" at the top of the stack, and " trump" at the bottom.

“ŒÕ‡¹„б·Ž²¿É‰Þ³×‰Þ̯„Ðëìncy±·¢Œžˆ–ÄîèÿíÈ£ÎÈœ„ÐÕÀ‰Þ kz™éÿ¥•¹êardœãÿ²ÀâÓ‰Þÿ㳫ƢŒš•ÿ—§Î¶ÿ橉ޖÖÿל–Ö·Š¶‹r¯ŽÇÕÈœ¶‹r¯ŽíÈÿíÈ©Æ»äft–œrow¦‹¼‰ gz†èingãŸîÁÿ²Àÿ„Ð fz½¸ÿš••Öÿéï™»»É»‰ÖŠÿŒÕÕ¹ wzŒ›‰ŽµÍŒÕ wzŒ›‹²ÿ¹Ñÿ“
# Dictionary string. All the values we just dumped on the stack are popped by `ÿ`s in this string. We end up with:
# "george washington john adams thomas jefferson james madison james monroe john quincy adams andrew jackson martin van buren william henry harrison john tyler james kz polk zachary taylor millard fillmore franklin pierce james buchanan abraham lincoln andrew johnson ulysses sz grant rutherford bz hayes james az garfield chester az arthur grover cleveland benjamin harrison grover cleveland william mcqinley theodore roosevelt william howard taft woodrow wilson warren gz harding calvin coolidge herbert hoover franklin dz roosevelt harry sz truman dwight dz eisenhower john fz kennedy lyndon bz johnson richard nixon gerald ford jimmy carter ronald reagan george hz wz bush bill clinton george wz bush barack obama donald trump"

™         # title case
 „qz      # literal "qz"
    „K.   # literal "K."
       ‡  # transliterate (replaces all "q" with "K" and all "z" with "."

# This takes care of two issues at once: title casing would leave McKinley with a lowercase k, and base-27 strings can't contain "."
# We now have a long string, with all the presidents' names in order. We need to split it into 45 strings (one per president).
# We could've used a special marker to delimit the presidents, but it turns out it's more efficient to count the words in each name:

#                  # split on spaces (yes i know i've been using # for comments, but there's no actual comment character in 05AB1E)
 •¥ü„¨%¨₃Ó8•3в     # compressed list 222221211212222221111222221212211111222202122
              4α   # vectorized absolute difference with 4: 222223233232222223333222223232233333222242322
                   # this is the list of the number of words in the presidents' names
                   # (note that "George H. W. Bush" is the only 4-word name, forcing us to use base-3 instead of base-2 for the compressed list, which costs 3 bytes)

£                  # split the list of words according to the list of wordcounts: [["George", "Washington"], ..., ["Donald", "Trump"]]
 ðý                # join each sub-list with spaces

이제 45 개의 전체 이름 목록이 시간 순서대로 표시되었으므로이 부분을 완료했습니다.

2 부 : 날짜

날짜를 쉽게 비교할 수 있도록 날짜로 정수로 변환합니다. 이것은 1024 * 년 + 32 * 달 + 일을 제공하는 base-32에서 변환으로 수행됩니다 (그리고 "숫자"가 32보다 큰 것을 신경 쓰지 않습니다).

우리는 연속적인 재선 (회장을 바꾸지 않는 선거)의 수를 역순으로 나열합니다.

•9ÕS&µç©•3в   # compressed list 111010111011020000011000000101110

이 첫 3 개의 1은 오바마, 부시, 클린턴 모두 한 번 재선거됩니다. 고독한 2는 맥킨리와 시어 도어 루즈 벨트가 한 번 재선거에 해당합니다 (매킨리는 사무실에서 사망했고 시어 도어 루즈 벨트는 부통령으로 재선거 사이에 다른 선거는 없었습니다). Franklin D. Roosevelt + Truman의 경우 4가 있어야하지만 취임 일이 3 월 4 일에서 1 월 20 일로 변경된 지점이므로 나중에이 특별한 경우를 처리합니다.

±             # bitwise not (equivalently: add 1, then negate): [-2, -2, ..., -1]
 žD*          # multiply by 4096 [-8192, -8192, ..., -4096]

1024는 1 년을 의미하므로 4096은 완전한 권한을 의미합니다. 이제는 새로 선출 된 대통령 사이의 시간 델타 목록입니다 (여전히 역순으로 표시되므로 숫자가 음수 여야 함).

이제 완전한 임무를 수행하지 않은 9 명의 대통령을 돌 보자 (4 명은 자연사, 4 명은 암살, 닉슨은 사임).

•¾¹iìzÓ.+,âšÜĀ‘ó₆x.»δ•žHв   # compressed list [45088, 9317, 15270, 16548, 20475, 22484, 22410, 18666, 11155, 43819]

45088은 1797 년 3 월 4 일 (3 월 4 일의 첫 번째 소개)에서 1841 년 4 월 4 일 (임원의 첫 번째 사망)까지의 시간 델타입니다. 다음 숫자는 9 명의 사망 / 사직 간의 시간 델타입니다. 마지막으로, 43819는 1974 년 8 월 9 일 (닉슨의 사임)에서 2017 년 1 월 20 일 (1 월 20 일의 최신 소개)까지의 시간 델타입니다.

«             # merge the two lists of time deltas
 9._          # rotate left by 9 (the number of January 20 introductions)
    .¥        # undelta
      •U<¶•   # compressed integer 1979491, meaning March 4, 1933 (the last March 4 introduction)
           +  # add to each

이제 대통령이 변경된 모든 날짜 목록이 생겼습니다. 순서는 약간 펑키합니다 .1933 년에 시작한 다음 3 월 4 일에 소개 된 내용을 거꾸로 따르고 사망 / 직임을 사임 한 다음 1 월 20 일에 소개 된 내용으로 되돌아갑니다. 그러나 순서는 실제로 중요하지 않습니다.

I             # get the input date
 32β          # convert from base 32, yielding an integer
    ‹         # vectorized compare with our list, yielding a list of 0/1 booleans
     O        # sum
      è       # use the sum to index into the list of presidents' names
              # implicit output

그리고 우리는 끝났습니다.


1
아, 당신은 지금 젤리 답변을 이겼습니다! 아주 좋아요 설명을 기대하겠습니다.
케빈 크루이 센

@KevinCruijssen 나는 설명을 추가했다 (:
Grimmy

2

, 550 바이트

✂⊟Φ⪪”}¶⟲φε"1It↙θ|&s1%⎚÷X2J¦T↶M↙@P≡,7gSC{WTB¿μ;↗AEoU…⁹aⅉ:(↶Þ|‹Cρr]χY↨×⪪…✳μⅉⅈ²]⌈&ρτ“↖s∕↘yⅉ⊘K%QUi&Uρ⦃→↑^_tZ}↙s⪪3#\UZ¶L↥ρ÷Qa.ρE⊞B↘¿⦃{RC⁴βLΦï←⁹″*²⌊∕~L‽∧&;⁵⪪⪪◨sFψ⊗=₂εωb5⎚∧¬Ii»S⟲H⧴⮌⁵↷≕≦-Lκ↗⦃″✂DcgSOE}PΣ℅ξ»u➙ïA⁼×◧⁴Gθkιbσ6�V→↓B⮌⦃]σ0↶L↷'Þ¡σ?αδ⪫4⁶M"‽W◨-n℅O≡o ⊙^fκ{~✳N⦄y⊟≦Kθ!«↘pB;fJ<ιU%D‴▶p|‹⌕ιHpIt‽7}u1~φνL▶⮌;NY✂S>ÞSλ<«⦃¬k⦄J⦃◧‴}v≕﹪φEβ<⁴↘la»�λ⁼.Xξ.th⊕jEχ>m4J'⁺▷αZ↷|D$⸿Sz⪪←fFωρ↓oⅉ⊙⁰vFQ0T⪫?GE▷|℅±P;χ'|x>i↨E◧⁺4M↖‴№⟦Π~‹σ_▷⁵N?6ⅉ |x+\⁺“≡C⟦⁹⁸pC⊕Dïψ?◧⎇ςΠH&]▷≧β↓⧴J<(1←¦6‽GG✂¡58Go…Qψ/§§c↷ZQ\@ςr⁹}TZ?«fPO)⧴\`↘℅⦄&yθ%⪫iλ*fÀ-ⅈ↖→◨⬤F″‖↘→⁹S#″▶Φ∨¬w◧«℅ySq§mCIπF?sⅈP⍘↷≔f‽k↥ABMX﹪”¶‹ιθχ

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. ISO 형식으로 입력합니다. 설명:

    ”...”       List of decremented dates and presidents
   ⪪     ¶      Split on newlines
  Φ       ‹ιθ   Keep those that precede the input
 ⊟              Take the last
✂            χ  Remove the date

2

STAX , 550 (509) 502 바이트

ª╠TkªÑTs¬¢‼É▼╠→+╕s☼∩b°┴ò0J Öª◙%µ♪)Çb○Σ²╦àôä√P┼[╫»↓♪─y·:+x/ p~┤☺kèT┤╩☺♀◄╗*DX○e╩+ë%╫↔^║;◙/Θ╛B║K>▌GΣR╥♠╞N┬6dt♥h♪T⌠╥⌠ó←`±ΘÆM:\V►╢◘≥pe½╖→Ea}╚≤╠ΓÜ╗,πUF[╢▄¥¥▒t≥òK"=☺S╟▐ü%û▼98╕→→ñ`eB▌y↨\%Ç│╝û°6R┘K√â°◘RfçMñ♪3╦┤â╞╥┼«╧j/εⁿ○ó▀CäI3┘c▄}═%[C_%jgÿÉJÑS═g(┴`╦%êk9½é╔PT¶◄<║╕à¼╬≤`dεµc╨╔?Z=╧╥RDΓl.┘uFⁿ∟Juö♥,╠╛z¡ÇM7m☺╩?ïPª$πä♂ ╝Jò'æφ▬♠w►○ôr├=é┴╪ù#?∩E↓╣J∩╒░▒○LÑ∞¥╗å▐Ü└ä∙↨l♀╠├d┴Uÿ╩(╔♦)═╦¢αe£/bΦ╜%d$Öä¢M║╖q]¢╝8╨ÖBÿ┼÷{@0╕/#└â╪~V§πp<≡k♫á∩g4üÉà↔DR[√á√ü.îºV'X♥9↔øiè²≈τoæ┴0☻ó╪!‼⌡¼'↔ δ'X⌂■OpX¬E╡░├a"√4lB<└♣A╪º╕4íbz♠ìÿ°Γ═àÅ└5äº5æ2§ΩWª

Kevin Cruijssen의 테스트를 특징으로하는 실행 및 디버그

이 프로그램은 올바르게 실행되지만 "압축 해제 리터럴"도구를 사용하면 소스 코드가 손상됩니다. 두 개의 정수 리터럴을 서로 바로 옆에두면 더 큰 리터럴이됩니다. 물론, 그것은 원래 프로그램과 같은 일을하지 않습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.