Wyzwanie
Napisz program, który pobiera dane wejściowe od 30 kwietnia 1789 r. Do 21 sierpnia 2019 r. I zwraca dane wyjściowe, który był prezydentem USA tego dnia.
Notatki
Aby zapoznać się z listą prezydentów USA , formatem ich nazwisk i okresem ich prezydentury, patrz poniżej:
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
Prezydencja ma obejmować pierwszy dzień, a ostatni wykluczony. Na przykład „4 marca 1861 r. - 15 kwietnia 1865 r .; Abraham Lincoln” oznacza, że Lincoln był prezydentem od 4 marca 1861 r. Do 14 kwietnia 1865 r.
Jest to golf-golf, wygrywa najkrótszy program w każdym języku.
Przykład
Dane wejściowe: „7 lutego 1865 r.” Dane wyjściowe: „Abraham Lincoln”
WolframAlpha["president on "<>#]&
Jestem pewien, że czysta Mathematica ma gdzieś wbudowaną wersję, ale dopóki nie znajdę jak to się nazywa, trzymam się W | A.WolframAlpha["US president on "<>#]&
dla mnie wynik jest nieprawidłowyOdpowiedzi:
PHP , 936 bajtów
Wypróbuj online!
Testy: Wypróbuj online!
Kod do testów jest taka sama logika, ale trochę inaczej zastąpić
die(...)
zreturn...
tak mogę pętli nad testami.Stworzyłem ciąg mający datę rozpoczęcia prezydentury minus 1 dzień w formacie
YYYYMMDD
i nazwisko prezydenta, oddzielone-
. Przykład:17890429-George Washington-17970303-John Adams-18010303-Thomas Jefferson-...
Ciąg ten jest kompresowany za pomocą gzdeflate, a także skompresowane dane wyjściowe są konwertowane na base-64, dzięki czemu wszystkie znaki można wydrukować w formacie ASCII i mogę je tutaj zamieścić lub użyć w TIO .
W skrypcie ciąg jest dzielony
-
i zapętlany. Dla każdej iteracji pętli:$d
jest ustawiony na bieżącą wartość iteracji (która jest datą rozpoczęcia prezydenta -1 dzień), a zmienna pętli ($i
) jest zwiększana o jeden.$d
, wówczas$m
ustawiana jest następna wartość iteracji (która jest nazwą prezydenta$d
), a zmienna pętli ($i
) jest ponownie zwiększana o jeden. Pozwala to pętli uzyskać nazwiska prezydenta, ale przeskakiwać nad nimi w iteracjach.$d
, oznacza to, że poprzednia iteracja była poprawnym prezydentem, więc$m
jest drukowana za pomocądie
funkcji, to zatrzyma cały program po wydrukowaniu nazwy.Na koniec, jeśli pętla jest zakończona (co oznacza, że nie
die
została wywołana), wypisywane jest nazwisko ostatniego prezydenta, ponieważ wiemy, że żaden z poprzednich prezydentów nie ma dopasowania (więc w zasadzie wszystko po nimJanuary 19, 2017
) drukuje nazwisko ostatniego prezydenta, nawet jeśli jestJanuary 1, 3999
.źródło
Bash ,
12291124 bajtów-103 bajtów z doskonałymi komentarzami @ GammaFunction, usuwając kilka nieproduktywnych podstawień (Adams) i zmieniając kod, aby użyć przesunięcia daty od poprzedniej daty zamiast daty bezwzględnej dla każdej prezydentury.
Wypróbuj online!
Dużo ręcznej kompresji :)
źródło
X=($X)
, zapętlając, jakfor z in $X
podzieli X $ na $ IFS. Użyj[ -lt ]
i użyj$T
zamiast${T[0]}
. Ostatnie kilka wierszy powinno mieć ogółem 1191 bajtów[ ${T#${M[++i]}*} ]
. Teraz możemy całkowicie zrezygnować z grudnia). Uwzględniłem także:
kilka nazwisk (robiąc to:John
, aby:
zamiast tworzyć wszystkie ograniczniki#
).T-SQL,
1169 981 979977 bajtówŚwięta krowa, wymyśliłem kompresję ciągów w SQL ( dostępną w SQL 2016 i nowszych ):
Nie zapisuje zupełnie jak miałem nadzieję, że może, prawdopodobnie ze względu na ilość kodu potrzebnego do konwersji / deconvert.
Oto oryginalna wersja, która jest równoważna kodowi, który działa po dekompresji zakodowanego ciągu (1169 bajtów):
Podziały linii służą wyłącznie do odczytu.
INT
YYYYMMDD
Kilka sztuczek, których użyłem do zapisania bajtów:
ORDER BY
do kodu<
zamiast<=
VALUES()
, chociaż muszę go następnie rozdzielić za pomocąSUBSTRING
iLEFT
.SUBSTRING()
naSTUFF()
Korzystanie ze skompresowanych ciągów kodowanych w Base64 w SQL
(Dodano do wątku Porady SQL )
Tak więc Microsoft dodał funkcję
COMPRESS
aDECOMPRESS
w SQL 2016, która obsługuje GZIP; Problem polega na tym, że zwraca aVARBINARY
, która chociaż krótsza w bajtach (gdy jest przechowywana wVARBINARY
polu SQL ), jest dłuższa, gdy jest wyświetlana w postaci znaków (surowy hex), co czyni ją nieodpowiednią do gry w golfa.Konwersja do Base64 jest oczywiście odpowiedzią, ale znalezienie krótkiej, prostej implementacji było wyzwaniem. Oparłem swoją wersję na starej odpowiedzi na SO , która daje nam większość potrzebnych danych, chociaż nie korzysta ona z nowych funkcji GZIP. Po prostu musiałem wstawić nowe funkcje w odpowiednie miejsce i nieco zagrać w golfa.
Aby użyć tej metody we własnym kodzie:
To
7573 dodatkowych bajtów kodu do dekompresji zakodowanego ciągu, więc wyraźnie używaj go tylko dla bardzo długich ciągów.EDYCJA : Zapisano 2 bajty w kodzie dekompresji za pomocą
CAST
zamiastCONVERT
.źródło
Excel,
124312061180 bajtów-37 bajtów, odejmując od wszystkich dat
-26 bajtów, bawiąc się wartościami odejmowania
Dane wejściowe są w
A1
formacie komórkowym ,YYYYMMDD
ponieważ Excel nie lubi dat sprzed 1900 r.Nie znam metody kompresji dla dat lub nazw, które nie dodałyby więcej bajtów. Metoda „odejmij [wartość] od wszystkich dat” może mieć zastosowanie do każdego rozwiązania.
Znalazłem rozwiązanie 1102 bajtów w Arkuszach Google na tej samej zasadzie. Excel nie ma tej
Split
funkcji, więc nie można go przetłumaczyć.źródło
19000101
?MATCH()
ma opcjonalny trzeci argument match_type, który określa, czy użyć dopasowania ścisłego. Wykluczenie tego argumentu powoduje użycie wartości domyślnej, która jest dopasowaniem „mniejszym lub równym”, więc ten kod jest poprawny.05AB1E ,
587584568 bajtówDane wejściowe są połączoną datą w formacie
yyyyMMdd
(tj20190821
. 21 sierpnia 2019 r.).-16 bajtów dzięki @Grimy .
Wypróbuj online lub sprawdź kilka innych przypadków testowych .
Wyjaśnienie:
Zaczynamy od utworzenia listy prezydentów w kolejności chronologicznej:
Następnie tworzymy listę wszystkich dat jako liczb całkowitych w formacie
yyyyMMdd
(kolejność nie ma znaczenia dla tej listy):Następnie używamy danych wejściowych do określenia wyjściowego nazwiska prezesa na podstawie dat z listy:
Zobacz tę końcówkę 05AB1E kopalni (sekcje Jak kompresować strun nie jest częścią słownika? , Jak skompresować dużych liczb całkowitych? I Jak kompresować list całkowitych? ) , Aby zrozumieć, jak działają wszystkie skompresowane łańcuchowe, całkowite i listy.
źródło
Galaretka ,
431 428 427426 bajtówPełny program akceptujący ciąg,
YYYYMMDD
który wypisuje nazwisko prezydenta.Wypróbuj online! Lub zobacz pakiet testowy (Kevina Cruijssena).
W jaki sposób?
źródło
Galaretka , 454 bajtów
Wypróbuj online!
Monadyczny link przyjmuje jako argument datę w formacie RRRRMMDD i zwraca ciąg z odpowiedzią.
Przypadki testowe (zapożyczone z odpowiedzi 05AB1E @ KevinCruijssen ).
źródło
JavaScript (Node.js) ,
855 851803 bajtówWypróbuj online!
W jaki sposób?
Skompresowany ciąg zawiera listę 89 wartości.
Pierwsze 44 wartości to długość mandatów prezydenta wyrażona w liczbie dni i zakodowana w bazie 32 (która jest bazą, która najlepiej się kompresuje).
Kolejne 45 wartości to nazwiska prezydenta pisane małymi literami. Następnie stosuje się przypadek tytułu (sztuczka zapożyczona z odpowiedzi @ KevinCruijssen ).
źródło
SOGL , 475 bajtów
Wypróbuj tutaj!
Logikę daty można prawdopodobnie nieco poprawić.
źródło
PHP , 888 bajtów
WYPRÓBUJ DEMO
źródło
05AB1E ,
464444442418 bajtów-15 bajtów, kradnąc pomysły z odpowiedzi Kevina Cruijssena
Przekreślony 444 to wciąż 444):
Wypróbuj online!
Część 1: nazwy
Istnieją dwa typy kompresji ciągów w 05AB1E:
[a-z ]
(małe litery i spacje).ÿ
, aby pobrać wartość ze stosu i osadzić ją w ciągu.Użyjemy optymalnej kombinacji obu. Ponieważ przełączanie z jednego kodowania na drugie pociąga za sobą pewien narzut, jest to bardziej skomplikowane niż wybranie najkrótszego kodowania dla każdej nazwy. Na przykład:
ing
WHarding Calvin
odbywa ~ 1,8 bajtów bazowego 27 vs 3 bajty w słowniku łańcucha. AleHard
iCalvin
oba są w słowniku, więc w rezultacie pozostawiamying
nieskompresowane wewnątrz ciągu słownika.Herb
WCoolidge Herbert Hoover
trwa około 3 bajty w 27-podstawy vs tylko 2 w słowniku łańcucha (ponieważherb
znajduje się w słowniku). Ale aniCoolidge
nieHoover
ma go w słowniku, więc ostatecznie kodujemyHerb
jako base-27.Aby obejść ograniczenie, które mogą zawierać tylko łańcuchy base-27
[a-z ]
, przypisujemy specjalne znaczenie niektórym literom. Pomiędzy nimi 44 prezydentów zużywa wszystkie 26 liter, ale nadal możemy grać w sztuczki:j
s są w słowniku wyrazów (James
,Benjamin
...), więcj
jest dostępny bezpłatnie dla base-27 strun.q
jestQuincy
, więc małe literyq
są bezpłatnez
jestZachary
, więc małe literyz
są bezpłatnex
jestNixon
włączone, więc wielkie literyX
są darmowe (tak naprawdę nie korzystamy z tego)Powiedziawszy to, spójrzmy na kod.
Mamy teraz listę 45 pełnych nazwisk w porządku chronologicznym, więc skończyliśmy z tą częścią.
Część 2: daty
Aby ułatwić porównywanie dat, konwertujemy je na liczby całkowite. Odbywa się to poprzez konwersję z base-32, co daje 1024 * rok + 32 * miesiąc + dzień (i nie przejmuje się tym, że „cyfra” roku jest większa niż 32).
Zaczynamy od listy kolejnych reelekcji (wyborów, które nie zmieniają prezydenta), w odwrotnej kolejności chronologicznej:
Te trzy pierwsze 1 odpowiadają Obamie, Bushowi i Clintonowi, którzy zostali ponownie wybrani raz. Samotna 2 odpowiada McKinleyowi i Theodore Rooseveltowi, którzy zostali ponownie wybrani raz (McKinley zmarł na stanowisku, a Theodore Roosevelt był jego wiceprezydentem, więc nie było innych wyborów między ich ponownymi wyborami). Franklin D. Roosevelt + Truman powinien tam mieć 4, ale jest to również punkt, w którym dzień inauguracji zmienił się z 4 marca na 20 stycznia, więc zajmiemy się tym szczególnym przypadkiem później.
Pamiętaj, że 1024 oznacza rok, więc 4096 oznacza pełny mandat. Jest to teraz lista różnic czasowych między nowo wybranymi prezydentami (wciąż w odwrotnej kolejności chronologicznej, dlatego liczby muszą być ujemne).
Teraz zaopiekujmy się 9 prezydentami, którzy nie pełnili pełnych mandatów (4 zmarło z przyczyn naturalnych, 4 zamordowanych, Nixon zrezygnował):
45088 to delta czasowa od 4 marca 1797 r. (Pierwsze wprowadzenie 4 marca) do 4 kwietnia 1841 r. (Pierwsza śmierć na stanowisku). Następujące liczby są deltami czasowymi między 9 zgonów / rezygnacji. Wreszcie 43819 to delta czasowa od 9 sierpnia 1974 r. (Rezygnacja Nixona) do 20 stycznia 2017 r. (Ostatnie wprowadzenie 20 stycznia).
Mamy teraz listę wszystkich dat, w których prezydent się zmienił. Kolejność jest nieco funky: zaczyna się w 1933 r., Potem następuje wprowadzenie 4 marca wstecz, potem śmierć / rezygnacja idzie w przód, a następnie wraca wraz z wprowadzeniami 20 stycznia. Jednak kolejność nie ma znaczenia.
I skończyliśmy.
źródło
Węgiel drzewny , 550 bajtów
Wypróbuj online! Link jest do pełnej wersji kodu. Pobiera dane wejściowe w formacie ISO. Wyjaśnienie:
źródło
Stax ,
550509502 bajtówUruchom i debuguj go również z testami Kevina Cruijssena
Ten program działa poprawnie, ale jeśli użyjesz narzędzia „Unompress Literals”, spowoduje to uszkodzenie kodu źródłowego. Kończy się to umieszczeniem dwóch literałów całkowitych obok siebie, co czyni jeden większy literał. Oczywiście to nie robi tego samego, co oryginalny program.
źródło