Прем'єр-середа


22

Прем'єр-середа

Ваше завдання - підрахувати кількість серед, які припадають на головний день місяця в конкретному році. Наприклад, 7-13-16це найважливіша середа. Для послідовності використовуйте григоріанський календар на всі дати.

Вхідні дані

Вхід до вашої програми / функції буде роком (наприклад 2016) і є гнучким. Рік буде цілим числом між 1912 і 2233 включно.

Вихідні дані

Вихід також є гнучким і повинен становити кількість перших серед (наприклад 18).

Оцінка балів

Це тому найкоротший код у байтах виграє!

Випробування

вхід -> вихід
--------------------
1912 -> 19
1914 -> 16
1984 -> 17
1996 -> 19
2063 -> 19
2150 -> 16
2199 - > 18
2233 -> 18

Відповіді:


7

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

Я переконаний, що MATL не може бути переможений у викликах, що базуються на датах. Ми повинні створити DATL, який додатково оптимізований для вирішення завдань, що базуються на датах.
Suever

@Suever Haha, приємне ім’я
Luis Mendo

20

Python 2, 95 93 68 67 байт

lambda y:0x10ea2c8dbb06c5619/5**((y+((y-22)/99-y/2002)*16)%28)%5+16

Дякуємо @Josay за те, що виграли 1 байт!

Перевірте це на Ideone .


3
0x10ea2c8dbb06c5619Замість цього можна зберегти 1 char 19501370182350951961.
SylvainD

Я розумію ідею, big_constant//5**long_expressionале як на Землі ви прийшли з цим постійним і цим виразом? Це божевільно: D
Шерлок9

2
Константа є простою таблицею пошуку, використовуючи базову 5 цифр, але перетворену на базу 10, так що цифри витягуються чисельно, а не з використанням рядкового індексу. Вираз мені схоже на вічний календар. (Проблема була б надто простою, якби вона була обмежена роками з 1901 по 2099 рік, оскільки відповіді повторюються кожні 28 років протягом цього інтервалу, тож це був би лише випадок, коли ви взяли рік мод 28 і заглянули в таблицю. )
Ніл

13

Brain-Flak , 6588 , 2310 , 2308 , 2290 байт

По-перше, спочатку я не написав майже 100% цієї програми, про що, мабуть, свідчить величезний розмір програми. Більшість цього коду була написана моїм власним алгоритмом гольфу Brain-Flak . Поряд із додатковим сценарієм пітона я написав, щоб підказати його в правильному напрямку.

Спробуйте в Інтернеті!

({}<(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((()()())){}{}){})[()()])())()())[()()()()])())()()())[()()()])()())[()()()])()())[()]))())()())[()()()()])())()()())[()()()])())())[()])[()])()()())[()()])()())[()()()()])()())())[()()])())()())[()()()()])()())[()])()()())[()()])()())[()()()()])()())())[()()])())()())[()()()()])())()()())[()()()])()())[()()()])()())[()]))())()())[()()()()])())()()())[()()()])())())[()])[()])()()())[()()])()())[()()()()])()())())[()()])())()())[()()()()])())()()())[()()()])()())[()()()])()())[()]))())()())[()()()()])())()()())[()()()])())())[()])[()])()()())[()()])()())[()()()()])()())())[()()])())()())[()()()()])())()()())[()()()])()())[()()()])()())[()]))())()())[()()()()])())()()())[()()()])())())[()])[()])()()())[()()])()())[()()()()])()())())[()()])())()())[()()()()])())()()())[()()()])())()())[()()()()])()())())[()()])())()())[()()()()])())()()())[()()()])()())[()()()])()())[()]))())()())[()()()()])())()()())[()()()])())())[()])[()])()()())[()()])()())[()()()()])()())())[()()])())()())[()()()()])())()()())[()()()])()())[()()()])()())[()]))())()())[()()()()])())()()())[()()()])())())[()])[()])()()())[()()])()())[()()()()])()())())[()()])())()())[()()()()])())()()())[()()()])()())[()()()])()())[()]))())()())[()()()()])())()()())[()()()])())())[()])[()])()()())[()()])()())[()()()()])()())())[()()])())()())[()()()()])())()()())[()()()])()())[()()()])()())[()]))())()())[()()()()])())()()())[()()()])())())[()])[()])()()())[()()])()())[()()()()])()())())[()()])())()())[()()()()])())()()())[()()()])()())[()()()])()())[()]))())()())[()()()()])())()()())[()()()])())())[()])[()])()()())[()()])()())[()()()()])()())())[()()])())()())[()()()()])())()()())[()()()])()())[()()()])()())[()]))())()())[()()()()])())()()())[()()()])())())[()])[()])()()())[()()])()())[()()()()])()())())[()()])())()())[()()()()])())()()())[()()()])()())[()()()])()())[()]))())()())[()()()()])())()()())>[(((((((((()()()()())){}{}){}){}){}){}[()]){}){}){}]){({}[()]<{}>)}{}({}<{{}}>)

Хоча ця програма досить довга для кодового гольфу, вона справді пристойно коротка для Brain-Flak. В даний час світовий рекорд по цілому поділу становить понад 1000 байт.

Пояснення

Алгоритм досить простий. Оскільки існує обмежена кількість років (321), він просто підштовхує відповіді у зворотному порядку під введенням і використовує алгоритм пошуку, щоб знайти правильну відповідь. Хоча жорстке кодування всіх 321 можливостей може здатися досить неефективним із завданням, настільки складним, як ця, та мовою, настільки езотеричною, як мозок, може бути найкращим рішенням. (Планую дізнатися найближчим тижнем).

Оскільки більшість 321 чисел у середньому становить приблизно 18, і вони різняться дуже мало з року в рік замість того, щоб натискати всі цифри окремо, я натискаю перший рік (2233) нормально, а потім просто дублюю і змінюю значення трохи на кожен рік після. Таким чином, замість того, щоб платити ~ 18 за всі 321 рік, я плачу лише за 2 за кожен рік.

Після того, як всі відповіді будуть висунуті, він віднімає 1912 з вхідних даних ({}[(((((((((()()()()())){}{}){}){}){}){}[()]){}){}){}])(це може бути неоптимальним, я переписав оптимізатор, щоб пропустити певні значення, які, як я вважав, не є оптимальними, тому що цифри жорсткого кодування - це суперекспоненціальний процес, і запуск його до завершення може мати приймається кілька днів).

Потім він віднімає одиницю з першого елемента і виштовхує другий елемент , поки результат не стане рівним нулю, {({}[()]<{}>)}.

Він спливає нуль, {}і всі елементи нижче верхнього елемента ({}<{{}}>).


Який загальний підхід до гольф-чисел?
Ніл

Проста ідея полягає в тому, що якщо у вас є число з коефіцієнтами n і m, ви натискаєте n m-1 рази, а потім клацаєте m-1 рази. Початковий поштовх оцінюється як n, а кожен попс оцінює як додатковий n, роблячи для (1 + m-1) (n), що є таким же, як mn. Це робиться рекурсивно, тому що для того, щоб натиснути n, ми також маємо гольф n. Оскільки цей метод не працює добре для деяких чисел, зокрема праймерів, ми також оглядаємось, чи є поблизу більш ефективне число, і якщо так, ми виражаємо це як суму цього числа та різницю.
Пшеничний майстер

Я бачу ... так дано два числа 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
Ну, якщо це правда, то +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.
Ніл

7

Bash + загальні комунальні послуги, 39

ncal $1|grep W|factor|egrep -c ': \S+$'

Рік введення приймає як параметр командного рядка. Зазвичай виводить такі повідомлення на STDERR - я вважаю, що це законно відповідно до цього метавідповіді :

factor: We is not a valid positive integer

Якщо ви хочете явно придушити вихід STDERR, ви можете зробити це замість балу 43 :

ncal $1|grep W|factor 2>-|egrep -c ': \S+$'

Зауважте, що це передбачає англійську або C / POSIX локаль. Це не так добре в gd_GB.utf8, де всі дні імена скорочуються Di.
Toby Speight

6

Октава, 86 байт

Це не швидко, на будь-якій ділянці. Але це насправді не мета кодового гольфу, чи не так?

function r=p(y)r=0;for(i=698346:7:815953)d=datevec(i);r+=d(1)==y*isprime(d(3));end;end

Октава може відстежувати дати за "номером дати" - число днів, що минули, коли 1 січня 0 день є 1. 1. За цим заходом 3 січня 1912 року (перша середа в нашому наборі) день 698 346. Почніть з цього періоду і повторюйте кожні 7-й день (усі середи) до кінця 2233 р. Та додайте 1, якщо рік є цільовим роком, а місяць-день є основним.


5

Python 2.7, 166 , 165 , 150 байт

from datetime import*
y=input()
d,c=date(y,1,1),0
while d.year==y:n=d.day;c+=n>1<2==d.weekday()>0<all(n%x for x in range(2,n));d+=timedelta(1)
print c

Тут, безумовно, є можливість для вдосконалення. Я досить новачок у гольфі в пітон. Для цього використовується datetimeмодуль. Він проходить цикл через усі дні в році, додаючи один до акумулятора, якщо він відповідає критерію. Потім він друкує результат. Більшість важких підйомів знаходиться в модулі, тому код може бути досить струнким.

Один байт збережено завдяки Morgan Thrapp та 15 байтів, збережених Pietu1998 .


1
Ви можете зберегти один байт, перейшовши n%x==0на n%x<1.
Морган Трапп

2
Це -1не обов'язково, оскільки rangeіндекс кінця є виключним. Крім того, ви можете перетворити на filterгенератор. [0for x in range(2,n)if n%x<1]
PurkkaKoodari

Ви можете використовувати any(...)або all(...)замість цього not filter(...).
kennytm

1
Поєднавши ланцюгові порівняння, allви зможете зберегти цілу купу. c+=n>1<2==d.weekday()>0<all(n%x for x in range(2,n))
PurkkaKoodari

3

J, 44 байти

+/@(valdate*3=weekday)@,.&(,/(>:,"0/p:)i.12)

Я щойно виявив, що J має вбудований для маніпуляцій датою.

Використання

Додаткові команди використовуються для форматування декількох входів / виходів.

   f =: +/@(valdate*3=weekday)@,.&(,/(>:,"0/p:)i.12)
   (,.f"0) 1912 1914 1984 1996 2063 2150 2199 2233
1912 19
1914 16
1984 17
1996 19
2063 19
2150 16
2199 18
2233 18

Пояснення

+/@(valdate*3=weekday)@,.&(,/(>:,"0/p:)i.12)  Input: year
                                       i.12   The range [0, ..., 11]
                              >:              Increment each to get the months [1, ..., 12]
                                    p:        Get the first 12 primes [2, ..., 37]
                                ,"0/          Make a table between each month and prime
                           ,/                 Join the rows
                       ,.&                    Prepend the year to each
                                              The date format is YYYY MM DD
            3=weekday                         Check if each date occurs on Wednesday
    valdate*                                  and is a valid date
+/@                                           Count the number of true values and return

1

PowerShell v3 +, 99 95 байт

Підхід грубої сили -

param($y)(1..12|%{$m=$_;2,3,5,7,11,13,17,19,23,29,31|?{(date "$m-$_-$y").DayofWeek-eq3}}).Count

Здійснює введення даних $y, циклів від 1до 12, тимчасово зберігає місяць $m, а потім перетворює цикл на кожен простір від 2до 31. Для кожного з них ми побудуємо Get-Dateконкретний день, а потім виберемо лише ті, хто має DayOfWeek -eqзначення 3(наприклад, середа). Інкапсулює, що все в парені, щоб сформувати масив, і приймає .Countйого.


Альтернативно, математичний підхід -

PowerShell v3 +, 105 байт

param($y)(16,19,18,20,16,18,19)[($a=(date "1-1-$y").DayOfWeek)]+(1,-3,0,1,2)[$y%5]*($a-in0,2,3,4)*!($y%4)

Виходить, що це просто волосся довше, ніж підступна сила, але я включаю його сюди, оскільки це може бути корисним для інших.

Знову сприймається $yяк рік. Цього разу ми виконуємо суворо математичні операції на основі першого дня року. Спочатку розраховуємо, який день тижня є, і зберігаємо його $aдля використання пізніше. Це вказує на перший масив, який отримує нам зазвичай правильне число. До цього потрібно додати другий індекс, заснований на потенційному високосному році, чи це неділя, вівторок, середа чи четвер, і виходячи з того, який рік є.

Це ґрунтується на наступному спостереженні. Перший стовпець - це день тижня 1 січня, другий - звичайний вихід. Якщо рік не є одним із середніх чисел, то це число на паренах. Заключний стовпчик описує, як працює індексація% 5.

Jan-1 -> #  ... Except if $y=       (then it's this number) | $y % 5 =
Sun   -> 16 ... 1928 1956 1984 etc. (17)                    |    3
Mon   -> 19
Tue   -> 18 ... 1924 1952 1980 etc. (20)                    |    4
Wed   -> 20 ... 1936 1964 1992 etc. (17)                    |    1
Thur  -> 16 ... 1920 1948 1976 etc. (17)                    |    0
Fri   -> 18
Sat   -> 19

Примітка. Обидва з них припускають, що en-usце поточний параметр PowerShell для інформації про культуру / дату. Форматування дати та DayOfWeekномер може потребувати відповідного коригування для інших варіантів культури.



1

JavaScript ES6, 187 182 181 179 байт

179 Замінено в циклі for для циклу while

z=y=>{D=new Date("1/3/1912");N=0;a=()=>D.getFullYear();b=()=>D.getDate();c=()=>D.setDate(b()+7);for(;a()<=y;c())N+=y-a()?0:-1<[2,3,5,7,11,13,17,19,23,29,31].indexOf(b());return N}

181 Ущільнений трійник

z=y=>{D=new Date("1/3/1912");N=0;a=()=>D.getFullYear();b=()=>D.getDate();c=()=>D.setDate(b()+7);while(a()<=y){N+=y-a()?0:-1<[2,3,5,7,11,13,17,19,23,29,31].indexOf(b());c()}return N}

182 Об’єднав дві петлі

z=y=>{D=new Date("1/3/1912");N=0;a=()=>D.getFullYear();b=()=>D.getDate();c=()=>D.setDate(b()+7);while(a()<=y){N+=a()==y?-1<[2,3,5,7,11,13,17,19,23,29,31].indexOf(b()):0;c()}return N}

187

z=y=>{D=new Date("1/3/1912");N=0;a=()=>D.getFullYear();b=()=>D.getDate();c=()=>D.setDate(b()+7);while(a()<y)c();for(;a()==y;c())N+=-1<[2,3,5,7,11,13,17,19,23,29,31].indexOf(b());return N}

Я не думаю, що це вважається тим, що ви давали першу початкову середу конкретного року в цьому прикладі. Виклик ОП говорить, що йому потрібен рік як єдиний параметр ... Хоча великі зусилля поки що ...
WallyWest

"Вхід до вашої програми / функції буде роком" - але те, на що ви вказуєте, це не так. Я використовую першу середу 1912 р. Як насіння, тому що вона є або є перед кожною другою середою у часовий період, який дає ОП, але я могла так само легко використати будь-яку довільну середу 1911 року або раніше, щоб також її посіяти. Вхід до моєї функції - це ще рік, і функція все ще обчислює кількість перших серед у будь-якому даному році у визначені ОП часові рамки, тому я не впевнений, як це не відповідає проблемі.
Pandacoder

Ах, вибачте ... Спочатку я не розумів, що ви використовуєте це як компонент посіву ... Чудова ідея ... Особливо враховуючи, що ваше рішення б'є моє приблизно 30 ..;)
WallyWest

1
Спасибі. Я почерпнув натхнення у виконанні Brain-Flak від Eamon Olive, яке фактично має всі відповіді заздалегідь запрограмовані, відповідно до його пояснення.
Pandacoder

1

Пакетна, 248 байт

@set/ad=0,l=1,n=20
@for /l %%i in (1913,1,%1)do @set/ad=(d+l+1)%%7,l=!(%%i%%4)-!(%%i%%100)+!(%%i%%400)
@goto %l%%d%
:03
:06
@set/an-=1
:12
:13
:16
@set/an-=1
:01
:04
:14
@set/an-=1
:00
:05
:10
:15
@set/an-=1
:02
:11
@echo %n%

Пояснення: dце день тижня, а 0понеділок, який зручно для 1 січня 1912 року. lЦе прапор того, чи є рік високосним, 1для 1912 року. Потім ми перебираємося з 1913 року на вхідний рік, оновлюючи день тиждень і перерахунок прапора високосного року під час поїздки. Нарешті, ми використовуємо прапор високосного року та день тижня для вказівки на те, що фактично є великою заявою перемикання, щоб визначити nкількість перших серед. Встановити n20 і зменшити його з падінням, хоч і дешевше, ніж використовувати логіку управління потоком, але підсумок полягає в тому, що якщо 1 січня неробочого року є четвер або неділя, то в інших випадках є 16 перших серед і так далі. .


1

JavaScript ES6 206 203 199 197 195 183 182 179

Не найкоротший, але найкращий, що я можу зробити зараз ... Пропозиції з гольфу вітаються ...

p=n=>--d-1?n%d&&p(n):1;v=Date;D=(x,y)=>new v(x.setDate(x.getDate()-y));W=a=>eval('for(Z=0,z=D(w=new v(a,11,31),(w.getDay()+4)%7);z>new v(a,0,1);)Z+=~~p(d=z.getDate()),z=D(z,7);Z')

Зміни:

  1. зміна потрійного компонента від: 3>=x?3-x:10-xдо6-(x+10)%7 , збереження: 3 зміни місця декларації;
  2. злилися x=w.getDay();z=D(w,6-(x+10)%7)вz=D(w,6-(w.getDay()+10)%7) , економії: 4
  3. перемістився Z=0з forциклу на декларацію дати та z=D(w,6-(x+10)%7)ввійшов уfor цикл, щоб привести в порядок, зберігаючи: 2
  4. зміщення w=new Date(a,Z=0,1)декларації в forцикл, злиття з існуючимw оголошенням, економія: 2
  5. переписати функцію основного пошуку в основну функцію тестування, заощаджуючи: 12
  6. змінити +!!на ~~зменшення та все ще перетворити p(d=1)з NaNна 0, що дозволить функції Prime Test все ще працювати, економлячи: 1
  7. Вивели всі додаткові функції з основної функції виклику W, переосмислив forцикл - переходив у зворотному порядку з 31 грудня, записував Dateоб'єкт як окрему змінну, після чого повторно записував forцикл у evalвиклик; економія 3.

@PandaCoder, я наздоганяю тебе, приятелю!


1

R, 149 147 байт

y=function(x){s=strftime;b=ISOdate
a=seq(b(x,1,1),t=b(x,12,31),b='d')
length(a[s(a,'%u')==3&trimws(s(a,'%e'))%in%c(2,3,5,7,11,13,17,19,23,29,31)])}

Перевірте це на Ideone .


0

Гроовий, 126

Groovy не має валідації простих чисел, його теж потрібно було будувати.

{n->p={x->x<3||(2..Math.sqrt(x)).every{x%it}};(new Date("1/1/$n")..new Date("12/31/$n")).collect{it[7]==4&&p(it[5])?it:0}-[0]}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.