Одного разу у нас виникло запитання, яке тільки не вдалось у неділю


39

Натхненний У нас був один раз тест одиниці, який провалився лише у неділю , написати програму або функцію, яка не робить нічого, окрім помилки, коли неділя, і виходити витончено в будь-який інший день.

Правила:

  • Не застосовується введення чи показ результатів за допомогою звичайних методів вводу- виводу , за винятком друку на STDERR або еквівалент вашої мови. Ви можете друкувати в STDOUT, якщо це побічний продукт вашої помилки.
  • Функція може повернути значення в недільні дні, поки вона нічого не надрукує
  • Ваша програма може використовувати неділю з будь-якого часового поясу чи місцевого часового поясу, якщо це буде послідовно.
  • Помилка - це те, що змушує програму закінчуватися аномально , наприклад, поділ на нульову помилку або використання неініціалізованої змінної. Це означає, що якщо який-небудь код слід було б додати після частини помилки, він не був би виконаний у неділю.
    • Ви також можете використовувати оператори, які створюють помилку вручну, еквівалентну Python's raise.
    • Сюди входять помилки виконання, помилки синтаксису та помилки під час компіляції (удачі з цим!)
  • На помилці повинна бути якась ознака, яка відрізняє її від відсутності помилок
  • Це , тому виграє найкоротший рахунок на кожній мові!

Мені доведеться чекати до неділі, щоб перевірити відповіді;)


2
"Напишіть програму або функцію, яка не робить нічого, окрім помилки в неділю, і виходите витончено в будь-який інший день", ви маєте на увазі, що кожен раз, коли вона працює в неділю, вона повинна вийти з ладу, або ви маєте на увазі, що має бути принаймні одна з можливостей - це невдача в неділю. Щоб було зрозуміліше, якщо він не вдається лише в неділю о 14:00, але не в неділю в 15:00, це добре?
Бромінд

5
Це було б ще краще, якби субота була використана. Ви могли б назвати це "Помилка суботи ввечері" і навіть працювали над деякими скоригованими текстами пісні до питання.
Аарон


1
З вашого запитання незрозуміло, що являє собою помилку. Я голосую за закриття, поки це не буде усунено.
Пшеничний майстер

3
Не насправді ... Як можна відрізнити вихід помилки від звичайного виводу. Чи щось на кшталт print "error"помилки? Доданий абзац насправді нічого не пояснює.
Пшеничний чарівник

Відповіді:



18

PHP 7, 12 байт

1%date("w");

На PHP 7 він викидає виключення типу DivisionByZeroпо неділях. Те саме відбувається, якщо його інтерпретувати за допомогою HHVM .

На PHP 5 він показує попередження (увімкнено stderr) у неділю:

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

У будь-якій версії PHP в інші дні тижня нічого не відображається.

Запустити за допомогою CLI:

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

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

Ще два байта може бути стиснутий відгонкою лапки ( 1%date(w);) , але це викликає повідомлення (яке може бути придушене правильно встановити error_reporting = E_ALL & ~E_NOTICEв php.ini).


Я вважаю, ви повинні вказати (у заголовку), що ця відповідь є лише і лише для PHP7 + та для HHVM, оскільки PHP5.6 та нижній вихід без жодних проблем. Попередження не є помилками і не зупиняють виконання коду. Якщо ви зробите 1%date("w");echo "Alive!"це, він зупиниться на PHP7 + та HHVM, але не на всіх інших версіях з PHP 4.
Ісмаїл Мігель

@IsmaelMiguel питання класифікує будь-яку друк до Стандартної помилки як помилку, тому попередження є досить хорошим у цьому випадку.
Будь ласка, перестаньте бути злим

1
Цитуючи питання: "Помилка - це те, що змушує програму припиняти аномально , наприклад, поділ на нульову помилку або використання неініціалізованої змінної. Це означає, що якби якийсь код був доданий після частини, яка помиляється, це не було б страчений у неділю. ". Це не відбувається з попередженням.
Ісмаїл Мігель

@IsmaelMiguel абзац, який ви цитуєте, був доданий до питання менше години тому.
аксіак

1
Цитуючи старішу версію, ту, що була на момент коментаря, який я писав: "[...] написати програму або функцію, яка не робить нічого, окрім помилки, коли неділя, і виходити витончено в будь-який інший день . ". Попередження проти цього рядка, оскільки PHP вийде витончено. Помилка буде фатальною помилкою або синтаксичною помилкою. Не попередження про ділення на 0. PHP 5.6 і старші не дійсні для цього виклику.
Ісмаїл Мігель


8

Java 8, 69 43 34 байт

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

-26 байт завдяки @ OlivierGrégoire .
-9 байт завдяки @Neil .

Пояснення:

Спробуйте тут.

  • v->{...}( невикористаний Void nullпараметр ) на один байт коротший ()->{...}(параметр немає).
  • new java.util.Date().getDay()поверне 0-6 за неділю-суботу, тому 1/...буде java.lang.ArithmeticException: / by zeroпомилка, якщо значення дорівнює 0, що відбувається лише у неділю.


@ OlivierGrégoire Ах, java.util.Date()чи є метод отримати день тижня .. І це навіть 0 для неділі .. Не впевнений, як я це пропустив. : S
Кевін Круїссен

Так, зазвичай, старші класи мають усі функції у коротших назвах. ;-)
Олів'є Грегоар

1
Чи дійсно це для 34 байтів? Спробуйте в Інтернеті!
Ніл

@Neil він не був дійсний на момент публікації, але став дійсним менше години пізніше. ;-) Це була моя перша ідея, хоча ...
Олів'є Грегоар

7

Python 3 , 33 байти

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

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

Python 3 , 50 байт

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

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

Збережено ~ 3 байти завдяки Rod .


1
@Rod Чому ні "Su"in time.ctime()>q(я редагував цей)?
Містер Xcoder

Я не можу цілком зрозуміти це. Як це працює?
пачолик

@pacholik "Su"in time.ctime()перевіряє, чи поточний день неділя. Якщо це помилково, >qчастина взагалі не оцінюється і все виходить безперебійно. Але якщо це правда, то друга частина нерівності оцінюється, і оскільки qвона не визначена, це призведе до а NameError.
Містер Xcoder

1
@pacholik Редагувати: Я не думаю, що я помиляюся. З метою ефективності, якщо перша частина є хибною, то Python навіть не намагається оцінити останню частину. Мені доведеться почекати до неділі, щоб перевірити це. ( Я думаю ) Демонстрація .
Містер Xcoder

3
@pacholik Зауважимо, що Python ланцюжок булевих операторів, так що це еквівалентно ("Su" in time.ctime()) and (time.ctime() > q).
користувач202729

6

Pyth , 8 7 байт

 l-6.d9

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

Пояснення

    .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

Це все ще недійсне. Ваш вихід ( 1.0не генерується помилкою ). ОП прямо сказала, що вони цього не дозволяють. Ви можете це виправити,
додавши

Але вам не дозволяється виводити на STDOUT, якщо не є неділя, і ви не виходите на STDOUT.
Містер Xcoder

@ Mr.Xcoder правильний. У недільні дні нічого не слід виводити
Джо Король

@JoKing я повністю пропустив це правило, виправлена
Rod

6

Haskell + Data.Dates , 55 байт

import Data.Dates
succ.dateWeekDay<$>getCurrentDateTime

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

Для цього використовується той факт, що неділя є останнім днем ​​тижня. dateWeekDayповертає день тижня як WeekDayтип, який просто визначається як

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

WeekDayє примірником Enum, тому ми можемо використовувати succта predотримувати наступника чи попередника буднього дня, наприклад, succ Mondayурожайності Tuesday.

Однак Sundayце останній запис перерахунку, тому виклик succ Sundayпризводить до наступної помилки:

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

Редагувати 1: Завдяки nimi за -3 байти!
Редагувати 2: -11 байт тепер, коли дозволені функції.


Повна програма: 88 81 74 69 66 байт

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

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

pureнеобхідний для підняття отриманого WeekDayназад в IO Monad. Однак Haskell бачить, що це значення жодним чином не виводиться програмою, настільки ліниве, як вираження, не оцінюється, тому навіть у неділю програма не вийде з ладу. Ось чому $!це потрібно, що змушує оцінку, навіть якщо Haskell зазвичай не оцінює вираз.


Попередній підхід з Data.Time: 127 124 байт

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

Спробуйте в Інтернеті! Це кілька вражаючих імпортів. Змініть d<7на, наприклад, d/=5для перевірки несправності в п’ятницю. Збій за винятком наступного: Non-exhaustive patterns in function c.


1
main=pure$!succ.dateWeekDay<$>getCurrentDateTime. Оскільки функції дозволені, ви можете скинути main=.
німі

@nimi Дякую! Я не впевнений у функції, через No using input or showing output through the usual IO methodsправило. Наскільки я бачу, використання функції призведе до виводу для недільних днів, навіть якщо вона завершена в IO-дії.
Лайконі

Можливо, ти маєш рацію, але з іншого боку, у повній програмі є код виходу, що також є стандартним методом.
німі

... правила виклику тепер дозволяють функціям повертати значення в недільні дні, поки вони не друкуються.
німі

@nimi Дякую за повідомлення
Лайконі

5

05AB1E , 45 44 байт

Оскільки 05AB1E не має вбудованого для отримання дня тижня, я використовував Правило Зеллера для його обчислення.

Друкує новий рядок для stderr у випадку неділі (спостерігається у режимі налагодження на TIO)

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

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

Пояснення

Загальна використана формула така
DoW = d + [(13*(m+1))/5] + y + [y/4] + [c/4] - 2*c
де DoW=day of week, d=day, m=month, y=last 2 digits of year, c=centuryі та вираження в дужках ( []) округляється вниз.

Кожен місяць, що використовується у формулі, відповідає номеру, де Jan=13,Feb=14,Mar=3,...,Dec=12
Оскільки у нас є поточний місяць у більш загальному форматі, Jan=1,...,Dec=12 ми конвертуємо місяць за формулою
m = (m0 + 11) % 14 + 1

Як двобічний продукт березня, який є першим місяцем, січень та лютий належать до попереднього року, тому розрахунок для визначення yстає
y = (year - (m0 < 3)) % 100

Остаточне значення, яке DoWми отримуємо - це int where0=Sat,1=Sun,...,6=Fri .
Тепер ми можемо явно викинути помилку, якщо результат правдивий.


11
05AB1E програє Java? Все, що я знаю, - брехня
Каміль Дракарі

5

JavaScript, 23 байти

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

Повна програма.

Змінна k не повинна визначатися.

JavaScript, 20 байт Ріка Хічкока

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

JavaScript, 19 байт apsillers

Date().match`Su`&&k

1) Ви забули включити _=>; без цього це фрагмент, який за замовчуванням не дозволений. 2) Це виводиться falseчерез день, коли він нічого не повинен виводити.
Кудлатий

6
1) Це повна програма, яка дозволена ОП. 2) Якщо запустити його як програму, виходу немає
l4m2

3
/Su/.test(Date())&&kза 20 байт.
Рік Хічкок

1
new Dateверсія 25 байт(new Date/864e5%7|0)-3||p
l4м2

3
Рішення від @RickHitchcock можна зробити коротше, виконавши matchзамість шаблону тегів :Date().match`Su`&&k
apsillers

5

VBA / VBScript, 22 20 байт

Збережено 2 байти завдяки Тейлору Скотту.

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

Це слід запустити у негайному вікні. Weekday()повертається від 1 (неділя) до 7 (субота), тому це створює помилку на поділ на нуль у неділю. Інакше виводу немає.

Повідомлення про помилку


Ви побили мене до відповіді через годину - 19 байт:?1/(Weekday(Now)-1)
Тейлор Скотт

1
@TaylorScott Я забув, що Nowце дійсно без ()VBA, але я не можу використовувати друк, тому що я думаю, що всі вихідні дані заборонені, якщо це не помилка. No using input or showing output through the usual IO methods, except to print to STDERR. Все-таки збережено 2 байти.
Інженер Тост

1
Я щойно написав ці 20 байтів як рішення VBScript, і тоді я подумав, щоб переконатися, чи існує вже наявна мова в стилі VB, і ось вона. Отже, це працює і для VBScript, і, ймовірно, для інших мов стилю VB.

@EngineerToast Я думаю, ви повинні позначити це як поліглот з VBScript
Тейлор Скотт

@TaylorScott Я цього раніше не робив. Чи правильно я це зробив?
Інженер Тост

4

Рубін, 15 байт

1/Time.now.wday

wdayу неділю поверне 0, викликаючи ZeroDivisionError: розділений на 0 помилки. Наприклад: 1/Time.new(2018,1,7).wday.



3

jq, 42 символи

(Код 39 символів + параметр командного рядка з 3 символами)

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

Тут просто спробуйте інший підхід: проаналізуйте число дня тижня (0..6) як число дня місяця (1..31).

Проба зразка:

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 обробляє лише дати UTC.

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



3

VBA 18 байт

Це спирається на вбудовану функцію, що date()повертає номер дня, який залишається 1, якщо ділиться на 7, тому може бути специфічним для ОС та / або процесора.

a=1/(date mod 7-1)

Він працює у негайному вікні проекту VBA.


2
Ласкаво просимо до PPCG! Загалом, вдячне пояснення та посилання на онлайн-компілятора / перекладача.
FantaC

@tfbninja - нормальне оновлення
JohnRC

і, якщо потрібно, інструкції щодо використання, наприклад, виклик функції чи змінну
FantaC

Хороший гольф, збирався опублікувати це сам, побачивши іншу відповідь!
Greedo

3

R , 31 байт 30 байт

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

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

Немає результатів по неділях, Error: object 'a' not foundпо неділях.

format(Sys.Date(),'%u')Це був найкоротший шлях, з якого я міг знайти вихідний день, він виводив номер класу символів для дня тижня, 7 - для неділі. Ми можемо порівняти з числовим числом 7, і якщо справжня спроба використовувати невизначений об'єкт.

Збережено байт завдяки Джузеппе!


>6- байт коротший.
Джузеппе

2

Окамл, 46 байт

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

і в ocaml REPL ми можемо досягти кращого, видаливши letі остаточне :():

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

що становить 41 байт (включаючи 1 байт для повернення вагона).


1
Ласкаво просимо до PPCG!
Лайконі

1
Чи можна змусити цей код працювати на " Спробуйте в Інтернеті" ?
Лайконі

Mmh ... команда компіляції є ocamlopt unix.cmxa <file>, я не знаю, як дати компілювати опцію для tio. Я
розвідаю

У tio використовується інтерпретатор REPL (simili), тому ви повинні використовувати другу можливість. Однак у нього, схоже, немає бібліотеки Unix (або не дозволяють отримати доступ до неї з будь-якої причини)
Bromind


2

TI-Basic 84+, 23 байти

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

Потрібні команди дати та часу, які мають лише 84+ та вище.


2

MATL , 12 байт

vZ'8XOs309>)

Помилка в неділю:

  • Біг на Октаві:

    MATL run-time error: The following Octave error refers to statement number 9:  )
    ---
    array(1): out of bound 0
    
  • Працює на Matlab:

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

Щоб інвертувати поведінку (помилка в будь-який день, крім неділі), додайте ~після >.

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

Пояснення

Це експлуатує той факт, що

  • індексування в порожній масив з логічним індексом falseє дійсним (а результат - порожнім масивом, який не видає виводу); тоді як

  • індексація за допомогою trueвикликає помилку, оскільки в масиві відсутній перший запис.

Коментований код:

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 байт

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

.zd повертає поточну дату. mod виконує модуль поточної дати, який повертає int. Якщо дата - неділя, .zd mod 7 повертається 1. Якщо 1 = 1, (у неділю), а помилка піднімається за допомогою оператора 'Для стислості помилка - це лише символ e.


3
Ласкаво просимо до PPCG!
Мартін Ендер

2

C # (.NET Core) , 55 54 48 байт

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

Збережено 1 байт завдяки Шаггі

Збережено 5 байт завдяки Еміньї

Збережено 1 байт завдяки Kevin Cruijssen

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

Пощастило, що в неділю індексується 0 у перерахунку, інакше потрібно було б (System.DayOfWeek)7



3
Ви отримуєте using Systemбезкоштовно в C #? Якщо так, я думаю, ви могли б зробити ()=>{var k=1/(int)DateTime.Now.DayOfWeek;}за 42 . Інакше 49 із явнимSystem.
Емінья

3
@Emigna побив мене до цього; ()=>{var k=1/(int)System.DateTime.Now.DayOfWeek;}коротше. І ви можете зберегти ще один байт, скориставшись порожнім невикористаним параметром замість жодного параметра (тобто v->{...}замість ()->{...})
Kevin Cruijssen

1
40 байт: ()=>1/(int)System.DateTime.Now.DayOfWeek. Спробуйте тут .
Айб4бту


2

C,  68  55 байт

Дякуємо @Ken YN за збереження 13 байт!

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

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


Відкиньте проміжне, dщоб отримати n/=gmtime(&n)->tm_wday;54 байти (але я не впевнений, що мені подобаються всі ці попередження компілятора ...)
Кен YN

@ KenY-N Дякую!
Steadybox

1

R , 40 байт

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

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

weekdaysповертає день тижня дати з необов'язковим аргументом abbreviate, який скорочується Sundayдо Sun, зберігаючи один байт.

stopifnotвидає помилку, якщо для кожного аргументу це не allтак TRUE, і видає помилку з повідомленням, що вказує на перший елемент, якого немає TRUE, тому помилкаError: "Sun" is not TRUE


Знизив це до 31 року, дещо інший підхід
Грегор


1

Гема , 40 символів

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

Довелося вказати повідомлення про помилку, тому виберіть коротке: “S”.

Проба зразка:

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

Фанки , 21 байт

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

os.date"%w"повертає поточний день тижня у форматі 0-6, де 0 - неділя. Отримання логічного не того є істинним лише тоді, коли будній день дорівнює 0, тому неділя. Тоді лише основна if(a){error()}запевнить, що ця програма лише помилки в неділю

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



Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.