ใครคือประธานาธิบดีแห่งสหรัฐอเมริกา


56

ท้าทาย

เขียนโปรแกรมที่ใช้ป้อนข้อมูลต่อวันตั้งแต่วันที่ 30 เมษายน พ.ศ. 2332 ถึงวันที่ 21 สิงหาคม 2562 และกลับมาเป็นผู้ส่งออกซึ่งเป็นประธานาธิบดีของสหรัฐอเมริกาในวันนั้น

หมายเหตุ

สำหรับรายชื่อประธานาธิบดีสหรัฐรูปแบบของชื่อและระยะเวลาของการเป็นประธานาธิบดีดูด้านล่าง:

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

ประธานาธิบดีมีจุดประสงค์เพื่อรวมวันแรกและไม่รวมวันสุดท้าย ตัวอย่างเช่น "4 มีนาคม 2404 - 15 เมษายน 2408; อับราฮัมลินคอล์น" หมายความว่าลินคอล์นเป็นประธานาธิบดีตั้งแต่ 4 มีนาคม 2404 ถึง14เมษายน2408

นี่คือรหัสกอล์ฟโปรแกรมที่สั้นที่สุดในแต่ละภาษาชนะ

ตัวอย่าง

ข้อมูล: "7 กุมภาพันธ์ 1865" ผลลัพธ์: "Abraham Lincoln"


18
สวัสดียินดีต้อนรับสู่ CGCC! ดูเหมือนว่าจะเป็นความท้าทายที่ดี แต่ความท้าทายทั้งหมดควรอยู่ในตัวเอง แทนที่จะลิงค์ Wikipedia โปรดมีรายชื่อที่นี่ของประธานาธิบดีและช่วงเวลาของพวกเขา (โดยเฉพาะในบล็อกโค้ดดังนั้นแถบเลื่อนจะปรากฏขึ้น) นอกจากนี้ฉันขอแนะนำให้มีรูปแบบอินพุตที่ยืดหยุ่นดังนั้นผู้คนสามารถป้อนเป็นสตริงในรูปแบบใดก็ได้จำนวนเต็มสามจำนวนหลวมวัตถุวันที่เป็นต้นว่าพวกเขาเห็นว่าเหมาะสมกับภาษาที่พวกเขาเลือก
Kevin Cruijssen

3
นอกจากนี้สำหรับความท้าทายในอนาคตคุณควรโพสต์สิ่งเหล่านี้ในSandbox of Prop ท้าทายที่ดีที่สุด คุณสามารถรับข้อเสนอแนะและทำให้ความท้าทายดีขึ้นก่อนที่จะโพสต์ไปยังหน้าหลัก เพลิดเพลินไปกับการพักผ่อนของคุณ! :)
Kevin Cruijssen

11
รูปแบบ IO มีความยืดหยุ่นเพียงใด
qwr

15
WolframAlpha["president on "<>#]&ฉันแน่ใจว่า Mathematica บริสุทธิ์มี builtin อยู่ที่ไหนสักแห่ง แต่จนกว่าฉันจะพบสิ่งที่เรียกว่าฉันติดอยู่กับ W | A
พาเวล

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และเอาท์พุทบีบอัดจะถูกแปลงเป็นฐาน-64 เพื่อให้ตัวละครทุกตัวมี ASCII พิมพ์และฉันสามารถโพสต์ได้ที่นี่หรือใช้พวกเขาในTIO

ในสคริปต์สตริงจะถูกหารด้วย-และวนซ้ำ สำหรับการวนซ้ำแต่ละครั้ง:

  • $dถูกกำหนดเป็นค่าการวนซ้ำปัจจุบัน (ซึ่งเป็นวันที่เริ่มต้นของประธานาธิบดี -1 วัน) และตัวแปรลูป ( $i) เพิ่มขึ้นทีละหนึ่ง
  • หากวันที่ป้อนมีค่ามากกว่า$dนั้น$mจะถูกตั้งค่าเป็นค่าการวนซ้ำถัดไป (ซึ่งเป็นชื่อประธานาธิบดีสำหรับ$d) และตัวแปรลูป ( $i) เพิ่มขึ้นอีกครั้ง วิธีนี้ช่วยให้วนลูปได้รับชื่อประธานาธิบดี แต่กระโดดข้ามพวกเขาในการทำซ้ำ
  • หากวันที่ป้อนไม่ใหญ่กว่า$dหมายความว่าการวนซ้ำก่อนหน้านี้เป็นประธานาธิบดีที่ถูกต้องดังนั้น$mจะพิมพ์โดยใช้dieฟังก์ชั่นสิ่งนี้จะหยุดโปรแกรมทั้งหมดหลังจากพิมพ์ชื่อ

ในตอนท้ายถ้าลูปเสร็จแล้ว (ซึ่งแปลว่าไม่มีdieการเรียก), ชื่อประธานาธิบดีคนสุดท้ายถูกพิมพ์ออกมาเนื่องจากเรารู้ว่าไม่ใช่ประธานาธิบดีคนก่อนหน้าที่มีการแข่งขัน (ดังนั้นโดยพื้นฐานแล้วอะไรก็ตามJanuary 19, 2017) พิมพ์ชื่อประธานาธิบดีคนสุดท้ายแม้ว่ามันจะเป็นJanuary 1, 3999.


บันทึก 20 ไบต์โดยแทนที่สตริง gz ของคุณด้วยgist.github.com/007/b40b52da40b454d2196d0a807a6fcfaf
Ryan Moore

ฉันไม่ทราบ PHP แต่คุณสามารถลบ base64 และแทรกอักขระดิบที่ไม่สามารถพิมพ์ได้ (คุณสามารถระบุ hexdump ได้)
MilkyWay90

@RyanMoore ขอบคุณสำหรับสตริงบีบอัดที่ดีกว่าเศร้าฉันไม่ได้อยู่ในการควบคุมของคำตอบนี้อีกต่อไปและวัตถุประสงค์ของฉันที่มีจำนวนมากขึ้นคะแนน (และบางเกินไปโหวตลง) ได้ถูกลบออกจากมัน ( ในการแก้ไขนี้ ) ดังนั้นฉันจะไม่แก้ไขหรือเล่นกอล์ฟคำตอบนี้อีกต่อไปแม้ว่าจะมีความเป็นไปได้ในการเล่นกอล์ฟอยู่
กลางคืน 2

@ MilkyWay90 นั่นเป็นไปได้อย่างสมบูรณ์ แต่ฉันโพสต์รุ่นนี้อย่างมีจุดประสงค์เพื่อให้มีรหัสที่สามารถอ่านได้ที่นี่และลิงค์ของ TIO โดยพื้นฐานแล้วนี่ไม่ได้หมายความว่าจะเป็นคำตอบแบบฮาร์ดคอร์
Night2

15

Bash , 1229 1124 ไบต์

-103 ไบต์ด้วยความคิดเห็นที่ยอดเยี่ยมของ @ GammaFunction ลบการแทนที่ที่ไม่ก่อผลสองสามข้อ (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

ลองออนไลน์!

คู่มือการบีบอัดจำนวนมาก :)


เพิ่มเติมอีกสองสามข้อ: กำจัดออกไปX=($X)โดยวนเป็นfor z in $X$ X ใน $ IFS ใช้[ -lt ]และใช้แทน$T สองสามบรรทัดสุดท้ายโดยรวมควรมี 1191 ไบต์${T[0]}
GammaFunction

1,092 ! ฉันทำให้การแยกวิเคราะห์เดือนง่ายขึ้น (ตัวอย่างเช่นถ้าเราผ่านเดือนมิถุนายนและเริ่มต้นด้วย J จะต้องภายในเดือนกรกฎาคมฉันเปลี่ยนการทดสอบเป็น[ ${T#${M[++i]}*} ]ตอนนี้เราสามารถออกจากเดือนธันวาคมได้อย่างสมบูรณ์) ฉันยังรวมถึงผู้นำ:ในชื่อไม่กี่ (ทำสิ่งนี้เพื่อ:Johnหมายถึงการทำให้ตัวคั่นทั้งหมด:แทน#)
GammaFunction

12

T-SQL, 1169 981 979 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

ไม่ได้ประหยัดมากเท่าที่ฉันคาดหวังอาจเป็นเพราะรหัสที่ใช้ในการแปลง / ถอดรหัส

นี่คือเวอร์ชั่นดั้งเดิมซึ่งเทียบเท่ากับโค้ดที่รันหลังจากสตริงที่เข้ารหัสถูกคลาย (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

การขึ้นบรรทัดใหม่มีไว้เพื่อให้สามารถอ่านได้เท่านั้น

การป้อนข้อมูลที่นำมาจากตารางที่มีอยู่ก่อนกับฟิลด์ , ต่อกฎ IO ของเรา วันที่ป้อนข้อมูลมีรูปแบบเป็นจำนวน 8 หลักdฉันINTiYYYYMMDD

เทคนิคเล็ก ๆ น้อย ๆ ที่ฉันบันทึกไบต์:

  • ฉันเรียงลำดับประธานาธิบดีจากมากไปน้อยดังนั้นฉันไม่จำเป็นต้องเพิ่มORDER BYรหัส
  • ฉันลบ 1 ในวันที่ "เริ่มต้น" ของแต่ละคำศัพท์ดังนั้นฉันจึงสามารถใช้<แทน<=
  • String แยกเป็นมากสั้นกว่ารายการใหญ่ของVALUES()จะแม้ว่าฉันต้องแล้วทำลายสตริงออกจากกันด้วยและSUBSTRINGLEFT
  • แก้ไข : บันทึก 2 ไบต์โดยเปลี่ยนSUBSTRING()เป็นSTUFF()

การใช้สตริงที่บีบอัดที่เข้ารหัส Base64 ใน SQL

(เพิ่มในชุดคำแนะนำ SQL Tips )

ดังนั้น Microsoft จึงเพิ่ม a COMPRESSและDECOMPRESSฟังก์ชั่นย้อนกลับไปใน SQL 2016 ซึ่งจัดการ GZIP; ปัญหาคือมันส่งกลับ a VARBINARYซึ่งแม้ว่าจะสั้นลงในไบต์ (เมื่อเก็บไว้ในVARBINARYเขตข้อมูลSQL ) จะนานกว่าเมื่อแสดงเป็นตัวอักษร (hex ดิบ) ซึ่งทำให้ไม่เหมาะสำหรับการเล่นกอล์ฟ

การแปลงเป็น 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 ไบต์ของรหัสพิเศษที่จะคลายการบีบอัดสตริงที่เข้ารหัสดังนั้นใช้เฉพาะกับสตริงที่ยาวมากเท่านั้น

แก้ไข : บันทึกไว้ 2 ไบต์ในรหัสขยายกับแทนCASTCONVERT


12

Excel, 1243 1206 1180 ไบต์

-37 bytes โดยการลบออกจากวันที่ทั้งหมด
-26 bytes โดยเล่นซอกับค่าลบ

=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")

อินพุตอยู่ในเซลล์ที่A1มีรูปแบบYYYYMMDDเนื่องจาก Excel ไม่ชอบวันที่ก่อนปี 1900

ฉันไม่รู้วิธีบีบอัดสำหรับวันที่หรือชื่อที่จะไม่เพิ่มจำนวนไบต์ วิธีการ "ลบ [ค่า] จากวันที่ทั้งหมด" สามารถนำไปใช้กับโซลูชันของใครก็ได้


ฉันพบโซลูชัน 1102 ไบต์ใน Google ชีตโดยใช้หลักการเดียวกัน 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()มีอาร์กิวเมนต์ตัวเลือกที่ 3 ตัวเลือกmatch_typeที่กำหนดว่าจะใช้การจับคู่แบบตรงทั้งหมดหรือไม่ การยกเว้นอาร์กิวเมนต์นั้นใช้ค่าเริ่มต้นซึ่งเป็นการจับคู่ "น้อยกว่าหรือเท่ากับ" ดังนั้นรหัสนี้จึงถูกต้อง
BradC

@BradC Ah ไม่ทราบว่า ขอบคุณที่อธิบาย! +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(เช่น20190821สำหรับ 21 สิงหาคม 2019)

-16 ไบต์ขอบคุณที่@Grimy

ลองออนไลน์หรือตรวจสอบกรณีทดสอบอีกสองสามข้อ

คำอธิบาย:

เราเริ่มต้นด้วยการสร้างรายการของประธานาธิบดีตามลำดับเวลา:

.•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
@Grimy ฉันไม่สามารถคัดลอกได้จริงดังนั้นจึงต้องบีบอัดตัวเองอีกครั้งหลังจากที่ฉันเห็นสิ่งที่คุณทำ ฉันตรวจสอบชื่อประธานาธิบดีทุกคนและทุกตัวอักษรถูกนำไปใช้ แต่วิธีที่ดีในการบันทึกไบต์ด้วยการกำหนดหัวเรื่องแรกแล้วใช้ตัวอักษรตัวพิมพ์เล็กซึ่งไม่มีอยู่อีกต่อไปในการแปลงเป็นจุดและตัวอักษรตัวพิมพ์ใหญ่ ขอบคุณสำหรับ -16!
Kevin Cruijssen

ชื่อเหล่านั้นจำนวนมากเป็นคำในพจนานุกรมซึ่งนำไปสู่การปรับปรุงครั้งใหญ่ โดยเริ่มต้นนี่คือ -32
Grimmy

1
@Grimy อาจจะลองใช้วิธีการนั้นในสัปดาห์หน้า กำลังจะกินและพรุ่งนี้ฉันจะยุ่งกับงานเนื่องจากกำหนดเวลา
Kevin Cruijssen

1
464 สิ่งนี้ยังไม่สามารถแก้ไขได้ แต่ฉันไม่คิดว่ามันจะเอาชนะ426ของ Jelly ได้ การบีบอัดสตริงของพวกเขาดีกว่า
Grimmy

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ที่พิมพ์ชื่อประธาน

ลองออนไลน์! หรือดู (เควิน Cruijssen) ในการทดสอบในตัว

อย่างไร?

“¡Ẹị’ḃ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Ðþɼ©ṢƈḅṬḊṬɠṅÞ»Ỵ¤

ลองออนไลน์!

ลิงก์ monadic ที่ใช้เป็นอาร์กิวเมนต์เป็นวันที่ในรูปแบบ YYYYMMDD และส่งคืนสตริงด้วยคำตอบ

กรณีทดสอบ (ยืมมาจากคำตอบ 05AB1E ของ @ KevinCruijssen )


4

JavaScript (Node.js) ,  855 851  803 ไบต์

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 ไบต์

-15 หรือมากกว่านั้นโดยการขโมยความคิดจากคำตอบของ Kevin Cruijssen

ข้าม 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 ไบต์แต่ละรายการ (พวกเขาเพิ่งผ่านไปโดยไม่แก้ไข) พวกเขายังสามารถใช้ไบต์ÿเพื่อป๊อปอัพค่าจากสแต็กและฝังไว้ในสตริง

เราจะใช้ทั้งสองอย่างผสมผสานกันอย่างเหมาะสมที่สุด เนื่องจากการสลับจากการเข้ารหัสหนึ่งไปเป็นอีกอันหนึ่งมีค่าใช้จ่ายสูงจึงมีความซับซ้อนมากกว่าการเลือกการเข้ารหัสที่สั้นที่สุดสำหรับแต่ละชื่อ ตัวอย่างเช่น:

  • ingในHarding Calvinใช้เวลา ~ 1.8 ไบต์ในฐาน-27 VS 3 ไบต์ในสตริงพจนานุกรม แต่HardและCalvinทั้งคู่อยู่ในพจนานุกรมดังนั้นเราจึงสิ้นสุดการปล่อยให้ingไม่มีการบีบอัดภายในสตริงพจนานุกรม
  • HerbในCoolidge Herbert Hooverใช้เวลา ~ 3 ไบต์ในฐาน-27 เทียบกับเพียง 2 ในสตริงพจนานุกรม (ตั้งแต่herbอยู่ในพจนานุกรม) แต่ไม่Coolidgeว่ามิได้Hooverอยู่ในพจนานุกรมเพื่อให้เราจบลงด้วยการเข้ารหัสHerbเป็นฐาน-27

ในการหลีกเลี่ยงข้อ จำกัด ที่สตริง 27 ฐานสามารถมี[a-z ]ได้เราจึงกำหนดความหมายพิเศษให้กับตัวอักษรบางตัว ระหว่างพวกเขาประธานาธิบดี 44 คนใช้ตัวอักษรทั้งหมด 26 ตัว แต่เรายังสามารถเล่นลูกเล่นได้:

  • js เท่านั้นที่อยู่ในคำในพจนานุกรม ( 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: วันที่

เพื่อให้ง่ายต่อการเปรียบเทียบวันที่เราแปลงเป็นจำนวนเต็ม ทำได้ด้วยการแปลงจาก base-32 ซึ่งให้ 1024 * ปี +32 * เดือน + วัน (และไม่สนใจว่าปี "หลัก" มากกว่า 32)

เราเริ่มต้นด้วยรายการจำนวนการเลือกตั้งใหม่อย่างต่อเนื่อง (การเลือกตั้งที่ไม่เปลี่ยนประธานาธิบดี) ตามลำดับเวลาย้อนกลับ:

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

1s สามตัวแรกนั้นสอดคล้องกับ Obama, Bush และ Clinton ทั้งหมดได้รับการเลือกตั้งอีกครั้ง โลน 2 สอดคล้องกับ McKinley และ Theodore Roosevelt ทั้งคู่ได้รับการเลือกตั้งอีกครั้ง (McKinley เสียชีวิตในที่ทำงานและ Theodore Roosevelt เป็นรองประธานาธิบดีของเขาดังนั้นจึงไม่มีการเลือกตั้งอื่น ๆ ในระหว่างการเลือกตั้งใหม่) ควรมี 4 ในนั้นสำหรับ Franklin D. Roosevelt + Truman แต่นี่ก็เป็นจุดที่วันเข้ารับตำแหน่งเปลี่ยนจาก 4 มีนาคมเป็น 20 มกราคมดังนั้นเราจึงจัดการกรณีพิเศษนี้ในภายหลัง

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

จำไว้ว่า 1024 หมายถึงปีดังนั้น 4096 หมายถึงเอกสารเต็ม นี่คือรายการของเวลา deltas ระหว่างประธานาธิบดีที่ได้รับการเลือกตั้งใหม่ (ยังอยู่ในลำดับย้อนกลับซึ่งเป็นสาเหตุที่ตัวเลขต้องเป็นค่าลบ)

ทีนี้มาดูแลประธานาธิบดีทั้ง 9 คนที่ไม่ได้รับใช้งานอย่างเต็มที่ (4 คนเสียชีวิตจากสาเหตุตามธรรมชาติ, ลอบสังหาร 4 คน, นิกสันลาออก):

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

45088 เป็นเวลาเดลต้าจาก 4 มีนาคม 2340 (การแนะนำครั้งแรกใน 4 มีนาคม) ถึง 4 เมษายน 2384 (ตายครั้งแรกในที่ทำงาน) ตัวเลขต่อไปนี้คือเวลาที่ใช้ในการเสียชีวิตระหว่าง 9 ครั้ง / การลาออก ในที่สุด 43819 เป็นเวลาเดลต้าจาก 9 สิงหาคม 2517 (การลาออกของนิกสัน) ถึง 20 มกราคม 2560 (การแนะนำล่าสุดในวันที่ 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 จากนั้นตามด้วยการแนะนำ 4 มีนาคมย้อนหลังในเวลาจากนั้นการเสียชีวิต / การลาออกไปข้างหน้าตามกาลเวลาจากนั้นกลับไปตามการแนะนำ 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
โอ้คุณยังเอาชนะคำตอบของเยลลี่ได้แล้วตอนนี้! ดีมาก. มองไปข้างหน้าเห็นคำอธิบาย
Kevin Cruijssen

@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 bytes

ª╠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

โปรแกรมนี้ทำงานอย่างถูกต้อง แต่ถ้าคุณใช้เครื่องมือ "Uncompress Literals" มันจะทำให้ซอร์สโค้ดเสียหาย ท้ายที่สุดจะใส่ตัวอักษรจำนวนเต็มสองตัวติดกันซึ่งจะทำให้ตัวอักษรใหญ่ขึ้นหนึ่งตัว แน่นอนว่ามันไม่ได้ทำในสิ่งเดียวกันกับโปรแกรมดั้งเดิม

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.