Codegolf - Помогите Мне Правильно Определить День Недели

  • Автор темы Promyshlennik
  • Обновлено
  • 22, Oct 2024
  • #1

Иногда я думаю, что это один день недели (например, пятница), хотя на самом деле это начало недели (например, вторник).

Ваша задача — отобразить количество дней, на которое мои оценки отклоняются.

Испытание

Учитывая день недели, который я думаю, и день недели, который на самом деле есть, выведите/верните количество дней между ними.

Тестовые случаи

 Sunday 

Правила

  • Даты должны восприниматься как фактическое название даты ( Saturday , Friday , Thursday , Wednesday , Tuesday , Monday и Incorrect date, Actual Date -> Days between Monday, Monday -> 0 Friday, Tuesday -> 3 Saturday, Sunday -> 6 Tuesday, Friday -> 4 Thursday, Wednesday -> 1 Monday, Friday -> 3 ). This is non-negotiable.
  • Имена дат должны восприниматься как строки или эквиваленты на вашем языке (ADT не разрешены, если они не сохраняют свои значения как разрешенные строки).
  • Ввод и вывод могут быть предоставлены/приняты в любом разумном формате.
  • Полная программа или функция – не важно.

И, наконец, это , поэтому побеждает ответ на каждом языке с наименьшим количеством байтов.

#код-гольф #код-гольф #строка #дата

Promyshlennik


Рег
15 Oct, 2008

Тем
61

Постов
171

Баллов
506
  • 26, Oct 2024
  • #2

JavaScript (ES6), 48 байт

Ожидает

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 SuMoTuWeThFrSa 
.

w

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

Как?

Нам нужна хэш-функция \$g\$, которая превращает строку дня в индекс. Результаты этой функции на самом деле довольно гибкие:

  • Они могут располагаться в порядке возрастания или убывания: find or (w:find(a)-w:find(b))/2%7 . (Нам придется вычислить либо \$g(a)-g(b)\$, либо \$g(b)-g(a)\$ соответственно.)
  • День №0 может быть любым днем ​​недели. Например, *l or l также действительны.
  • Результаты могут быть больше \$6\$, если они верны по модулю \$7\$. Поскольку знак по модулю является знаком делимого в JS, нам придется сделать что-то вроде read anyway, where \$k\$ is a large enough multiple of \$7\$.

Перебором была найдена следующая функция:

,"l"

что дает:

lua ||answer||

Баш + Утилиты GNU, 26

a,_,b=io.read(2,"l",2)

Входные данные считываются из строк 1 и 2 STDIN.

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

Объяснение

ГНУ a,_,b=io.read(2,"l",2)w="SuMoTuWeThFrSa"print((w:find(a)-w:find(b))/2%7) reads a в основном свободный формат, удобочитаемая строка даты. С I﹪η⁷ it reads multiple date strings from a file and if the file is ≦⁻﹪⍘Sγ⁸⁴⁹⁰⁷η , STDIN читается. свободный формат достаточно свободен, чтобы анализироваться был один день недели. Проанализированная дата затем выводится в соответствии со строкой формата. F² simply outputs the {1..7} numerical index of the day of the week, where 1 is "Monday".

Этот вывод подается на ≔⁰η expression:

≔⁰ηF²≦⁻﹪⍘Sγ⁸⁴⁹⁰⁷ηI﹪η⁷ ||answer||

Питон 2, 42 байта

MOD(~+7,7)

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

Если мы сможем сопоставить оба дня недели с их соответствующими значениями ( A1 ), then we can calculate the days in between with \$ (a - b) \bmod 7 \$. To do this, we use the following formula: B1 .

 

Loony1


Рег
18 Jun, 2014

Тем
69

Постов
190

Баллов
555
  • 26, Oct 2024
  • #3

К (нгн/к), 32 26 байт

Решение:

MOD(MATCH(~)-MATCH(~)+7,7)

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

Объяснение:

Нашел немного лучший поиск. Сумма символов ASCII по модулю 15.

MATCH(B1,s,0)

Правки:

  • -6 байт Таблица поиска основана на суммах символов ascii, а не на MATCH(A1,s,0) etc.
 

SaTaNaUa


Рег
18 May, 2018

Тем
69

Постов
187

Баллов
542
  • 26, Oct 2024
  • #4

Фактор, 35 байт

s

Не работает на TIO, поскольку в TIO отсутствует LET(s,TEXT(SEQUENCE(7),"dddd") vocabulary which is perfectly extant on a local copy of Factor 0.98. So have a screenshot of running the quotation in the listener:

Объяснение:

Это цитата (анонимная функция), которая принимает две строки из стека данных в качестве входных данных и оставляет целое число в стеке данных в качестве выходных данных. Предполагая B1 is on the data stack when this quotation is called...

  • A1 Push a quotation for =LET(s,TEXT(SEQUENCE(7),"dddd"),MOD(MATCH(A1,s,0)-MATCH(B1,s,0)+7,7)) чтобы использовать позже.

    Куча: function(x)diff(match(x,weekdays(Sys.Date()+0:6)))%%7

  • £7ÆÐTTX ÅÃb_øX¯3 7Æ // Generate the range [0..6] and map it to ÐTTX // new Date(0, 0, X) ÅÃ // stringified such as "Sun Dec 31 1899", "Mon Jan 01 1900" etc. £ // For every input string, b_ // map to the index of the item that øX¯3 // contains the first three letters of the input. r- u7 // Reduce with subtraction, positive modulo 7. Apply a quotation to two objects. Inside the quotation now...

    Куча: £7ÆÐTTX ÅÃb_øX¯3 r- u7

  • func[a b][g: func[d][index? find system/locale/days d](g a)-(g b)// 7] Push a sequence containing the days of the week.

    Куча: 5 6 0 1 2 3 4

  • function(a,b,`+`=function(d)sum(utf8ToInt(d)*169^(nchar(d):1-1))%%467)(+a-+b)%%7 Take an object and a sequence and return the index of that object in the sequence.

    Куча: M Tu W h F t Su

  • Сейчас function(x)diff(which(t(sapply(w,grepl,x))))%%7 w=scan(,'') M Tu W Th F Sa Su will do the same with the other input.

    Куча: Oḅȷ%⁽€ƈI%7 - Link: list of lists of characters, [incorrect, actual] O - convert to a list of lists of ordinals ȷ - 1000 ḅ - convert from base (1000) to an integer (vectorises) ⁽€ƈ - 4157 % - modulo (4157) (vectorises) I - differences %7 - modulo seven - implicit print (of Jelly representation of that)

  • 6 Subtract.

    Куча: "Friday"

  • 1 Push "Wednesday" в стек.

    Куча: 0

  • "Thursday" Like Oḅȷ%⁽€ƈI%7 , за исключением того, что результат всегда положительный.

    Куча: ⁽Ae,8ḥ)I%7 - Link: list of lists of characters, [incorrect, actual] ) - for each (day in [incorrect, actual]): ⁽Ae - 17352 8 - eight , - pair -> [17352, 8] ḥ - hash (day) using a salt of 17352 and a domain of [1..8] I - differences %7 - mod seven -> [(ḥ(incorrect) - ḥ(actual)) mod 7] - implicit print (of Jelly representation of that)

 

VOLODYBBK


Рег
03 Jul, 2007

Тем
67

Постов
182

Баллов
537
  • 26, Oct 2024
  • #7
Желе "Thursday"

, 16 байт

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

-2 байта благодаря Арно за поиск цепочки по модулю для получения правильных значений

Ранее:Желе

[incorrect, actual]

, 18 байт

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

Не уверен, что это хороший способ сделать это, лол.

-2 байта с использованием целочисленного сжатия (спасибо Lyxal)

 

Tim383


Рег
24 Apr, 2006

Тем
82

Постов
205

Баллов
645
  • 26, Oct 2024
  • #9
Поскольку ответ выше некоторым не по вкусу, вот более «Java многословный» ответ, который принимает в качестве входных данных строки, а не встроенные константы: 7|-&('MoTuWeThFrSaSu'-:@I.@E.~2&{.)

, 35 байт

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

7|

Вызов осуществляется так:

Java (JDK)Java (JDK)

-&

, 113 байт

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

 

Morus_geeksz


Рег
06 Aug, 2010

Тем
51

Постов
208

Баллов
493
  • 26, Oct 2024
  • #11
Ретина 0.8.2 -

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

+

Ссылка включает тестовые примеры. Объяснение: +`-/ to 318...$ Преобразуйте название дня в номер дня. Это работает следующим образом: некоторые буквы в днях заменяются цифрами из

3&u:

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

7|-&((678 A.i.7)i.7|318+`-/@$3&u:)

Ко второму числу прибавьте 7, чтобы оно всегда было больше первого.

["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"] after C: [2184, 5008, 18736, 9824, 1968, 9256, 2472] after 813%: [558, 130, 37, 68, 342, 313, 33] after 60%: [18, 10, 37, 8, 42, 13, 33] after 7%: [4, 3, 2, 1, 0, 6, 5]

Возьмите разницу между числами и уменьшите по модулю 7.

Преобразовать в десятичное число.

[4, 3, 2, 1, 0, 6, 5] ||answer||

Таблица названий дней и их преобразований:05AB1E

C

, 18 17 15 11 байт

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

Попробуйте все тестовые случаи

Принимает ввод в виде списка в порядке [фактическая дата, неверная дата] C813%60%Æ7% command works for non binary strings, I just tried some stuff and it worked

Я не уверен, как именно 05AB1E Sunday Su6d0y 6 Monday 5o6d0y 5 Tuesday Tue4d0y 4 Wednesday 3ed6e4d0y 3 Thursday T2ur4d0y 2 Friday 1rid0y 1 Saturday S0turd0y 0 (mod 7, since we do mod 7 anyway after the subtraction). The modulos were found by brute-force

1 ||answer||

использует хэш для сопоставления дней с, 37 Дж

(1*),\1|1{7}

34 байта

  • , ,7$* Convert chars to unicode numbers
  • 6 Reshape cyclically to length 318. I found this by brute forcing a number such that the next step will return unique numbers for each weekday.
  • 0 Reduce by placing T`aF\hWsMn`d \w+ $* Попробуйте онлайн! T`aF\hWsMn`d \w+ $* , ,7$* (1*),\1|1{7} 1 alternately between the numbers.
  • %-Fmx"SMansFr"@d12Q7 Mod 7
  • % Implicit input: cell array of two strings 23Y2 % Push predefined literal {'Monday', 'Tuesday', 'Wednesday', 'Thursday', ... % 'Friday', 'Saturday', 'Sunday'} &m % Indices of membership. Gives a vector of two numbers d % Consecutive differences. Gives one number 7 % Push 7 \ % Modulus % Implicit display Find index of above two numbers within 23Y2&md7\ и
  • i->a->(java.util.Comparator.comparing((String s)->java.time.DayOfWeek.valueOf(s.toUpperCase())).compare(a,i)+7)%7 Subtract after converting both args.
  • f.apply(MONDAY).applyAsInt(TUESDAY); Mod 7

, которые представляют собой уникальные числа, которым соответствуют дни недели.Дж

i->a->(7+a.ordinal()-i.ordinal())%7

, прямой подход, 35 байт

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

 

Forester22


Рег
05 Mar, 2011

Тем
69

Постов
204

Баллов
569
  • 26, Oct 2024
  • #12
, 10 Желе $x,$y=$args|%{+[dayofweek]$_} ($x-$y+7)%7

байты OP€Ḥị“ØỴ¦’D¤I%7 yields an integer in \$[0,6]\$ wrapped in a list.
Монадическая ссылка, принимающая список из двух списков символов.

При запуске полной программы она принимает список из двух строк и печатает полученное целое число (поскольку представление Jelly списка, содержащего один элемент, является всего лишь представлением этого элемента).

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

Как? OP€%6474%8I%7 to v(s,n)=1+Vecsmall(s)[n]%4; m=[5,x,x,7;3,2,6,1;x,x,x,x;x,x,x,4]; d(n)=m[v(n,6),v(n,1)]; p(a,b)=print((d(a)-d(b))%7) , p f["Saturday", "Sunday"] #=> 6 to require"date" w=(0..6).map{|i|Date.jd(i).strftime"%A"} f=->i,a{(w.index(i)-w.index(a)+7)%7} , ..., ???✏️э???????? ??????⚖️э??♏️э??️♑️↩️э??️э????? ???✏️э???????? ??????⚖️э??✝️⛎??????↩️э??️э????? ???✏️э???????? ??????⚖️э??〰️э??↩️♑️э?????↩️э??️э????? ???✏️э???????? ??????⚖️э??✝️♓️⛎®️э??↩️э??️э????? ???✏️э???????? ??????⚖️э????э®️э??️↩️э??️э????? ???✏️э???????? ??????⚖️э????????️✝️⛎®️↩️э??️э????? ???✏️э???????? ??????⚖️э?????⛎♑️↩️э??️э????? ???✏️э???????? ⚗️✏️э???????? ???⚗️⚖️э??♏️э??️♑️↩️э??️э????? ⚗️✏️э???????? ???⚗️⚖️э??✝️⛎??????↩️э??️э????? ⚗️✏️э???????? ???⚗️⚖️э??〰️э??↩️♑️э?????↩️э??️э????? ⚗️✏️э???????? ???⚗️⚖️э??✝️♓️⛎®️э??↩️э??️э????? ⚗️✏️э???????? ???⚗️⚖️э????э®️э??️↩️э??️э????? ⚗️✏️э???????? ???⚗️⚖️э????????️✝️⛎®️↩️э??️э????? ⚗️✏️э???????? ???⚗️⚖️э?????⛎♑️↩️э??️э????? ⚗️✏️э???????? ???✏️э??➖⚗️ ???✏️э?????????????? ???️э?? to 7, then takes the difference modulo \$7\$.

4

Хэши

mod

Альтернативный 10-байтовый

(Тот же ввод-вывод, что и выше.)

Попробуйте онлайн! rem to -3 7 , 7 to 7 , ..., -3 to - Карты

2 5 ||answer||

, затем берет разницу по модулю \$7\$.Р

bi@

, 78 байт

Попробуйте онлайн! Ну, на самом деле 76 байт 2 as a shorter lookup vector, but I feel the obviousness of the code is worth the extra +2.


потому что мы могли бы использоватьР

index

, 80 байт

Попробуйте онлайн! "Tuesday" { "Sunday" "Monday" "Tuesday" "Wednesday" "Thursday" "Friday" "Saturday" } on the TIO installation of Интерпретирует значения ASCII в каждой строке как цифры по основанию 169, затем вычисляет (неправильно из-за ошибок с плавающей запятой, но некорректность учитывается программой) по модулю 467. Это преобразует дни недели в.

Р Как-то моя собственная установка вычисляет неправильно по-разному, требуя интерпретации по основанию 134 и вычисления по модулю 978 (чтобы исправить некорректность), но обе программы выдают размер 80 байт.

 

Gazan


Рег
17 Jan, 2008

Тем
79

Постов
198

Баллов
633
  • 26, Oct 2024
  • #14

Япт, 22 байта

Использование числового модуля, вероятно, было бы короче, но мне это понравилось больше.

"Tuesday"

Объяснение:

bi@

Попробуйте здесь.

 

Haword


Рег
04 Jul, 2008

Тем
66

Постов
167

Баллов
517
  • 26, Oct 2024
  • #16

Эксель, 69 байт

bi@

Ввод находится в ячейках [ day-names index ] and "Tuesday" "Friday" . Формула применима куда угодно.

calendar.english stores an array of day names so we can reference it using just [ [ day-names index ] bi@ - 7 rem ] .
Mo/Tu/We & 7!-/13 1 0 2 12 7 5?15!+/' / the solution +/' / sum (+/) each (') input string 15! / 15 modulo result ? / lookup this value in left list 13 1 0 2 12 7 5 / precalculated result of summing ASCII weekdays -/ / subtract to get difference 7! / modulo 7 to account for negatives находит названия входных дней в этом массиве.
7!-/13 1 0 2 12 7 5?15!+/' finds the distance from the second day ( hash(s*11)%69%7 ) до первого ( Monday -> 0, Tuesday -> 1, ... ).
lambda a,b:(hash(b*11)%69-hash(a*11)%69)%7 is necessary because Mon→Fri is in the same week but Fri→Mon spans two weeks.

 

Dade_gibson


Рег
21 Jun, 2004

Тем
66

Постов
216

Баллов
616
  • 26, Oct 2024
  • #17

Древесный уголь, 28 21 байт

?? # read the first 2 converted inputted dates - # find the difference 7+ # add 7 7% # find the modulo-7 p # print the result

Попробуйте онлайн! Ссылка на подробную версию кода. Изменить: сэкономлено 7 байт благодаря @DominicvanEssen за счет поиска подходящей базы и большого модуля, который генерирует нисходящие целые числа напрямую, вместо необходимости использования справочной таблицы. Объяснение:

dc

Инициализируйте аккумулятор нулями.

%u

Цикл на протяжении двух дней.

-

Интерпретируйте название дня как число по основанию 95 (это индекс в печатном формате ASCII). Затем число уменьшается по модулю 84907, а затем по модулю 7, что было выбрано для того, чтобы вести отсчет вниз от четверга, чтобы результат был желаемым знаком. Из этого значения вычитается аккумулятор, так что при первом проходе аккумулятор становится первым днем, а при втором проходе — разницей.

-f

Уменьшите разницу по модулю 7, чтобы учесть перенос после конца недели.

 

Redcity


Рег
12 May, 2012

Тем
87

Постов
206

Баллов
671
  • 26, Oct 2024
  • #18

Луа, 72 байта

date

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

Объяснение

date -f- +%u|dc -e??-7+7%p

Возьмите первые 2 байта каждого ввода, отбросив остальную часть первого ввода и игнорируя остальную часть второго. При этом остаются оставшиеся входные данные, поэтому запустите это дважды без обновления среды (например, в day | base34 -> dec | mod 72 | mod 23 | mod 7 -------------+---------------+--------+--------+------- "Monday" | 30369728 | 56 | 10 | 3 "Tuesday" | 1358300452 | 4 | 4 | 4 "Wednesday" | 1702996445748 | 12 | 12 | 5 "Thursday" | 45612914380 | 52 | 6 | 6 "Friday" | 21127508 | 44 | 21 | 0 "Saturday" | 43748842416 | 24 | 1 | 1 "Sunday" | 38623568 | 32 | 9 | 2 console) will not work. This could be resolved by adding g = s => parseInt(s, 34) % 72 % 23 к (g(a) - g(b) + k) % 7 (+4 bytes).

Чтобы сделать это совместимым со старыми версиями Lua, измените 4,3,2,1,0,6,5 to 3,4,5,6,0,1,2 (+1 байт).

6,5,4,3,2,1,0

0,1,2,3,4,5,6 returns the index at which the input was found. a=>b=>((g=s=>parseInt(s,34)%72%23)(a)-g(b)+21)%7 существование (day1)(day2) , representing the smallest possible unique letter representation of each day. Find the difference in indexes, divide by two (string length of 14), and modulo by 7.

 

Yzva


Рег
11 Sep, 2006

Тем
66

Постов
202

Баллов
552
Тем
403,760
Комментарии
400,028
Опыт
2,418,908

Интересно