MATL , 38 36 34 байта
FT+"@llI$YO]q&:t8XO!s9\~)9#1$ZOZps
Попробуйте онлайн! Или проверьте все тестовые случаи (занимает несколько секунд).
объяснение
FT+ % Input year implicitly. Add [0 1] element-wise. Gives array with input year
% and next year
" % For each of those two years
@ % Push year
ll % Push 1 twice. This indicates January 1.
I$YO % Convert year, month, day to serial date number
] % End for each. We now have the serial date number for January 1 of the input
% year and that of the following year
q % Subtract 1 to the latter, to yield December 31 of the input year
&: % Inclusive range between those two numbers. This gives an array of serial date
% numbers for the whole input year
t % Push another copy of that array
8XO % Convert to date string with format 8. This gives weekday as "Mon", "Tue" etc.
% The result is a 3-column 2D char array, where each row is a day
!s % Transpose, sum of each column. 'Wed' gives 288 (sum of ASCII codes)
9\~ % 288 gives 0 modulo 9, and is the only weekday to do so. So we compute modulo 9
% and negate. This gives true for Wednesdays, false for the rest
) % Apply as logical index into the array of serial date numbers
9#1$ZO % Array of month numbers corresponding to those serial date numbers
Zp % Array that contains true for prime numbers, false for the rest
s % Sum of array. Display implicitly
Python 2,
95936867 байтСпасибо @Josay за игру в гольф на 1 байт!
Проверьте это на Ideone .
источник
0x10ea2c8dbb06c5619
вместо19501370182350951961
.big_constant//5**long_expression
но как на Земле вы пришли с этой константой и этим выражением? Это безумие: DBrain-Flak ,
6588,2310,2308, 2290 байтПерво-наперво, я не написал почти 100% этой программы, о чем, вероятно, свидетельствует огромный размер программы. Большая часть этого кода была написана моим собственным алгоритмом игры в гольф Brain-Flak . Наряду с дополнительным скриптом Python я написал, чтобы подсказать в правильном направлении.
Попробуйте онлайн!
Хотя эта программа довольно длинна для кода гольфа, она действительно коротка для Brain-Flak. В настоящее время мировой рекорд по целочисленному разделению составляет более 1000 байтов.
объяснение
Алгоритм довольно прост. Поскольку доступно ограниченное количество лет (321), он просто помещает ответы в обратном порядке под входными данными и использует алгоритм поиска, чтобы найти правильный ответ. Хотя жесткое кодирование всех 321 возможностей может показаться довольно неэффективным с такой сложной задачей, как эта, и с таким эзотерическим языком, как мозговая атака, вполне может оказаться лучшим решением. (Планирую узнать в ближайшие недели).
Так как большинство из 321 чисел составляют в среднем около 18 и они очень мало отличаются от года к году, вместо того, чтобы нажимать все числа индивидуально, я обычно нажимаю первый год (2233), а затем просто дублирую и немного меняю значение для каждого года после. Таким образом, вместо того, чтобы платить за толчок ~ 18 за все 321 год, я плачу только за толчок ~ 2 за каждый год.
После того, как все ответы были выдвинуты, он вычитает 1912 из входных данных
({}[(((((((((()()()()())){}{}){}){}){}){}[()]){}){}){}])
(Это может быть неоптимальным, я переписал оптимизатор, чтобы пропустить определенные значения, которые, по моему мнению, не были бы оптимальными, поскольку жесткое кодирование чисел - это суперэкспоненциальный процесс, и выполнение его до завершения может иметь заняло несколько дней).Затем он вычитает единицу из первого элемента и выталкивает второй элемент, пока результат не достигнет нуля
{({}[()]<{}>)}
.Он выскакивает ноль,
{}
и все элементы ниже верхнего элемента({}<{{}}>)
.источник
n
иm
которые имеют длинуk
иl
, я полагаю,n+m
будет иметь длинуk+l
? Как насчетn*m
?n*m
будетk+4m-4
илиl+4n-4
. Это потому, что умножение жестко закодировано. Мы сначала толкаемn
m-1
времена. Для этого нам нужныk
символы для выраженияn
и2m-2
символы для выражения толчков (каждый толчок - 2 символа). Затем мы добавляемm-1
время, что обходится нам дополнительно2m-2
(стоимость 2 символа тоже). Это составляет доk+4m-4
. мы также можем умножитьm*n
(коммутативное свойство), чтобы получитьl+4n-4
. Результат будет короче из двух.+1
стоит 2,*2
стоит 4,*3
стоит 8,*4
стоит 12, что дороже*2*2
, поэтому не стоит (из чисел ниже 1000 я нашел только 10, которые не использовали*2
: 1, 2, 3 4, 5, 9, 15, 27, 45, 135). Для 1912 года лучшее, что я мог сделать, было((((((1+1+1)*2+1)*2*2+1)*2+1)*2+1)*2+1)*2*2*2
с длиной 52.Баш + коммунальные услуги, 39
Принимает год ввода в качестве параметра командной строки. Обычно выводит подобные сообщения в STDERR - я думаю, что это законно в соответствии с этим мета-ответом :
Если вы хотите явно подавить вывод STDERR, вы можете сделать это вместо этого для оценки 43 :
источник
gd_GB.utf8
, где сокращаются названия всех днейDi
.Октава, 86 байт
Это не быстро, ни в коем случае. Но на самом деле это не цель код-гольфа, не так ли?
Octave может отслеживать даты по «номеру даты» - количеству прошедших дней, когда 1, 0 января - день 1. По этому показателю 3 января 1912 года (первая среда в нашем наборе) - день 698 346. Начните с этого и повторяйте каждый седьмой день (все среды) до конца 2233 года, и добавьте 1, если год является целевым годом, а день месяца является основным.
источник
Python 2,7,
166,165, 150 байтЗдесь, безусловно, есть место для улучшения. Я довольно новичок в гольф в питоне. Это использует
datetime
модуль. Он проходит по всем дням года, добавляя один к аккумулятору, если он соответствует критерию. Затем он печатает результат. Большая часть тяжелой работы находится в модуле, поэтому код может быть довольно тонким.Один байт сохранен благодаря Morgan Thrapp и 15 байтов сохранены Pietu1998 .
источник
n%x==0
наn%x<1
.-1
является необходимым, посколькуrange
конечный индекс является эксклюзивным. Кроме того, вы можете преобразовать вfilter
генератор.[0for x in range(2,n)if n%x<1]
any(...)
илиall(...)
вместоnot filter(...)
.all
вы можете сохранить целую кучу.c+=n>1<2==d.weekday()>0<all(n%x for x in range(2,n))
J, 44 байта
Я только что обнаружил, что у J есть встроенные функции для манипулирования датами.
использование
Дополнительные команды используются для форматирования нескольких входов / выходов.
объяснение
источник
PowerShell v3 +,
9995 байтМетод грубой силы -
Принимает входные данные
$y
, циклы от1
до12
, временно сохраняет месяц в$m
, а затем циклы по каждому простому числу от2
до31
. Для каждого из них мы строимGet-Date
определенный день, а затем выбираем только те, которые имеютDayOfWeek
-eq
значение3
(т.е. среда). Инкапсулирует это все в паренсе, чтобы сформулировать массив, и берет.Count
его.Альтернативно, математический подход -
PowerShell v3 +, 105 байт
Получается, что это всего лишь волосы длиннее, чем подход грубой силы, но я включил это здесь, поскольку это может быть полезно для других.
Снова принимает данные
$y
как год. На этот раз мы выполняем строго математические операции в первый день года. Сначала мы вычисляем, какой это день недели, и сохраняем его$a
для последующего использования. Это индексирует в первый массив, который возвращает нам число, которое обычно является правильным. Мы должны добавить к этому второй индекс, основанный на том, является ли это потенциальным високосным годом, будь то воскресенье, вторник, среда или четверг, и на основе того, какой это год.Это основано на следующем наблюдении. Первый столбец - это день недели 1 января, второй - обычный вывод. Если год не является одним из средних чисел, то вместо этого это число в скобках. Последний столбец описывает, как работает индексирование% 5.
Примечание. Оба предположения
en-us
являются текущими настройками PowerShell для информации о культуре / дате. Форматирование даты иDayOfWeek
число, возможно, должны быть скорректированы соответственно для других вариантов культуры.источник
Ruby, 83 + 15 (
-rdate -rprime
флаги) = 98 байтПопробуйте онлайн! (Импортированные модули встроены, потому что я могу использовать флаги в repl.it)
источник
JavaScript ES6,
187182181179 байт179 Поменяны местами в цикле for для цикла while
181 Уплотненный троичный
182 Объединены две петли
187
источник
Пакетный, 248 байт
Пояснение:
d
это день недели с0
понедельником, который обычно 1 января 1912 года.l
Это флаг того, является ли год високосным годом1
для 1912 года. Затем мы переходим с 1913 года на год ввода, обновляя день неделю и пересчет флага високосного года, как мы идем. Наконец, мы используем флаг високосного года и день недели для индексации того, что фактически является большим оператором переключения для определенияn
количества простых сред. Установкаn
в 20 и уменьшение его с понижением, хотя и дешевле, чем использование логики управления потоком, но в результате получается, что если 1 января не високосного года - четверг или воскресенье, то для других случаев будет 16 простых сред и т. Д. ,источник
JavaScript ES6
206203199197195183182179Не самое короткое, но лучшее, что я могу сделать сейчас ... Добро пожаловать в предложения по игре в гольф ...
Изменения:
3>=x?3-x:10-x
в6-(x+10)%7
, сохранение: 3 изменения местоположения декларации;x=w.getDay();z=D(w,6-(x+10)%7)
сz=D(w,6-(w.getDay()+10)%7)
сохранением: 4Z=0
изfor
цикла в объявление даты и вставилz=D(w,6-(x+10)%7)
вfor
цикл, чтобы привести в порядок, сохранив: 2w=new Date(a,Z=0,1)
объявление вfor
цикл, объединив с существующимw
объявлением, сохранив: 2+!!
на~~
уменьшение и преобразованиеp(d=1)
изNaN
в0
, что позволяет функции Prime Test по-прежнему работать, сохраняя: 1W
, переопределилfor
цикл - перешел в обратном порядке с 31 декабря,Date
записал объект как отдельную переменную, затем переписалfor
цикл вeval
вызов; сохранение 3.@PandaCoder, я тебя догоняю, приятель!
источник
R
149147 байтПроверьте это на Ideone .
источник
Groovy, 126
Groovy не имеет проверки простых чисел, его тоже нужно было построить.
источник