У нас был вопрос, который не удался только по воскресеньям

39

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

Правила:

  • Не использовать ввод или показывать вывод с помощью обычных методов ввода-вывода , кроме как для печати в STDERR или эквивалент вашего языка. Вам разрешено печатать в STDOUT, если это побочный продукт вашей ошибки.
  • Функция может возвращать значение не по воскресеньям, если она ничего не печатает
  • Ваша программа может использовать воскресенье из любого часового пояса или местного часового пояса, если это не противоречит.
  • Ошибка - это то, что приводит к аварийному завершению программы , например, ошибка деления на ноль или использование неинициализированной переменной. Это означает, что если какой-либо код будет добавлен после той части, которая содержит ошибки, он не будет выполнен в воскресенье.
    • Вы также можете использовать операторы, которые вручную создают ошибку, эквивалентную Python raise.
    • Это включает ошибки времени выполнения, синтаксические ошибки и ошибки при компиляции (удачи в этом!)
  • На ошибке должен быть какой-то признак, который отличает ее от отсутствия ошибки
  • Это , поэтому выигрывает самый короткий счет на каждом языке!

Я буду ждать до воскресенья, чтобы проверить ответы;)

Джо Кинг
источник
2
Под «написанием программы или функции, которая ничего не делает, кроме как выдает ошибку в воскресенье, и корректно завершает работу в любой другой день», вы подразумеваете, что всякий раз, когда она запускается в воскресенье, она должна давать сбой, или вы подразумеваете, что должно быть по крайней мере одна возможность, это не удастся в воскресенье. Чтобы было понятнее, если не получится только в воскресенье в 14:00, но не в воскресенье в 15:00, хорошо?
Броминд
5
Это было бы еще лучше, если бы использовалась суббота. Вы могли бы назвать это «Ошибка субботнего вечера» и даже поработать над некоторыми адаптированными текстами песен к этому вопросу.
Аарон
3
Воскресенье? Как насчет провала между полуночью и часом ночи ?
Draco18s
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).

axiac
источник
Я считаю, что вы должны указать (в заголовке), что этот ответ только и только для PHP7 + и для HHVM, поскольку PHP5.6 и ниже выход без каких-либо проблем. Предупреждения не являются ошибками и не останавливают выполнение кода. Если вы это сделаете 1%date("w");echo "Alive!", он остановится в PHP7 + и HHVM, но не во всех других версиях, начиная с PHP 4.
Исмаэль Мигель
@IsmaelMiguel вопрос классифицирует любую печать как стандартную ошибку как ошибку, поэтому предупреждение достаточно в этом случае.
Пожалуйста, перестань быть злым
1
Цитирую вопрос: «Ошибка - это то, что приводит к аварийному завершению программы , например, ошибка деления на ноль или использование неинициализированной переменной. Это означает, что если какой-либо код будет добавлен после той части, которая содержит ошибки, это не будет казнен в воскресенье ". Это не происходит с предупреждением.
Исмаэль Мигель
@IsmaelMiguel абзац, который вы цитируете, был добавлен к вопросу менее часа назад.
Аксиак
1
Цитируя более старую версию, ту, которая была включена во время комментария, который я написал: «[...] напишите программу или функцию, которая ничего не делает, только выдает ошибку, когда это воскресенье, и корректно завершает работу в любой другой день ".. Предупреждение против этой строки, потому что PHP выйдет изящно. Ошибка будет фатальной ошибкой или синтаксической ошибкой. Не предупреждение о делении на 0. PHP 5.6 и старше не подходит для этой задачи.
Исмаэль Мигель
8

Ява 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, что происходит только по воскресеньям.
Кевин Круйссен
источник
1
v->{int i=1/new java.util.Date().getDay();}(43 байта).
Оливье Грегуар
@ 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 байта благодаря Роду .

Мистер Xcoder
источник
1
@ Род Почему нет "Su"in time.ctime()>q(я редактировал с этим)?
г-н Xcoder
Я не могу понять это. Как это работает?
pacholik
@pacholik "Su"in time.ctime()проверяет, является ли текущий день воскресеньем. Если это неверно, >qдеталь вообще не оценивается и все выходит гладко. Но если это так, то вычисляется вторая часть неравенства, и, поскольку qона не определена, будет выброшено a NameError.
г-н Xcoder
1
@pacholik Редактировать: я не думаю, что я не прав. В целях эффективности, если первая часть ложная, то Python даже не удосуживается оценить последнюю часть. Мне придется подождать до воскресенья, чтобы проверить это. ( Думаю ) Демонстрация .
Мистер Xcoder
3
@pacholik Обратите внимание, что Python объединяет логические операторы, так что это эквивалентно ("Su" in time.ctime()) and (time.ctime() > q).
user202729
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не генерируется ошибкой ). ФП прямо сказал, что этого не позволяют. Вы можете исправить это, добавив в код один пробел
Mr. Xcoder
Но вы не можете выводить в STDOUT, если это не воскресенье, и вы делаете вывод в STDOUT.
г-н Xcoder
@ Mr.Xcoder правильно. По воскресеньям ничего не должно выводиться
Джо Кинг
@JoKing Я полностью пропустил это правило, исправленное сейчас
Род
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это последняя запись enum, поэтому вызов 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: Спасибо Ними за -3 байта!
Редактировать 2: -11 байт теперь, когда функции разрешены.


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

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

Попробуйте онлайн!

pure необходимо поднять получившийся WeekDay обратно в монаду IO. Тем не менее, 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.

Laikoni
источник
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, где 0=Sat,1=Sun,...,6=Fri.
Теперь мы можем явно выдать ошибку, если результат верен.

Emigna
источник
11
05AB1E проигрывает Java? Все, что я знаю, это ложь
Камил Дракари
5

JavaScript, 23 байта

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

Полная программа.

Переменная kне должна быть определена.

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

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

JavaScript, 19 байт по апсиллерам

Date().match`Su`&&k
l4m2
источник
1) Вы забыли включить _=>; без этого это фрагмент, который не разрешен по умолчанию. 2) Выводится falseчерез день, когда ничего не выводится.
Лохматый
6
1) Это полная программа, которая разрешена OP. 2) Если вы запустите его как программу, выход не
получится
3
/Su/.test(Date())&&kдля 20 байтов.
Рик Хичкок
1
new Dateверсия 25 байт(new Date/864e5%7|0)-3||p
l4m2
3
Решение от @RickHitchcock может быть сокращено путем выполнения тегов-шаблонов matchвместо этого:Date().match`Su`&&k
apsillers
5

VBA / VBScript, 22 20 байтов

Сохранено 2 байта благодаря Тейлор Скотт.

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

Это должно быть запущено в Immediate Window. 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.

Biketire
источник
4

Perl 5 , 13 байт

1/(gmtime)[6]

Попробуйте онлайн!

Ported @ biketire's answerj

удалил 3 байта с напоминанием @ мика

Xcali
источник
1
gmtimeвместо того, localtimeчтобы также будет соответствовать правилам, и на 3 байта короче
Мик
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.

Попробуйте онлайн!

manatwork
источник
3

VBA 18 байт

Это зависит от встроенной функции, date()возвращающей номер дня, который остается 1, если он разделен на 7, поэтому может зависеть от ОС и / или ЦП.

a=1/(date mod 7-1)

Он запускается в непосредственном окне проекта VBA.

JohnRC
источник
2
Добро пожаловать в PPCG! В целом, приветствуются объяснение и ссылка на онлайн-компилятор / интерпретатор.
FantaC
@tfbninja - хорошо, обновление
JohnRC
и, если необходимо, инструкции по использованию, например, вызов функции или переменная
FantaC
Хороший гольф, как раз собирался опубликовать это сам, увидев другой ответ!
Гридо
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 байт для возврата каретки).

Bromind
источник
1
Добро пожаловать в PPCG!
Лайкони
1
Можно ли заставить этот код работать на Попробуйте онлайн ?
Лайкони
Ммм ... команда компиляции ocamlopt unix.cmxa <файл>, я не знаю, как задать опцию компиляции в tio. Я буду исследовать этот вечер
Bromind
Tio использует (аналогичный) интерпретатор REPL, поэтому вам следует использовать 2-ю возможность. Тем не менее, он, похоже, не имеет библиотеки Unix (или не разрешает доступ к ней по любой причине)
Bromind
2

SAS, 36 байт

%put %eval(1/(1-%index(&sysday,Su)))
J_Lard
источник
2

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

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

Требуются команды даты и времени, которые старше 84 лет.

Timtech
источник
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 возвращает текущую дату. мод делает модуль по текущей дате, который возвращает int. Если дата - воскресенье, .zd mod 7 возвращает 1. Если 1 = 1, (в воскресенье), и ошибка возникает с помощью оператора 'Для краткости ошибка - это просто символ e.

ТКГ
источник
3
Добро пожаловать в PPCG!
Мартин Эндер
2

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

Попробуйте онлайн!

Сохранено 1 байт благодаря Shaggy

Сохранено 5 байт благодаря Emigna

Сохранено 1 байт благодаря Кевину Круйссену

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

К счастью, воскресенье имеет индекс 0 в перечислении, иначе это должно было быть (System.DayOfWeek)7

LiefdeWen
источник
1
54 байта ?
Лохматый
3
Вы получаете using Systemбесплатно в C #? Если это так, я думаю, вы могли бы сделать ()=>{var k=1/(int)DateTime.Now.DayOfWeek;}для 42 . В противном случае 49 с явнымSystem.
Emigna
3
@ Emigna победил меня; ()=>{var k=1/(int)System.DateTime.Now.DayOfWeek;}короче И вы можете сохранить еще один байт, используя пустой неиспользуемый параметр вместо какого-либо параметра (т.е. v->{...}вместо ()->{...})
Кевин Круйссен
1
40 байт: ()=>1/(int)System.DateTime.Now.DayOfWeek. Попробуй это здесь .
Ayb4btu
2

Groovy , 16 байт

1/new Date().day

Попробуйте онлайн!

RandomOfAmbr
источник
Добро пожаловать в PPCG!
Мартин Эндер
Благодарность! Также спасибо за редактирование! Я не был уверен, какую онлайн площадку выбрать. Теперь я знаю. :)
RandomOfAmbr
2

C  68  55 байтов

Спасибо @Ken YN за сохранение 13 байтов!

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

Попробуйте онлайн!

Steadybox
источник
Отбросьте промежуточное значение, 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выдает ошибку, если для каждого аргумента not allare TRUE, и выдает ошибку с сообщением, указывающим на первый элемент, которого нет TRUE, поэтому ошибкаError: "Sun" is not TRUE

Giuseppe
источник
Получил до 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
manatwork
источник
1

Фанки , 21 байт

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

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

Попробуйте онлайн!

Ataco
источник