Tantangan
Tulis sebuah program yang mengambil input sehari dari 30 April 1789 hingga 21 Agustus 2019 dan kembali sebagai output yang adalah presiden Amerika Serikat pada hari itu.
Catatan
Untuk daftar presiden AS , format nama mereka, dan periode kepresidenannya, lihat di bawah:
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
Presidensi dimaksudkan sebagai hari pertama yang dimasukkan dan hari terakhir dikecualikan. Misalnya, "4 Maret 1861 - 15 April 1865; Abraham Lincoln" berarti bahwa Lincoln adalah presiden dari 4 Maret 1861 hingga 14 April 1865.
Ini adalah kode-golf, program terpendek dalam setiap bahasa yang menang.
Contoh
Input: "7 Februari 1865" Output: "Abraham Lincoln"
WolframAlpha["president on "<>#]&
Saya yakin benar Mathematica memiliki builtin di suatu tempat tetapi sampai saya menemukan apa yang disebutnya saya tetap dengan W | A.WolframAlpha["US president on "<>#]&
bagi saya outputnya tidak benarJawaban:
PHP , 936 byte
Cobalah online!
Tes: Coba online!
Kode untuk tes adalah logika yang sama tetapi sedikit berbeda untuk menggantikan
die(...)
denganreturn...
sehingga saya bisa mengulang tes.Saya telah membuat string yang memiliki tanggal mulai kepresidenan dikurangi 1 hari dalam format
YYYYMMDD
dan nama presiden di dalamnya, dipisahkan oleh-
. Contoh:17890429-George Washington-17970303-John Adams-18010303-Thomas Jefferson-...
String ini dikompres menggunakan gzdeflate dan output terkompresi dikonversi ke base-64 sehingga semua karakter dapat dicetak ASCII dan saya dapat mempostingnya di sini atau menggunakannya di TIO .
Dalam skrip, string dipisahkan oleh
-
dan dilingkarkan. Untuk setiap iterasi loop:$d
diatur ke nilai iterasi saat ini (yang merupakan tanggal mulai presiden -1 hari) dan variabel loop ($i
) meningkat satu.$d
, maka$m
diatur ke nilai iterasi berikutnya (yang merupakan nama presiden untuk$d
) dan variabel loop ($i
) dinaikkan satu lagi. Ini memungkinkan perulangan untuk mendapatkan nama presiden tetapi melompati mereka dalam iterasi.$d
, maka itu berarti iterasi sebelumnya adalah presiden yang benar, sehingga$m
dicetak menggunakandie
fungsi, ini akan menghentikan seluruh program setelah mencetak nama.Pada akhirnya, jika loop selesai (yang berarti tidak ada
die
yang dipanggil), nama presiden terakhir dicetak, karena kita tahu bahwa tidak ada presiden sebelumnya yang mendapat kecocokan (jadi pada dasarnya apa pun setelahnyaJanuary 19, 2017
) mencetak nama presiden terakhir, bahkan jika itu adalahJanuary 1, 3999
.sumber
Bash ,
12291124 byte-103 byte dengan komentar luar biasa @ GammaFunction, menghapus beberapa pengganti yang tidak produktif (Adams), dan refactoring kode untuk menggunakan tanggal offset dari tanggal sebelumnya daripada tanggal absolut untuk masing-masing presiden.
Cobalah online!
Banyak kompresi manual :)
sumber
X=($X)
, perulangan karenafor z in $X
akan membagi $ X pada $ IFS. Gunakan[ -lt ]
, dan gunakan$T
sebagai ganti${T[0]}
. Beberapa baris terakhir, secara keseluruhan seharusnya 1191 byte[ ${T#${M[++i]}*} ]
. Sekarang kita dapat meninggalkan Desember sepenuhnya). Saya juga menyertakan yang memimpin:
pada beberapa nama (melakukan ini:John
berarti membuat semua pembatas:
bukan#
).T-SQL,
1169 981 979977 byteAstaga, saya menemukan kompresi string dalam SQL ( tersedia dalam SQL 2016 dan lebih tinggi ):
Tidak menyimpan cukup banyak seperti aku berharap itu mungkin, mungkin karena jumlah kode yang dibutuhkan untuk mengkonversi / deconvert.
Ini adalah versi asli, yang setara dengan kode yang berjalan setelah string yang dikodekan didekompresi (1169 bytes):
Jeda baris hanya untuk keterbacaan.
Input diambil dari tabel yang sudah ada dengan bidang , sesuai aturan IO kami . Tanggal input diformat sebagai angka 8 digit .d ii
INT
YYYYMMDD
Beberapa trik yang saya gunakan untuk menyimpan byte:
ORDER BY
kode<
sebagai ganti<=
VALUES()
, meskipun saya kemudian harus memecah string denganSUBSTRING
danLEFT
.SUBSTRING()
keSTUFF()
Menggunakan string terkompresi Base64-encoded dalam SQL
(Ditambahkan ke utas Tips SQL )
Jadi Microsoft menambahkan
COMPRESS
danDECOMPRESS
fungsi kembali di SQL 2016, yang menangani GZIP; masalahnya adalah ia mengembalikan aVARBINARY
, yang walaupun lebih pendek dalam byte (bila disimpan dalamVARBINARY
bidang SQL ), lebih lama ketika ditampilkan dalam karakter (hex mentah), yang membuatnya tidak cocok untuk bermain golf.Konversi ke Base64 jelas jawabannya, tetapi menemukan implementasi yang singkat dan sederhana adalah sebuah tantangan. Saya mendasarkan versi saya dari jawaban lama ini pada SO , yang memberi kami sebagian besar dari apa yang kami butuhkan, meskipun tidak menggunakan fungsi GZIP baru. Saya hanya harus memasukkan fungsi-fungsi baru ke tempat yang tepat, dan sedikit golf.
Untuk menggunakan metode ini dalam kode Anda sendiri:
Itu
7573 byte tambahan kode untuk mendekompresi string yang disandikan, jadi jelas hanya gunakan ini untuk string yang sangat panjang.EDIT : Disimpan 2 byte dalam kode dekompresi dengan
CAST
alih - alihCONVERT
.sumber
Excel,
124312061180 byte-37 byte dengan mengurangi dari semua tanggal
-26 byte oleh dengan mengutak-atik nilai pengurangan
Input dalam sel
A1
dengan formatYYYYMMDD
karena Excel tidak suka tanggal sebelum 1900.Saya tidak tahu metode kompresi untuk tanggal atau nama yang tidak akan menambah lebih banyak byte. Metode "kurangi [nilai] dari semua tanggal" dapat berlaku untuk solusi siapa pun.
Saya menemukan solusi 1102 byte di Google Sheets menggunakan prinsip yang sama. Excel tidak memiliki
Split
fungsi sehingga tidak dapat diterjemahkan.sumber
19000101
?MATCH()
memiliki argumen opsional match_type ke-3 yang menentukan apakah akan menggunakan pencocokan tepat. Mengecualikan argumen itu menggunakan kecocokan default, yaitu kecocokan "kurang dari atau sama dengan", jadi kode ini benar.05AB1E ,
587584568 byteInput adalah tanggal gabungan dalam format
yyyyMMdd
(yaitu20190821
untuk 21 Agustus 2019).-16 byte terima kasih kepada @Grimy .
Cobalah secara online atau verifikasi beberapa kasus uji lagi .
Penjelasan:
Kami mulai dengan membuat daftar presiden dalam urutan kronologis:
Kemudian kami membuat daftar semua tanggal sebagai bilangan bulat dalam format
yyyyMMdd
(urutan tidak relevan untuk daftar ini):Kemudian kami menggunakan input untuk menentukan nama presiden keluaran berdasarkan tanggal dalam daftar:
Lihat ini ujung 05AB1E saya (bagian Cara string kompres bukan bagian dari kamus? , Cara kompres bilangan bulat besar? , Dan Cara daftar bilangan bulat kompres? ) Untuk memahami bagaimana semua dikompresi tali, bilangan bulat, dan daftar pekerjaan.
sumber
Jelly ,
431 428 427426 byteProgram lengkap yang menerima string
YYYYMMDD
yang mencetak nama presiden.Cobalah online! Atau lihat test-suite (Kevin Cruijssen).
Bagaimana?
sumber
Jelly , 454 byte
Cobalah online!
Tautan monadik yang mengambil tanggalnya dalam format YYYYMMDD dan mengembalikan string dengan jawabannya.
Uji kasus (dipinjam dari jawaban 05AB1E @ KevinCruijssen ).
sumber
JavaScript (Node.js) ,
855 851803 byteCobalah online!
Bagaimana?
String yang dikompresi berisi daftar 89 nilai.
Nilai 44 yang pertama adalah panjang mandat presiden yang dinyatakan dalam beberapa hari dan dikodekan dalam basis 32 (yang merupakan basis yang mengkompres terbaik).
Nilai 45 berikutnya adalah nama-nama presiden dalam huruf kecil. Casing judul diterapkan setelahnya (trik dipinjam dari jawaban @ KevinCruijssen ).
sumber
SOGL , 475 byte
Coba di sini!
Logika tanggal mungkin bisa sedikit ditingkatkan.
sumber
PHP , 888 byte
COBA DEMO
sumber
05AB1E ,
464444442418 byte-15 atau lebih byte dengan mencuri ide dari jawaban Kevin Cruijssen
Crossed 444 masih 444):
Cobalah online!
Bagian 1: nama-nama
Ada dua jenis kompresi string di 05AB1E:
[a-z ]
(huruf kecil dan spasi).ÿ
, untuk mengeluarkan nilai dari stack dan menanamkannya ke dalam string.Kami akan menggunakan campuran yang optimal dari keduanya. Karena beralih dari satu pengkodean ke pengkodean lainnya menimbulkan beberapa overhead, ini lebih kompleks daripada memilih pengkodean terpendek untuk setiap nama individu. Sebagai contoh:
ing
dalamHarding Calvin
mengambil ~ 1,8 bytes dalam basis-27 vs 3 byte dalam string kamus. TapiHard
danCalvin
keduanya ada di kamus, jadi kami akhirnya meninggalkaning
terkompresi di dalam string kamus.Herb
dalamCoolidge Herbert Hoover
mengambil ~ 3 byte dalam basis-27 vs hanya 2 dalam serangkaian kamus (karenaherb
dalam kamus). Tapi baikCoolidge
atauHoover
yang dalam kamus, jadi kita berakhir pengkodeanHerb
sebagai dasar-27.Untuk mengatasi batasan yang hanya dapat dimuat oleh string-27
[a-z ]
, kami memberikan arti khusus pada beberapa huruf. Di antara mereka, 44 presiden menggunakan semua 26 surat, tetapi kita masih bisa memainkan trik:j
s berada di kata-kata kamus (James
,Benjamin
, ...), jadij
bebas untuk basis-27 string.q
dalamQuincy
, jadi huruf kecilq
gratisz
dalamZachary
, jadi huruf kecilz
gratisx
adalah dalamNixon
, jadi huruf besarX
gratis (kami tidak benar-benar memanfaatkannya)Dengan mengatakan itu, mari kita lihat kodenya.
Kami sekarang memiliki daftar 45 nama lengkap dalam urutan kronologis, jadi kami selesai dengan bagian ini.
Bagian 2: tanggalnya
Untuk mempermudah membandingkan tanggal, kami mengonversinya menjadi bilangan bulat. Ini dilakukan dengan konversi dari basis-32, yang menghasilkan 1024 * tahun + 32 * bulan + hari (dan tidak peduli bahwa tahun "digit" lebih besar dari 32).
Kami mulai dengan daftar jumlah pemilihan ulang berturut-turut (pemilihan yang tidak mengubah presiden), dalam urutan kronologis terbalik:
Tiga 1 pertama yang sesuai dengan Obama, Bush dan Clinton semuanya dipilih sekali. Satu-satunya 2 sesuai dengan McKinley dan Theodore Roosevelt keduanya terpilih kembali satu kali (McKinley meninggal di kantor dan Theodore Roosevelt adalah wakil presidennya, sehingga tidak ada pemilihan lain di antara pemilihan ulang mereka). Harus ada 4 di sana untuk Franklin D. Roosevelt + Truman, tetapi ini juga merupakan titik di mana hari peresmian berubah dari 4 Maret hingga 20 Januari, jadi kami menangani kasus khusus ini nanti.
Ingat bahwa 1024 berarti setahun, jadi 4096 berarti mandat penuh. Ini sekarang adalah daftar delta waktu antara presiden yang baru terpilih (masih dalam urutan kronologis terbalik, itulah sebabnya angkanya perlu negatif).
Sekarang, mari kita urus 9 presiden yang tidak menjalankan mandat penuh (4 meninggal karena sebab alamiah, 4 terbunuh, Nixon mengundurkan diri):
45088 adalah delta waktu dari 4 Maret 1797 (pengantar pertama pada 4 Maret) hingga 4 April 1841 (kematian pertama di kantor). Angka-angka berikut adalah delta waktu antara 9 kematian / pengunduran diri. Akhirnya, 43819 adalah waktu delta dari 9 Agustus 1974 (pengunduran diri Nixon) hingga 20 Januari 2017 (pengantar terbaru pada 20 Januari).
Kami sekarang memiliki daftar semua tanggal di mana presiden berubah. Perintahnya agak funky: dimulai pada tahun 1933, kemudian mengikuti perkenalan 4 Maret mundur dalam waktu, kemudian kematian / pengunduran diri ke depan dalam waktu, kemudian kembali sepanjang pengantar 20 Januari. Namun, pesanan sebenarnya tidak penting.
Dan kita sudah selesai.
sumber
Arang , 550 byte
Cobalah online! Tautan adalah untuk mengucapkan versi kode. Mengambil input dalam format ISO. Penjelasan:
sumber
Stax ,
550509502 byteJalankan dan debug juga menampilkan tes Kevin Cruijssen
Program ini dijalankan dengan benar, tetapi jika Anda menggunakan alat "Uncompress Literals", itu akan merusak kode sumber. Itu akhirnya menempatkan dua literer bilangan bulat tepat di sebelah satu sama lain, yang membuat satu literal lebih besar. Tentu saja, itu tidak melakukan hal yang sama dengan program aslinya.
sumber