Вызов
Напишите программу, которая принимает в качестве входных данных день с 30 апреля 1789 г. по 21 августа 2019 г. и возвращает в качестве выходных данные того, кто был президентом США в тот день.
Примечания
В списке президентов США , формат их имен, и в период своего председательства, смотрите ниже:
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 марта 1861 года - 15 апреля 1865 года; Авраам Линкольн» означает, что Линкольн был президентом с 4 марта 1861 года по 14 апреля 1865 года.
Это код-гольф, выигрывает самая короткая программа на каждом языке.
пример
Вход: «7 февраля 1865 года» Выход: «Авраам Линкольн»
WolframAlpha["president on "<>#]&
Я уверен, что у чистой Mathematica где-то есть встроенная функция, но пока я не найду, как она называется, я придерживаюсь W | A.WolframAlpha["US president on "<>#]&
вызвать для меня, что вывод не веренОтветы:
PHP , 936 байт
Попробуйте онлайн!
Тесты: попробуйте онлайн!
Код для испытаний та же логика , но немного по- другому , чтобы заменить
die(...)
с ,return...
так что я могу цикл по тестам.Я создал строку, в которой дата начала президентства минус 1 день в формате
YYYYMMDD
и имя президента в ней разделены-
. Пример:17890429-George Washington-17970303-John Adams-18010303-Thomas Jefferson-...
Эта строка сжимается с помощью gzdeflate, а также сжатый вывод преобразуется в base-64, поэтому все символы печатаются в формате ASCII, и я могу разместить их здесь или использовать их в TIO .
В сценарии строка разделяется
-
и повторяется. Для каждой итерации цикла:$d
устанавливается текущее значение итерации (которая является начальной датой президента -1 день), а переменная цикла ($i
) увеличивается на единицу.$d
, тогда$m
устанавливается значение следующей итерации (которое является именем президента$d
), а переменная цикла ($i
) снова увеличивается на единицу. Это позволяет циклу получать имена президента, но перепрыгивать их через итерации.$d
, то это означает, что предыдущая итерация была верным президентом, поэтому$m
печатается с использованиемdie
функции, это остановит всю программу после печати имени.В конце, если цикл завершен (что означает, что не
die
был вызван), печатается имя последнего президента, так как мы знаем, что ни один из предыдущих президентов не получил совпадение (так что в основном все, что послеJanuary 19, 2017
) печатает имя последнего президента, даже если оноJanuary 1, 3999
,источник
Баш ,
12291124 байта-103 байта с превосходными комментариями @ GammaFunction, удаляющими пару непродуктивных замен (Адамс), и рефакторинг кода для использования смещения даты от предыдущей даты, а не абсолютной даты для каждого президентства.
Попробуйте онлайн!
Много ручного сжатия :)
источник
X=($X)
циклов, так какfor z in $X
разделите $ X на $ IFS. Используйте[ -lt ]
и используйте$T
вместо${T[0]}
. Последние несколько строк, в целом должны быть 1191 байт[ ${T#${M[++i]}*} ]
. Теперь мы можем полностью отказаться от декабря). Я также включил ведущие:
в несколько имен (делая это для:John
создания всех разделителей:
вместо#
).T-SQL,
1169 981 979977 байтСвятая корова, я разобрался со сжатием строк в SQL ( доступно в SQL 2016 и выше ):
Не сохраняет вполне так, как я надеялся , что это могло бы, вероятно , из - за количества кода, необходимого для преобразования / deconvert.
Вот оригинальная версия, которая эквивалентна коду, который выполняется после распаковки закодированной строки (1169 байт):
Разрывы строки предназначены только для удобства чтения.
INT
YYYYMMDD
Несколько приемов, которые я использовал для сохранения байтов:
ORDER BY
код<
вместо<=
VALUES()
, хотя мне пришлось бы затем разбить строку на частиSUBSTRING
иLEFT
.SUBSTRING()
наSTUFF()
Использование сжатых строк в кодировке Base64 в SQL
(Добавлено в ветку SQL Tips )
Таким образом, Microsoft добавила
COMPRESS
иDECOMPRESS
функцию обратно в SQL 2016, которая обрабатывает GZIP; проблема в том, что он возвращает aVARBINARY
, которое, хотя и короче в байтах (при хранении вVARBINARY
поле SQL ), длиннее при отображении в символах (необработанный шестнадцатеричный код), что делает его непригодным для игры в гольф.Преобразование в Base64, безусловно, ответ, но найти короткую простую реализацию было непросто. Я основал свою версию этого старого ответа на SO , которая дает нам большую часть того, что нам нужно, хотя она не использует новые функции GZIP. Мне просто нужно было вставить новые функции в нужное место и немного поиграть.
Чтобы использовать этот метод в своем собственном коде:
Это
7573 дополнительных байта кода для распаковки закодированной строки, так что явно используйте это только для очень длинных строк.РЕДАКТИРОВАТЬ : Сохранено 2 байта в коде распаковки с
CAST
вместоCONVERT
.источник
Excel,
124312061180 байт-37 байтов путем вычитания из всех дат
-26 байтов путем манипулирования значениями вычитания
Ввод в ячейке
A1
в формате,YYYYMMDD
так как Excel не любит даты до 1900 года.Я не знаю метода сжатия дат или имен, который бы не добавил больше байтов. Метод «вычитать [значение] из всех дат» может применяться к любому решению.
Я нашел решение в 1102 байта в Google Sheets по тому же принципу. В Excel нет этой
Split
функции, поэтому она не может быть переведена.источник
19000101
?MATCH()
имеет необязательный третий аргумент match_type, который определяет, использовать ли точное совпадение. Исключение этого аргумента использует значение по умолчанию, которое соответствует «меньше или равно», поэтому этот код является правильным.05AB1E ,
587584568 байтВходные данные представляют собой объединенную дату в формате
yyyyMMdd
(т.20190821
Е. 21 августа 2019 г.).-16 байт благодаря @Grimy .
Попробуйте онлайн или проверьте еще несколько тестов .
Объяснение:
Начнем с создания списка президентов в хронологическом порядке:
Затем мы создаем список всех дат в виде целых чисел в формате
yyyyMMdd
(порядок не имеет значения для этого списка):Затем мы используем входные данные для определения выходного имени президента на основе дат в списке:
Смотрите этот 05AB1E наконечник шахты (секции Как компресс строк не часть словаря? , Как сжать большие целые числа? , И как сжать целые списки? ) , Чтобы понять , как все сжатые строки, целые числа и списки работы.
источник
Желе ,
431 428 427426 байтПолная программа, принимающая строку,
YYYYMMDD
которая печатает имя президента.Попробуйте онлайн! Или увидеть (Kevin Cruijssen в) тест-набор .
Как?
источник
Желе , 454 байта
Попробуйте онлайн!
Монадическая ссылка, принимающая в качестве аргумента дату в формате ГГГГММДД и возвращающая строку с ответом.
Контрольные примеры (заимствовано из ответа @ KevinCruijssen 05AB1E ).
источник
JavaScript (Node.js) ,
855 851803 байтаПопробуйте онлайн!
Как?
Сжатая строка содержит список из 89 значений.
Первые 44 значения - это продолжительность президентских мандатов, выраженная в количестве дней и закодированная в базе 32 (которая является базой, которая сжимает лучше всего).
Следующие 45 значений являются именами президента в нижнем регистре. Заголовок применяется позже (трюк заимствован из ответа @ KevinCruijssen ).
источник
СОГЛ , 475 байт
Попробуй это здесь!
Логика дат, возможно, могла бы быть немного улучшена.
источник
PHP , 888 байт
ПОПРОБУЙТЕ ДЕМО
источник
05AB1E ,
464444442418 байт-15 или около того байтов, крадя идеи из ответа Кевина Круйссена
Пересекла 444 - это еще 444):
Попробуйте онлайн!
Часть 1: имена
В 05AB1E есть два типа сжатия строк:
[a-z ]
(строчные буквы и пробелы).ÿ
, чтобы извлечь значение из стека и вставить его в строку.Мы собираемся использовать оптимальное сочетание обоих. Поскольку переключение с одной кодировки на другую сопряжено с некоторыми издержками, это более сложно, чем выбор самой короткой кодировки для каждого отдельного имени. Например:
ing
ВHarding Calvin
занимает ~ 1,8 байт в базе-27 против 3 байта в словаре строки. НоHard
иCalvin
оба находятся в словаре, поэтому в итоге мы оставляемing
несжатый внутри словарной строки.Herb
ВCoolidge Herbert Hoover
занимает ~ 3 байта в базе-27 против только 2 в словаре строку (так какherb
в словаре). Но ни в словаре,Coolidge
ниHoover
в словаре, так что мы заканчиваем кодированиемHerb
как base-27Чтобы обойти ограничение, которое могут содержать только строки base-27
[a-z ]
, мы присваиваем специальные значения некоторым буквам. Между ними 44 президента израсходовали все 26 букв, но мы все еще можем подшучивать:j
s в словарных словах (James
,Benjamin
, ...), так чтоj
свободно для базовых 27 строк.q
вQuincy
, так что нижний регистрq
свободенz
вZachary
, так что нижний регистрz
свободенx
вNixon
, так что прописные буквыX
свободны (мы на самом деле не используем это)С учетом сказанного, давайте посмотрим на код.
Теперь у нас есть список из 45 полных имен в хронологическом порядке, поэтому мы закончили с этой частью.
Часть 2: даты
Чтобы было проще сравнивать даты, мы конвертируем их в целые числа. Это делается с помощью преобразования из base-32, которое дает 1024 * год + 32 * месяц + день (и не заботится о том, что «цифра» года больше 32).
Мы начинаем со списка количества последовательных перевыборов (выборов, которые не меняют президента) в обратном хронологическом порядке:
Эти первые три соответствуют переизбранию Обамы, Буша и Клинтона. Одиночная цифра 2 соответствует Маккинли и Теодору Рузвельту, которые были переизбраны однажды (Маккинли умер при исполнении служебных обязанностей, а Теодор Рузвельт был его вице-президентом, поэтому между их переизбранием не было никаких других выборов). Там должно быть 4 для Франклина Д. Рузвельта + Трумэна, но это также точка, где день инаугурации изменился с 4 марта по 20 января, поэтому мы рассмотрим этот особый случай позже.
Помните, что 1024 означает год, а 4096 означает полный мандат. Теперь это список разницы во времени между вновь избранными президентами (все еще в обратном хронологическом порядке, поэтому цифры должны быть отрицательными).
Теперь давайте позаботимся о 9 президентах, которые не выполняли полные мандаты (4 умерли по естественным причинам, 4 убиты, Никсон подал в отставку):
45088 - это дельта времени с 4 марта 1797 года (первое введение 4 марта) до 4 апреля 1841 года (первая смерть при исполнении служебных обязанностей). Следующие цифры представляют собой разницу во времени между 9 смертями / отставками. Наконец, 43819 - это разница во времени с 9 августа 1974 года (отставка Никсона) до 20 января 2017 года (последнее введение 20 января).
Теперь у нас есть список всех дат, когда президент изменился. Орден немного прикольный: он начинается в 1933 году, затем следует введение 4 марта в обратном направлении во времени, затем смерть / отставка вперед во времени, а затем повторяется введение 20 января. Однако порядок на самом деле не имеет значения.
И мы сделали.
источник
Древесный уголь , 550 байт
Попробуйте онлайн! Ссылка на подробную версию кода. Принимает ввод в формате ISO. Объяснение:
источник
Stax ,
550509502 байтаЗапустите и отладьте его, также показывая тесты Кевина Круйссена
Эта программа выполняется правильно, но если вы используете инструмент «Uncompress Literals», она повредит исходный код. В итоге два целочисленных литерала располагаются рядом друг с другом, что делает один литерал большего размера. Конечно, это не то же самое, что оригинальная программа.
источник