Bir Pazarda Sadece Başarısız Olan Bir Sorumuz Vardı


39

İlham Verdik Bir keresinde yalnızca Pazar günleri başarısız olan , Pazar günü iken hata atmaktan başka bir şey yapmayan bir program veya işlev yazdık ve başka bir gün dikkatlice çıktık.

Kurallar:

  • STDERR'ye veya dilinizin eşdeğerine yazdırmak dışında , normal IO yöntemleriyle girdi kullanmak veya çıktı göstermek yok . Hatanızın bir ürünü ise STDOUT'a yazdırmanıza izin verilir.
  • Bir işlev, herhangi bir şey basmadığı sürece Pazar günleri için bir değer getirebilir
  • Programınız tutarlı olduğu sürece herhangi bir saat diliminden veya yerel saat diliminden bir Pazar günü kullanabilir.
  • Hata, programı sıfır hatayla bölme veya başlatılmamış bir değişken kullanma gibi anormal biçimde sonlandırmayı sağlayan bir şeydir . Bu, hatalı olan bölümden sonra herhangi bir kodun eklenmesi durumunda, Pazar günü yürütülmeyeceği anlamına gelir.
    • Python'lara eşdeğerde el ile hata oluşturan ifadeleri de kullanabilirsiniz raise.
    • Bu, çalışma zamanı hatalarını, sözdizimi hatalarını ve derleme sırasındaki hataları içerir (buna iyi şanslar!)
  • Bir hatada, onu hatasızlıktan ayıran bir işaret olmalı.
  • Bu , yani her dilde en kısa bayt kazanıyor!

Cevapları kontrol etmek için pazar gününe kadar beklemek zorunda kalacağım;)


2
"Pazar günü bir hata atmak, başka bir günde zarafetle çıkmaktan başka bir şey yapmadan bir program veya işlev yazmak" derken, pazar günleri çalıştırıldığı zaman başarısız olması gerektiğini mi, yoksa en azından olması gerektiğini mi kastediyorsunuz? bir olasılık bir pazar başarısız olur. Daha açık hale getirmek için, sadece 2 de Pazar günü, ancak 3 de Pazar günü başarısız olursa, sorun olmaz mı?
Bromind

5
Cumartesi kullansaydı bu daha iyi olurdu. Bunu "Saturday Night Error" olarak adlandırmış olabilirsiniz ve hatta soruya göre ayarlanmış bazı şarkı sözlerinde bile çalışmış olabilirsiniz.
Aaron,


1
Sorunuzdan, hata neyin oluştuğu net değildir. Bu düzelene kadar kapatmak için oy kullanıyorum.
Buğday Sihirbazı,

3
Gerçekten değil ... Bir hatanın çıktısını normal çıktıdan nasıl ayırt edebiliriz. print "error"Hata gibi bir şey mi var? Eklenen paragraf hiçbir şeyi netleştirmiyor.
Buğday Sihirbazı 18

Yanıtlar:



18

PHP 7, 12 bayt

1%date("w");

PHP 7'de DivisionByZeroPazar günleri bir tür istisna atar . Aynısı HHVM kullanılarak yorumlanırsa olur .

PHP 5’te stderrpazar günleri bir uyarı (açık ) görüntülenir:

PHP Warning:  Division by zero in Command line code on line 1

Herhangi bir PHP sürümünde, haftanın diğer günlerinde hiçbir şey göstermez.

CLI'yi kullanarak çalıştırın:

php -r '1%date("w");'

veya çevrimiçi deneyin!

İki tane daha bayt tırnak (sıyırma tarafından sıkılmış olabilir 1%date(w);) ama bu tetikleyiciler bir uyarı (tarafından baskı altına alınabilir düzgün ayarlanmış error_reporting = E_ALL & ~E_NOTICEiçinde php.ini).


PHP5.6'dan beri bu cevabın sadece ve sadece PHP7 + ve HHVM için olduğunu belirtmeniz gerektiğine inanıyorum . Uyarılar hata değildir ve kodun yürütülmesini durdurmaz. Bunu yaparsanız 1%date("w");echo "Alive!", PHP7 + ve HHVM'de durur, ancak PHP 4'ten sonraki diğer sürümlerde durmaz.
Ismael Miguel

@IsmaelMiguel, herhangi bir baskıyı Standart Hata olarak hata olarak sınıflandırır, bu nedenle bir uyarı bu durumda yeterince iyidir.
Lütfen

1
"Bir hata, programı sıfır hatayla bölmek veya başlatılmamış bir değişken kullanmak gibi programı anormal şekilde sonlandıran bir şeydir. Bu, hataların bulunduğu bölümden sonra herhangi bir kodun ekleneceği anlamına gelmez. Pazar günü idam edildi. " Bu bir uyarı ile olmaz.
Ismael Miguel 18

@IsmaelMiguel alıntı yaptığınız paragraf bir saatten daha kısa bir süre önce soruya eklendi.
axiac

1
Yazdığım yorum sırasında açık olan eski bir sürümden alıntı yapıyorum: "[...] hiçbir şey yapmayan bir program ya da işlev yazın, Pazar olduğu zaman hata atmak ve başka bir gün zarifçe çıkın . ". PHP dikkatlice çıkacağı için bu satıra karşı bir uyarı verilir. Bir hata, ölümcül bir hata veya sözdizimi hatası olabilir. 0'a bölmek için bir uyarı değil. PHP 5.6 ve daha eski sürümler bu zorluk için geçerli değildir.
Ismael Miguel,


8

Java 8, 69 43 34 bayt

v->1/new java.util.Date().getDay()

@ OlivierGrégoire sayesinde -26 bayt . @Neil
sayesinde -9 bayt .

Açıklama:

Burada dene.

  • v->{...}( kullanılmayan Void nullparametre ) bir bayttan ()->{...}(parametresiz) kısa .
  • new java.util.Date().getDay()Pazar-Cumartesi için 0-6 döndürür, bu nedenle değeri yalnızca Pazar günleri olan 0 ise hata 1/...verir java.lang.ArithmeticException: / by zero.


@ OlivierGrégoire Ah, java.util.Date()haftanın gününü elde etmek için bir yöntem var .. Ve Pazar için 0 bile. Bunu nasıl özlediğimden emin değilim. : S
Kevin Cruijssen

Evet, genellikle eski sınıflar tüm fonksiyonlara daha kısa isimlerle sahiptir. ;-)
Olivier Grégoire

1
Bu 34 bayt için geçerli mi? Çevrimiçi deneyin!
Neil

@Neil, gönderdiğiniz tarihte geçerli değildi, ancak bir saatten kısa bir süre sonra geçerli oldu. ;-) Benim ilk fikrim oydu ...
Olivier Grégoire

7

Python 3 , 33 bayt

import time
"Su"in time.ctime()>q

Çevrimiçi deneyin!

Python 3 , 50 bayt

from datetime import*
datetime.now().weekday()>5>q

Çevrimiçi deneyin!

Rod sayesinde ~ 3 bayt kaydedildi .


1
@Rod Neden olmasın "Su"in time.ctime()>q(Bununla düzenleme yaptım)?
Bay Xcoder

Tam olarak anlayamıyorum. O nasıl çalışır?
pacholik

@pacholik "Su"in time.ctime()geçerli günün Pazar olup olmadığını kontrol eder. Bu yanlışsa, >qparça hiç değerlendirilmez ve her şey sorunsuz bir şekilde çıkar. Fakat eğer bu doğruysa, o zaman eşitsizliğin ikinci kısmı değerlendirilir ve qtanımlanmadığından, bu bir atar NameError.
Bay Xcoder,

1
@pacholik Edit: Yanlış olduğumu sanmıyorum. Verimlilik açısından, eğer ilk kısım sahte ise, Python son kısmı değerlendirmek için zahmete bile girmez. Yine de bunu test etmek için pazar gününe kadar beklemem gerekecek. ( Bence ) Gösteri .
Bay Xcoder,

3
@pacholik Python'un boolean operatörlerini zincirlediğine dikkat edin, buna eşdeğerdir ("Su" in time.ctime()) and (time.ctime() > q).
user202729

6

Pyth , 8 7 bayt

 l-6.d9

Çevrimiçi deneyin!

açıklama

    .d9 # Get the current day of week (0 = Monday, 6 = Sunday)
  -6    # Subtract 6 from the day
 l      # Try to calculate the log base 2 of the result of the previous operation raising a "ValueError: math domain error" on sundays
        # there is an extra space at the start, to supress the output on the other days

Bu hala geçersiz. Çıktınız ( hata tarafından1.0 oluşturulmaz ). OP açıkça buna izin vermediklerini söyledi. Bununla birlikte, kodunuz için tek bir alan hazırlayarak düzeltebilirsiniz
Bay Xcoder

Ancak, pazar günleri olmadığı sürece STDOUT'a çıkış yapmanıza izin verilmez ve STDOUT'a çıkış yapmanıza izin verilmez.
Bay Xcoder,

@ Mr.Xcoder doğru. Pazar günleri olmayan bir şey çıktısı olmamalıdır
Jo King

@JoKing Bu kuralı tamamen atladım, şimdi düzelttim
Rod

6

Haskell + Data.Dates , 55 bayt

import Data.Dates
succ.dateWeekDay<$>getCurrentDateTime

Çevrimiçi deneyin!

Bu, Pazarın haftanın son günü olduğu gerçeğini kullanır. dateWeekDayhaftanın gününü WeekDaybasitçe tanımlanmış bir tür olarak döndürür

data WeekDay = Monday | Tuesday | Wednesday | Thursday | Friday | Saturday | Sunday

WeekDaybunun bir örneğidir Enum, bu nedenle haftada bir halef veya selefi, örneğin verimleri kullanabilir succve predalabiliriz .succ MondayTuesday

Ancak, Sundayenum enum girişidir, bu nedenle arama succ Sundayaşağıdaki hata ile sonuçlanır:

fail_on_sunday.hs: succ{WeekDay}: tried to take `succ' of last tag in enumeration
CallStack (from HasCallStack):
  error, called at .\Data\Dates.hs:56:34 in dates-0.2.2.1-6YwCvjmBci55IfacFLnAPe:Data.Dates

Düzenleme 1: -3 bayt için nimi sayesinde!
Düzenleme 2: -11 byte şimdi fonksiyonlara izin verilir.


Tam program: 88 81 74 69 66 bayt

import Data.Dates
main=pure$!succ.dateWeekDay<$>getCurrentDateTime

Çevrimiçi deneyin!

puresonucu WeekDayIO Monad'a kaldırmak için gereklidir . Ancak Haskell, değerin program tarafından hiçbir şekilde çıkmadığını, ifadenin değerlendirilmediği kadar tembel olduğunu, pazar günlerinde bile programın başarısız olamayacağını görüyor. Bu nedenle $!, Haskell normalde ifadeyi değerlendirmeseydi bile değerlendirmeye zorlar.


Önceki yaklaşımla Data.Time: 127 124 bayt

import Data.Time.Clock
import Data.Time.Calendar.WeekDate
c(_,_,d)|d<7=d
main=getCurrentTime>>=(pure$!).c.toWeekDate.utctDay

Çevrimiçi deneyin! Bunlar etkileyici ithalatlar. d<7Örneğin d/=5bir Cuma günü başarısızlığı test etmek için değiştirin . Aşağıdaki hariç Başarısız: Non-exhaustive patterns in function c.


1
main=pure$!succ.dateWeekDay<$>getCurrentDateTime. Ve, fonksiyonlara izin verildiği gibi, bırakabilirsiniz main=.
nimi

@ nimi Teşekkürler! Kuraldan dolayı fonksiyondan emin değilim No using input or showing output through the usual IO methods. Gördüğüm kadarıyla, bir işlev kullanmak bir IO eylemine dahil olmasına rağmen Pazar günleri için bir çıktıya yol açacak.
Laikoni

Belki de haklısınız, ancak öte yandan, tam bir programın aynı zamanda standart bir yöntem olan bir çıkış kodu vardır.
nimi

... meydan okuma kuralları artık işlevlerin, Pazar günleri dışındaki değerleri yazdırılmadıkları sürece döndürmelerini sağlar.
nimi

@nimi Bildirim için teşekkürler.
Laikoni

5

05AB1E , 45 44 bayt

05AB1E haftanın gününü almak için yerleşik olmadığından, hesaplamak için Zeller Kuralı'nı kullandım.

Pazar günü durumunda stderr'e yeni bir satır yazdırır (TIO'daki hata ayıklama görünümünde gözlemlenebilir)

žežf11+14%Ì13*5÷žgžf3‹-т%D4÷žgт÷©4÷®·(O7%i.ǝ

Çevrimiçi deneyin!

açıklama

Kullanılan genel formül
DoW = d + [(13*(m+1))/5] + y + [y/4] + [c/4] - 2*c
durumlarda DoW=day of week, d=day, m=month, y=last 2 digits of year, c=centuryve parantez içinde ekspresyonu ([] ) yuvarlak düştü.

Formülde kullanılan her ay, bir sayıya karşılık gelir; buradaki Jan=13,Feb=14,Mar=3,...,Dec=12
mevcut ayı daha yaygın biçimde Jan=1,...,Dec=12 yaptığımız için, ayı formülünü kullanarak dönüştürürüz.
m = (m0 + 11) % 14 + 1

Mart ayının genel prosedürdeki ilk ay olmak üzere, Ocak ve Şubat önceki yıla aittir, belirlemek için hesaplama çok yolur
y = (year - (m0 < 3)) % 100

Elde DoWettiğimiz son değer bir int 0=Sat,1=Sun,...,6=Fri.
Sonuç doğruysa şimdi açıkça bir hata yapabiliriz.


11
05AB1E Java'ya mı kaybediyor? Bildiğim her şey bir yalan
Kamil Drakari

5

JavaScript, 23 Bayt

Date().slice(1)>'um'&&k

Tam program

Değişken ktanımlanmamalıdır.

JavaScript, 20 bayt tarafından Rick Hitchcock

/Su/.test(Date())&&k

JavaScript, 19 bayt apsillers tarafından

Date().match`Su`&&k

1) Sen dahil etmeyi unuttun _=>; onsuz bu, varsayılan olarak izin verilmeyen bir pasajdır. 2) Bu false, herhangi bir günde herhangi bir şey çıkarmaması gerektiği zaman çıkar.
Shaggy

6
1) OP tarafından izin verilen tam bir program. 2) Bir program olarak çalıştırırsanız, çıktı yok
l4m2

3
/Su/.test(Date())&&k20 bayt için.
Rick Hitchcock

1
new Datesürüm 25 bayt(new Date/864e5%7|0)-3||p
l4m2

3
@RickHitchcock'un çözümü matchbunun yerine şablon etiketi uygulaması ile daha kısa hale getirilebilir :Date().match`Su`&&k
apsillers 20

5

VBA / VBScript, 22 20 bayt

Taylor Scott sayesinde 2 bayt kaydedildi.

a=1/(Weekday(Now)-1)

Bu Komut Penceresinde çalıştırılmalıdır. Weekday()1 (Pazar) ile 7 (Cumartesi) arasında 1 değerini döndürür; Aksi takdirde çıktı yok.

Error Message


Beni bir saate kadar cevapla yendin - 19 Bayt:?1/(Weekday(Now)-1)
Taylor Scott

1
@TaylorScott Bunun VBA Nowolmadan geçerli olduğunu unuttum, ()ancak baskı kullanamıyorum çünkü hata çıkmadıkça tüm çıktılara izin verilmiyor. No using input or showing output through the usual IO methods, except to print to STDERR. Yine de 2 bayt kaydedildi.
Mühendis Toast,

1
Bu tam 20 baytı bir VBScript çözümü olarak yazmıştım ve daha sonra zaten sunulan bir VB tarzı dil olup olmadığını görmek için bakacağımı düşündüm ve burada. Yani, bu VBScript ve muhtemelen diğer VB tarzı diller için de geçerlidir.

@EngineerToast Ben bu VBScript ile bir polyglot olarak işaretlemek gerektiğini düşünüyorum
Taylor Scott

@TaylorScott Bunu daha önce yapmadım. Doğru yaptım mı?
Mühendis Toast,

4

Ruby, 15 bayt

1/Time.now.wday

wdayPazar günü 0 döndürür, ZeroDivisionError'a neden olur: 0 hataya bölünür. Örneğin: 1/Time.new(2018,1,7).wday.


4

Perl 5 , 13 bayt

1/(gmtime)[6]

Çevrimiçi deneyin!

@ Biketire'ın answerj

@ mik'in hatırlatması ile 3 bayt kaldırıldı


1
gmtimeyerine localtimekuralları da yerine getirecek ve 3 bayt daha kısa olacak
mik

3

jq, 42 karakter

(39 karakter kod + 3 karakter komut satırı seçeneği)

now|strftime("%w")|strptime("%d")|empty

Sadece burada farklı bir yaklaşım denemek: hafta içi gün sayısını (0..6) ayın gün sayısı (1..31) olarak.

Örnek çalışma:

bash-4.4$ TZ=UTC faketime 2018-01-06 jq -n 'now|strftime("%w")|strptime("%d")|empty'

bash-4.4$ TZ=UTC faketime 2018-01-07 jq -n 'now|strftime("%w")|strptime("%d")|empty'
jq: error (at <unknown>): date "0" does not match format "%d"

JQ yalnızca UTC tarihlerini işlediğini unutmayın.

Çevrimiçi deneyin!



3

VBA 18 bayt

Bu date(), 7'ye bölünürse 1'e kalan kalan bir gün numarası döndüren dahili fonksiyona dayanır , bu nedenle işletim sistemi ve / veya CPU'ya özel olabilir.

a=1/(date mod 7-1)

VBA projesi anında penceresinde çalışır.


2
PPCG'ye Hoşgeldiniz! Genel olarak, bir açıklama ve çevrimiçi bir derleyici / tercümanla ilgili bir bağlantı takdir edilmektedir.
FantaC

@tfbninja - Tamam güncelleniyor
JohnRC

ve, gerekirse, nasıl kullanılacağına ilişkin talimatlar, örneğin işlev çağrısı veya değişken
FantaC

Güzel golf, diğer cevabı gördükten sonra hemen kendim göndermek üzereydi!
Greedo

3

R , 31 bayt 30 bayt

if(format(Sys.Date(),'%u')>6)a

Çevrimiçi deneyin!

Pazar günleri, Error: object 'a' not foundpazar günleri ise çıktı yok .

format(Sys.Date(),'%u')hafta içi almak için bulabildiğim en kısa yoldu, haftanın günü için karakter sınıfı sayısını, Pazarları için 7'yi çıkardı. Sayısal 7 ile karşılaştırabiliriz ve eğer tanımlanmamış bir nesneyi kullanmaya çalışabilirsek.

Giuseppe sayesinde bir bayt kaydedildi!


>6bayt daha kısa.
Giuseppe

2

Ocaml, 46 bayt

open Unix
let()=1/(gmtime(time())).tm_wday;()

ve ocaml REPL'de letfinali kaldırarak daha iyisini başarabiliriz.:() :

$ open Unix;;1/(gmtime(time())).tm_wday;;<CR>

41 bayttır (satır başı için 1 bayt içeren).


1
PPCG'ye Hoşgeldiniz!
Laikoni


Mmh ... derleme komutu, ocamlopt unix.cmxa <file> 'dir, tio'da nasıl derleme seçeneği vereceğimi bilmiyorum. Bu akşam araştıracağım
Bromind

Tio bir (simili) REPL yorumlayıcısı kullanır, bu yüzden 2. olasılığı kullanmalısınız. Ancak, Unix kütüphanesine sahip görünmüyor (ya da herhangi bir sebeple erişime izin vermiyor)
Bromind

2

SAS, 36 bayt

%put %eval(1/(1-%index(&sysday,Su)))

2

TI-Basic 84+, 23 bayt

getDate
0/(1-dayOfWk(Ans(1),Ans(2),Ans(3

Sadece 84+ ve daha yüksek olan tarih ve saat komutlarına ihtiyaç duyuyor.


2

MATL , 12 bayt

vZ'8XOs309>)

Pazar günleri üretilen hata:

  • Octave'da Çalışmak:

    MATL run-time error: The following Octave error refers to statement number 9:  )
    ---
    array(1): out of bound 0
    
  • Matlab üzerinde çalışan:

    MATL run-time error: The following MATLAB error refers to statement number 9:  )
    ---
    Index exceeds matrix dimensions
    

Davranışı tersine çevirmek için (pazar günleri hariç herhangi bir günde hata), ~ardından ekleyin >.

Çevrimiçi Deneyin!

açıklama

Bu gerçeği sömürüyor

  • mantıksal indeks ile boş bir diziye indeksleme falsegeçerlidir (ve sonuç çıktı üretmeyen boş bir dizilimdir); buna karşılık

  • trueDizinin ilk girişi olmadığı için indeksleme bir hataya neden olur.

Yorumlanan kod:

v       % Concatenate stack. Gives empty array
Z'      % Push current date and time as a number
8XO     % Convert to date string with format 8: gives 'Mon', 'Tue' etc
s       % Sum of ASCII codes. Gives 310 for 'Sun', and less for others
309>    % Greater than 309? Gives true for 'Sun', false for others
)       % Index into the empty array
        % Implicit display. Empty arrays are not displayed (not even newline)

2

Q, 20 Bayt

if[1=.z.d mod 7;'e]

.zd geçerli tarihi döndürür. mod, int değerini döndüren geçerli tarihin modulosunu yapar. Eğer tarih bir pazar ise, .zd mod 7 1 döndürür. Eğer 1 = 1 ise (pazarda) ve 'operatörü kullanılarak hata oluşturulur.


3
PPCG'ye Hoşgeldiniz!
Martin Ender

2

C # (.NET Core) , 55 54 48 bayt

Çevrimiçi deneyin!

Shaggy sayesinde 1 bayt kaydedildi

Emigna sayesinde 5 bayt kaydedildi

Kevin Cruijssen sayesinde 1 bayt kaydedildi

_=>{var k=1/(int)System.DateTime.Now.DayOfWeek;}

Pazar enum içinde 0 dizinli olduğunu ya da başka bir şey olması gerekeceğini şanslı (System.DayOfWeek)7



3
using SystemC # ile bedava mı kazanıyorsun ? Öyleyse 42()=>{var k=1/(int)DateTime.Now.DayOfWeek;} için yapabileceğini düşünüyorum . Aksi takdirde 49 ile açıkSystem.
Emigna

3
@Emigna beni dövdü; ()=>{var k=1/(int)System.DateTime.Now.DayOfWeek;}daha kısa. Parametre yerine boş bir kullanılmayan parametre kullanarak bir bayttan daha fazla tasarruf edebilirsiniz (yani v->{...}yerine ()->{...})
Kevin Cruijssen

1
40 bayt: ()=>1/(int)System.DateTime.Now.DayOfWeek. Burada dene .
Ayb4btu


2

C,  68  55 bayt

13 byte tasarruf için @Ken YN'ye teşekkürler!

#import<time.h>
f(n){time(&n);n/=gmtime(&n)->tm_wday;;}

Çevrimiçi deneyin!


54 bayt dalmak n/=gmtime(&n)->tm_wday;için orta seviyeyi bırakın (ancak tüm bu derleyici uyarılarını sevdiğimden emin değilim ...)
Ken YN

@ KenY-N Teşekkürler!
Steadybox

1

R , 40 bayt

stopifnot(weekdays(Sys.Date(),T)!="Sun")

Çevrimiçi deneyin!

weekdaysİsteğe bağlı argüman ile, tarih hafta içi döner abbreviate, kısalmaktadır Sundayiçin Suntek bir bayt tasarruf.

stopifnotHer bir değişken için değil, eğer bir hata verir allvardır TRUEve bunlardan olmayan ilk elemanı gösteren bir mesaj ile bir hata verir TRUEhata yani,Error: "Sun" is not TRUE




1

Gema , 40 karakter

\A=@subst{Su=\@err\{S\}\;*=;@datime}@end

Bir hata mesajı belirlemek zorunda kaldı, o yüzden kısa bir mesaj seçin: “S”.

Örnek çalışma:

bash-4.4$ faketime 2018-01-06 gema '\A=@subst{Su=\@err\{S\}\;*=;@datime}@end'

bash-4.4$ faketime 2018-01-07 gema '\A=@subst{Su=\@err\{S\}\;*=;@datime}@end'
S

1

Funky , 21 bayt

if!os.date"%w"error()

os.date"%w"haftanın geçerli gününü 0'ın pazar olduğu 0-6 biçiminde döndürür. Bunun mantığını almamak, sadece hafta içi 0, yani Pazar olduğunda geçerlidir. O zaman sadece bir temelif(a){error()} , bu programın yalnızca pazar günlerinde hata yapılacağına dair güvence verir.

Çevrimiçi deneyin!



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.