Başbakan çarşambaları


22

Başbakan çarşambaları

Görevin, belirli bir yılda, ayın ilk gününde düşen çarşamba sayısını saymak. Mesela 7-13-16Çarşamba günü bir başbakan. Tutarlılık için tüm tarihler için Gregoryen takvimini kullanın .

Giriş

Programınıza / işleve giriş bir yıl olacak (örn. 2016) Ve esnektir. Yıl dahil, 1912 ile 2233 arasında bir tamsayı olacak .

Çıktı

Çıktı da esnektir ve en yüksek çarşamba günleri olmalıdır (örn. 18).

puanlama

Bu yani bayt cinsinden en kısa kod kazanır!

Test Kılıfları

giriş -> çıkış
--------------------
1912 -> 19
1914 -> 16
1984 -> 17
1996 -> 19
2063 -> 19
2150 -> 16
2199 - > 18
2233 -> 18

Yanıtlar:


7

MATL , 38 36 34 bayt

FT+"@llI$YO]q&:t8XO!s9\~)9#1$ZOZps

Çevrimiçi deneyin! Veya tüm test durumlarını doğrulayın (birkaç saniye sürer).

açıklama

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'nin tarihe dayalı zorluklarla yenilemediğine ikna oldum. Tarihe dayalı zorlukların üstesinden gelmek için daha da optimize edilmiş olan DATL'yi oluşturmalıyız.
Suever,

@Suever Haha, güzel isim
Luis Mendo

20

Python 2, 95 93 68 67 bayt

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

1 byte kapalı golf için @Josay için teşekkürler!

İdeone üzerinde test et .


3
Bunun 0x10ea2c8dbb06c5619yerine 1 karakter kaydedebilirsiniz 19501370182350951961.
SylvainD

Fikrini anlıyorum big_constant//5**long_expressionama bu sabit ve bu ifadeyle nasıl dünyaya geldin? Bu çılgınlık: D
Sherlock9

2
Sabit, 5 basamağı kullanan ancak 10 basamağına dönüştürülen basit bir arama tabelasıdır; İfade bana kalıcı bir takvim gibi görünüyor. (Cevaplar bu aralık dahilinde her 28 yılda bir tekrar ettiği için 1901'den 2099'a kadar olan yıllar ile sınırlı olsaydı, sorun çok kolay olurdu, bu yüzden sadece mod 28'i almak ve tabloya bakmak için bir durum olurdu. )
Neil,

13

Brain-Flak , 6588 , 2310 , 2308 , 2290 bayt

İlk önce, programın neredeyse% 100'ünü yazmadım, ki bu programın büyüklüğü tarafından muhtemelen kanıtlanmıştır. Bu kodun çoğu kendi Brain-Flak golf algoritması ile yazılmıştır . Ek bir python betiği ile birlikte doğru yönde istemek için yazdım.

Çevrimiçi deneyin!

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

Bu program kod golf için oldukça uzun olsa da, gerçekten Brain-Flak için oldukça kısa. Şu anda tamsayı bölümü için dünya rekoru 1000 bayttan fazla.

açıklama

Algoritma oldukça basittir. Sınırlı sayıda yıl olduğundan (321) cevapları girdi altında ters sırada iter ve doğru cevabı bulmak için bir arama algoritması kullanır. Tüm 321 olasılıkların kodlanması, bunun kadar karmaşık bir görev ve beyin-flak kadar ezoterik bir dil için oldukça yetersiz görünebilirken, en iyi çözüm bu olabilir. (Gelecek hafta öğrenmeyi planlıyorum).

321 sayıların çoğu ortalama olarak 18 olduğundan ve tüm sayıları ayrı ayrı tutmak yerine yıldan yıla çok az farklılık gösterdiğinden, ilk yılı (2233) normal olarak itiyorum ve daha sonra her yıl için değeri biraz kopyalayıp değiştiriyorum sonra. Bu yolla, 321 yıl boyunca ~ 18 itmek yerine sadece her yıl ~ 2 itmek için ödeme yapıyorum.

Tüm cevaplar gönderildikten sonra, 1912'yi girişten çıkarır ({}[(((((((((()()()()())){}{}){}){}){}){}[()]){}){}){}])(Bu düşük kaliteli olabilir, optimize ediciyi, kodlama sayıları süper üstel bir işlem olduğundan ve tamamlamaya çalışacağından emin olamayacağımı düşündüğüm bazı değerleri atlamak için yeniden yazdım. birkaç gün sürdü).

Daha sonra, birinciyi ilk elemandan çıkarır ve sonuç sıfıra ulaşana kadar ikinci elemanı çıkar {({}[()]<{}>)}.

Sıfırı ve {}üst öğenin altındaki tüm öğeleri açar ({}<{{}}>).


Golf numaralarına genel yaklaşım nedir?
Neil,

Basit bir fikir n ve m faktörlerini içeren bir sayıya sahipseniz, n m-1'e basar ve sonra m-1'e basarsınız. İlk basma n olarak değerlendirilir ve her pop, ek bir n olarak değerlendirilir ve mn ile aynı olan (1 + m-1) (n) değerini alır. Bu yinelemeli olarak yapılır çünkü n'i zorlamak için golf oynamamız gerekir. Bu yöntem bazı sayılar için özellikle asal sayılar için iyi çalışmadığından, yakınlarda daha verimli sayılar olup olmadığını görmek için etrafa bakarız ve öyleyse bunu sayının toplamı ve farkın toplamı olarak ifade ederiz.
Buğday Sihirbazı

Görüyorum ... yani iki sayı verilmiş nve mhangileri uzunlukları var kve lsanırım n+muzunluğu olacak k+l? Ne hakkında n*m?
Neil,

n*molurdu k+4m-4ya da l+4n-4. Bunun nedeni çarpımın kodlanmış olmasıdır. İlk n m-1defa zorluyoruz . Bu biz ihtiyaç yapmak için kifade etmek amacıyla semboller nve 2m-2iter ifade etmek sembolleri (her push 2 semboller ise). Sonra m-1zamanları patlatırız, bize ek 2m-2ücrete tikarlar (2 sembol de patlar). Bu toplamıdır k+4m-4. ayrıca m*nelde etmek için (değişmeli özellik) ile çarpabiliriz l+4n-4. Sonuç, ikisinin daha kısa olacak.
Buğday Sihirbazı

1
Öyleyse, bu doğruysa, +12'ye mal olur, *24'e mal olur, *38'e mal olur, *412'ye malolur, ki bundan daha pahalıdır *2*2, o yüzden buna değmez (1000'den az olan rakamlar kullanmayan sadece 10 tane buldum *2: 1, 2, 3 , 4, 5, 9, 15, 27, 45, 135). 1912 için yapabileceğimin en iyisi ((((((1+1+1)*2+1)*2*2+1)*2+1)*2+1)*2+1)*2*2*252 idi.
Neil

7

Bash + ortak yardımcı programları, 39

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

Giriş yılını komut satırı parametresi olarak alır. Genelde böyle mesajları STDERR'ye verir - Bunun meta-cevaba göre yasal olduğunu düşünüyorum :

factor: We is not a valid positive integer

STDERR çıktısını açıkça bastırmak istiyorsanız, bunun yerine 43 puan için bunu yapabilirsiniz :

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

Bunun bir İngilizce veya C / POSIX yerel ayarı olduğunu unutmayın. gd_GB.utf8Bütün gün isimlerinin kısaltıldığı yerlerde pek iyi çalışmaz Di.
Toby Speight

6

Octave, 86 bayt

Bu hızlı değil , herhangi bir gerilimle. Ama bu bir kod golfünün hedefi değil, değil mi?

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

Octave tarihleri ​​"tarih numarasıyla" izleyebilir - 1 Ocak 0 gün 1 olduğunda geçen gün sayısı. Bu önlemle 3 Ocak 1912 (setimizdeki ilk Çarşamba) 698,346 gündür. Oradan başlayın ve 2233'ün sonuna kadar her 7 günde bir (tüm çarşamba günleri) tekrarlayın ve eğer yıl hedef yılsa ve ayın birinci günü ise 1 ekleyin.


5

Python 2.7, 166 , 165 , 150 bayt

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

Burada iyileştirmeye kesinlikle yer var. Python'da golf oynamak için yeniyim. Bu datetimemodül kullanır . Kriterlere uygun olması durumunda, yıl içindeki tüm günler boyunca bir akümülatöre bir tane ekler. Sonra sonucu yazdırır. Ağır kaldırmaların çoğu modülde olduğundan kod oldukça zayıf olabilir.

Morgan Thrapp ve Pietu1998 tarafından kaydedilen 15 byte sayesinde bir byte kaydedildi .


1
Sen geçiş yaparak bir bayt kaydedebilirsiniz n%x==0için n%x<1.
Morgan Thrapp

2
-1Olarak gerekli değildir rangebireyin uç endeksi özeldir. Ayrıca, filterbir jeneratöre dönüştürebilirsiniz . [0for x in range(2,n)if n%x<1]
PurkkaKoodari

Kullanabilir any(...)veya all(...)yerine not filter(...).
kennytm

1
Zincirleme karşılaştırmaları birleştirerek allbütün bir demet kurtarabilirsiniz. c+=n>1<2==d.weekday()>0<all(n%x for x in range(2,n))
PurkkaKoodari

3

J, 44 bayt

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

J'nin tarih manipülasyonu için yerleşik olduğunu keşfettim.

kullanım

Ekstra komutlar çoklu giriş / çıkışı formatlamak için kullanılır.

   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

açıklama

+/@(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 bayt

Kaba kuvvet yaklaşımı -

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

Girişini Alır $ygelen, döngüler 1için 12içine geçici olarak ay, mağazalar $m, sonra gelen her asal üzerinde döngüler 2için 31. Bunların her biri için, o Get-Dategünün belirli bir kısmını inşa ediyoruz , sonra sadece DayOfWeek -equal olanları seçiyoruz 3(yani Çarşamba). Bir diziyi formüle etmek için hepsinin bir parens içinde olmasını sağlar ve bunları alır .Count.


Alternatif olarak, matematiksel yaklaşım -

PowerShell v3 +, 105 bayt

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)

Kaba kuvvet yaklaşımından daha uzun bir saç olmak için rüzgâr alıyor, ancak başkalarına faydalı olabileceğinden onu buraya dahil ediyorum.

Yine $yyıl olarak girdi alıyor . Bu kez, yılın ilk gününe göre kesinlikle matematik işlemleri gerçekleştiriyoruz. Öncelikle haftanın hangi gününü hesaplıyoruz ve $adaha sonra kullanmak üzere saklıyoruz. Bu bize ilk dizine endekslenir, bu da bize genellikle doğru olan sayıyı verir. Potansiyel bir artık yıl olup olmadığına, Pazar mı, salı, çarşamba mı yoksa perşembe mi olduğuna ve yılın ne olduğuna bağlı olarak ikinci bir endeksi eklemek zorundayız.

Bu, aşağıdaki gözlemlere dayanmaktadır. İlk sütun 1 Ocak haftanın günü, ikincisi ise normal çıktı. Yıl, orta sayılardan biri değilse, o zaman bunun yerine parenlerdeki sayıdır. Son sütun% 5 endekslemenin nasıl çalıştığını açıklar.

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

Not: Bu varsayımların en-usher ikisi de, kültür / tarih bilgileri için geçerli PowerShell ayarıdır. Tarih formatlaması ve DayOfWeeksayının diğer kültür varyantları için uygun şekilde ayarlanması gerekebilir.


1

Ruby, 83 + 15 ( -rdate -rprimebayraklar) = 98 bayt

Çevrimiçi deneyin! (Alınan modüller satır içindedir, çünkü repl.it dosyasında bayraklar kullanabilirsem idk)

->y{k=0;Prime.each(31){|d|k+=(1..12).count{|m|Date.new(y,m,d).wday==3 rescue p}};k}

1

JavaScript ES6, 187 182 181 179 bayt

179 while döngüsü için for-loop olarak değiştirildi

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 Üçlüyü sıkıştırdı

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 İki döngüyü birleştirdi

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}

Bu örnekte, söz konusu yıl için ilk yıl Çarşamba günü verdiğiniz kadar önemli olduğunu sanmıyorum. OP'nin mücadelesi, yıla tek parametre olarak ihtiyacı olduğunu söylüyor ... Şimdiye kadarki büyük çaba ...
WallyWest

"Programınıza / işleve giriş bir yıl olacak" - ancak belirttiğiniz şey bu değil. 1912'nin ilk Çarşamba'sını tohum olarak kullanıyorum, çünkü OP tarafından verilen sürede Çarşamba her birinden önce veya daha önce, ancak 1911'den sonra veya daha önce tohumlamak için herhangi bir keyfi Çarşamba günü kolayca kullanabilirim. Fonksiyonumun girişi hala bir yıldır ve fonksiyon hala OP'nin önerdiği zaman diliminde herhangi bir yıldaki ana çarşamba günlerinin sayısını hesaplıyor, bu yüzden bunun zorluğa nasıl uyduğundan emin değilim.
Pandacoder

Ah, özür dilerim ... İlk başta bunu bir tohumlama bileşeni olarak kullandığınızı farketmedim ... Harika bir fikir ... Özellikle çözümün benimkileri 30'a kadar yendiğini düşününce;)
attığını düşünürsün

1
Teşekkürler. Açıklamasına göre, Eamon Olive'in önceden programlanmış cevapların hepsinin yer aldığı Brain-Flak uygulamasından ilham aldım.
Pandacoder 23

1

Toplu iş, 248 bayt

@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%

Açıklama: d0 1 Ocak 1912 olan Pazartesi gününe göre haftanın günüdür. 1912 liçin yılın artık bir yıl olup olmadığının bir bayrağıdır 1. Daha sonra 1913'ten giriş yılına kadar geçen gün gününü güncelleriz. hafta ve artık yıl atladığımız bayrağını yeniden hesaplamak. Son olarak, artık nçarşamba günlerinin sayısını belirlemek için büyük bir anahtar ifadesinin ne kadar etkili olduğunu belirlemek için artık yıl bayrağını ve haftanın gününü kullanıyoruz . n20'ye ayarlamak ve düşüşe rağmen düşürmek akış kontrol mantığını kullanmaktan daha ucuzdur, ancak sonuç olarak, artık olmayan bir yılın 1 Ocak'ının Perşembe veya Pazar olması durumunda diğer davalar için 16 başbakan vb. .


1

JavaScript ES6 206 203 199 197 195 183 182 179

En kısa değil, ama şimdilik en iyisini yapabilirim ... Golf önerileri hoş geldiniz ...

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')

değişiklikler:

  1. üçlü bileşeni aşağıdakilerden değiştirerek: 3>=x?3-x:10-x den 6-(x+10)%7, tasarruf: 3 Beyan yeri değişikliklerinde;
  2. birleşti x=w.getDay();z=D(w,6-(x+10)%7) için z=D(w,6-(w.getDay()+10)%7)tasarruf: 4
  3. kaydırılmış Z=0gelen fortarihi beyanına döngü ve itilirz=D(w,6-(x+10)%7) içine fortasarruf çeki düzen vermek için döngü: 2
  4. kaydırılmış w=new Date(a,Z=0,1)olarak beyanfor döngünün , mevcut wbildirimle birleşti , tasarruf: 2
  5. asal bulma işlevini bir asal test işlevine yeniden yazmak, tasarruf: 12
  6. Değişen +!!için ~~azaltmak ve hala dönüştürmek için p(d=1)gelen NaNiçin 0tasarruf hala çalışmalarına Başbakan Testi işlevini sağlayan: 1
  7. Ana çağıran fonksiyon dışı tüm ekstra fonksiyonlar taşındı W, en yeniden fordöngü - 31 Aralık ters gidiyor yazma Dateayrı değişken olarak dışarı nesneyi, o zamanlar yazdığı yeniden foriçine döngü evalçağrısı; 3 kurtarıyor.

@PandaCoder, sana yetişiyorum dostum!


1

R, 149 147 bayt

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)])}

İdeone üzerinde test et .


0

Harika, 126

Groovy'nin asal sayı doğrulaması yok, bunu da yapmak zorunda kaldı.

{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]}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.