вычеркнуто 44 все еще регулярно 44; (

18

Вступление

24 марта 2015 года @isaacg добавил свой ответ Pyth с 44 ​​до 42 байтов. Поскольку вычеркнутая 44 ( 44 ) очень похожа на обычную 44, @Optimizer сделал следующий комментарий:

вычеркнул 44 все равно нормально 44 :(

После этого, 21 октября 2015 года, @ Doorknob ♦ обработал свой ответ Ruby с 44 ​​до 40 (и более поздних 38) байтов и добавил следующую часть в свой ответ со ссылкой на этот оригинальный комментарий @Optimizer :

вычеркнуто 44 все еще регулярно 44; (

Это было начало мема цепочки ответов , где каждый зачеркнутый 44 (а в некоторых случаях 4 или 444) был связан с предыдущим.

Затем, 8 апреля 2017 года (я не уверен, что это был первый ответ, но это самый ранний ответ, который я смог найти), @JonathanAllan проиграл свой ответ на Python с 44 ​​по 39. Однако он использовал <s>&nbsp;44&nbsp;</s>44 выглядеть следующим образом:  44  , и добавил следующее к своему ответу:

Вычеркнуто 44 & NBSP; больше не 44 :)

И это было в основном (начало) конца мема.

Вызов

Что касается этой задачи: учитывая список натуральных чисел и дату, выведите список через запятую, разделенный пробелом, где каждое число, кроме последнего, находится между <s>...</s> тегами.

Кроме того, если любое из перечеркнутых чисел находится в последовательности [4, 44, 444, 4444, ...]( A00278 на oeis.org ):

  • Если дата до 8 апреля 2017 года: также выведите точный текст crossed out N is still regular N ;(( все строчные и с точкой с запятой) (N ) во второй строке это перечеркнутый номер из последовательности).
  • Если дата 8 апреля 2017 года или позже: зачеркнутый номер Nиз последовательности должен иметь начальные и конечные &nbsp;знаки. Не нужно никаких дополнительных строк вывода.

Примеры:

Вход: list = [50, 48, 44, 41], date = January 1st, 2017
выход:

<s>50</s>, <s>48</s>, <s>44</s>, 41
crossed out 44 is still regular 44 ;(

Вход: list = [500, 475, 444, 301, 248], date = June 2nd, 2018
выход:

<s>500</s>, <s>475</s>, <s>&nbsp;444&nbsp;</s>, <s>301</s>, 248

Правила соревнований:

  • Можно предположить, что входной список представляет собой отсортированный список от наибольшего к наименьшему, содержащий только положительные целые числа. На самом деле количество байт также может увеличиваться из-за исправлений ошибок, но ради этого вызова мы притворяемся, что оно только снижается.
  • Можно предположить, что [4, 44, 444, 4444, ...]во входном списке присутствует только одно число из последовательности (если есть).
  • Выходной формат либо печатается в STDOUT, либо возвращается в виде строки (или символьного массива / списка / 2D-массива, если это предпочтительно). Завершающий перевод строки, конечно, не является обязательным.
  • Формат вывода строгий. <s>...</s>является обязательным; &nbsp;...&nbsp;является обязательным; ", "(запятая и пробел) является обязательным; и \ncrossed out ... is still regular ... ;(именно обязательно (на отдельной строке).
  • Вы можете принять входную дату как объекты даты; метки времени; свободные целые числа для года, месяца и дня; одно число в формате yyyyMMdd; целые дни с 31 декабря 1899 года ( 428328 апреля 2017 года); или любой другой разумный формат ввода. Дата if-Statement не является основной частью этой задачи.
  • Входной целочисленный список также может быть списком строк, если хотите.
  • Вам не нужно добавлять <sup>...</sup>теги кcrossed out ... is still regular ... ;( строку, как это обычно делается с реальными ответами на мемы.
  • Вы можете предположить, что входной список никогда не будет содержать счетчиков байтов за пределами [1, 50000]диапазона (поэтому вам придется {4, 44, 444, 4444, 44444}беспокоиться только об этих пяти ).

Основные правила:

  • Это , поэтому выигрывает самый короткий ответ в байтах.
    Не позволяйте языкам кода-гольфа отговаривать вас от публикации ответов на языках, не относящихся к кодексу. Попробуйте придумать как можно более короткий ответ для «любого» языка программирования.
  • К вашему ответу применяются стандартные правила , поэтому вы можете использовать STDIN / STDOUT, функции / метод с правильными параметрами и типом возврата, полные программы. Ваш звонок.
  • По умолчанию лазейки запрещены.
  • Если возможно, добавьте ссылку с тестом для вашего кода.
  • Кроме того, добавление объяснения для вашего ответа настоятельно рекомендуется.

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

Input: [50, 48, 44, 41] and January 1st, 2017 
Output:
<s>50</s>, <s>48</s>, <s>44</s>, 41
crossed out 44 is still regular 44 ;(

Input: [500, 475, 444, 301, 248] and  June 2nd, 2018
Output:
<s>500</s>, <s>475</s>, <s>&nbsp;444&nbsp;</s>, <s>301</s>, 248

Input: [8, 6, 4] and December 5th, 2017
Output:
<s>8</s>, <s>6</s>, 4

Input: [8, 6, 4, 3, 2] and September 15th, 2015
Output:
<s>8</s>, <s>6</s>, <s>4</s>, <s>3</s>, 2
crossed out 4 is still regular 4 ;(

Input: [119, 99, 84, 82, 74, 60, 51, 44, 36, 34] and February 29th, 2016
Output:
<s>119</s>, <s>99</s>, <s>84</s>, <s>82</s>, <s>74</s>, <s>60</s>, <s>51</s>, <s>44</s>, <s>36</s>, 34
crossed out 44 is still regular 44 ;(

Input: [404, 123, 44] and March 4th, 2016
Output:
<s>404</s>, <s>123</s>, 44

Input: [4, 3] and April 8th, 2017
Output:
<s>&nbsp;4&nbsp;</s>, 3

Input: [44] and October 22nd, 2017
Output:
44

Input: [50000, 44444, 1500] and August 1st, 2018
Output:
<s>50000</s>, <s>&nbsp;44444&nbsp;</s>, 1500

Input: 50, 38, 23 and September 8th, 2001
Output:
<s>50</s>, <s>38</s>, 23
Кевин Круйссен
источник
В вашем последнем тесте отсутствует дата?
Нил
1
@ Нил Ах, упс .. Исправлено. Дата на самом деле не имеет значения для этого, но добавил один независимо. Спасибо, что заметили.
Кевин Круйссен
1
Я могу подтвердить, что я не заметил, чтобы кто-то использовал неразрывный пробел для этой конкретной цели, и именно поэтому я написал текст «больше не».
Джонатан Аллан
(Я также могу подтвердить, что я использовал его до того, как использовал его с 44 - я полагаю, что именно тогда я их впервые использовал)
Джонатан Аллан
Поскольку мы можем принимать данные как дни с тех пор 1889-12-31, можем ли мы также принимать дни с тех пор 2017-04-08?
TFeld

Ответы:

6

Желе ,  444  , 94 , 93 байта

Ñȧ$“&nbsp;”,¤j$€io.ɗ¦@Ṗj@€“<s>“</s>”oj⁾, 
⁴>⁽A€
“¢⁻$gẆẠ⁷Ṭ]ḳṁṛż?=çỊI×V»Ỵjṭ⁷ẋǬȧẠƲ
ṖḟÐḟ”4Ḣµñ³,Ç

Полная программа. Входными данными являются список строк и дата, взятые как целые дни с января первого 1970 года (17264 апреля восьмого 2017 года)

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

Как?

Ñȧ$“&nbsp;”,¤j$€io.ɗ¦@Ṗj@€“<s>“</s>”oj⁾,  - Link 1: L = list of characters ("4...4") OR integer (0),
                                          -         R = list of lists of characters (the strings provided to the program)
  $                                       - last 2 links as a monad:
Ñ                                         -   call next Link (2) as a monad
                                          -   ...gets: is date input to program greater than 2017-04-07?
 ȧ                                        -   AND (if so gets the value of L, else 0), say X
                    ¦@                    - sparse application (with swa@pped @rguments)...
                      Ṗ                   - ...with right argument = popped R (without it's rightmost entry)
                   ɗ                      - ...to: last 3 links as a dyad
                i                         -          first index of X in popped R (0 if no found, so 0->0)
                  .                       -          literal 0.5
                 o                        -          OR (change any 0 to 0.5)
                                          -        ...i.e. index of "4...4" if L was one or 0.5, an invalid index
              $€                          - ...do: for €ach... last 2 links as a monad:
            ¤                             -          nilad followed by link(s) as a nilad:
   “&nbsp;”                               -            literal list of characters = "&nbsp;"
           ,                              -            pair (with itself) = ["&nbsp;", "&nbsp;"]
             j                            -            join (with the item) e.g.: "&nbsp;444&nbsp;" or ["&nbsp;", 0, "&nbsp;"]
                          “<s>“</s>”      - literal list of lists of characters = ["<s>", "</s>"]
                       j@€                - for €ach... join (with swa@pped @rguments)
                                    o     - OR with R (vectorises, so adds the popped entry back onto the right-side)
                                      ⁾,  - literal list of characters = ", "
                                     j    - join

⁴>⁽A€ - Link 2: greater than 2017-04-07?
⁴     - program's 4th argument (2nd input)
  ⁽A€ - literal 17263 (days(2017-04-07 - 1970-01-01))
 >    - greater than?

“¢⁻$gẆẠ⁷Ṭ]ḳṁṛż?=çỊI×V»Ỵjṭ⁷ẋǬȧẠƲ - Link 3: L = list of characters ("4...4") OR integer (0)
“¢⁻$gẆẠ⁷Ṭ]ḳṁṛż?=çỊI×V»           - compressed list of characters = "crossed out \n is still regular \n ;("
                     Ỵ           - split at newlines = ["crossed out ", " is still regular ", " ;("]
                      j          - join with L
                        ⁷        - literal newline character
                       ṭ         - tack (add to the front)
                              Ʋ  - last 4 links as a monad:
                          Ç      -   call last Link (2) as a monad
                           ¬     -   NOT
                             Ạ   -   All (1 if L is "4...4", 0 if L is 0)
                            ȧ    -   AND
                         ẋ       - repeat (i.e. get the list of characters to print or an empty list)

ṖḟÐḟ”4Ḣµñ³,Ç - Main Link: list of strings, integer (days since 1970-01-01)
Ṗ            - pop (list of strings without it's rightmost entry)
  Ðḟ         - filter discard if:
 ḟ           -   filter discard any which are in...
    ”4       -   ...literal character '4'
      Ḣ      - head (yields 0 if list is now empty)
       µ     - new monadic chain, call that X
         ³   - program's 3rd argument (1st input) - call that Y)
        ñ    - call next Link (1) as a dyad (i.e. f1(X, Y))
           Ç - call last Link (3) as a monad (ie. f3(X))
          ,  - pair
             - implicit (smashing) print
Джонатан Аллан
источник
1
Вы забыли удалить входные данные из другой задачи в вашем TIO. ;) Хороший ответ независимо. Не могли бы вы добавить объяснение? И rofl на этом 444-байтовом счетчике. Я не верю, что вы начали с этого, если только вы не добавили комментарии. ; p
Кевин Круйссен
Оппс, спасибо. Я добавлю объяснение в ближайшее время.
Джонатан Аллан
1
444 версия без комментариев, цифры, а не сжатые строки
Джонатан Аллан
... ах, в версии 444 есть ошибка - в ней используются дни с 1969-12-31, а не с 1970-01-01, как в версии для гольфа> _ <(наивное исправление все еще 444)
Джонатан Аллан
4

Python 2 , 208 204  203 201 197 байтов

Принимает ввод в виде списка строк и целого числа yyyymmDD

def f(l,d):
 A=a=d>20170407;r=[]
 for n in l[:-1]:x=set(n)=={'4'};S='&nbsp;'*x*a;r+=['<s>'+S+n+S+'</s>'];A=x*n or A
 print', '.join(r+l[-1:])+'\ncrossed out %s is still regular %s ;('%(A,A)*(a*A<A)

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

TFeld
источник
3

Excel VBA, 217 байт

Функция непосредственного окна VBE, которая берет входной массив из диапазона [A:A]и дату из диапазона [B1]и выводит на консоль.

c=[Count(A:A)]:d=[B1]>42832:For i=1To c-1:n=Cells(i,1):l=InStr(44444,n):s=IIf(d*l,"&nbsp;",""):v=IIf((d=0)*l,n,v):?"<s>"s;""&n;s"</s>, ";:Next:?""&Cells(i,1):?IIf(v,"crossed out "&v &" is still regular "&v &" ;(","");

Ungolfed и комментируется

c=[Count(A:A)]                  ''  Get numer of elements
d=[B1]>42832                    ''  Check if date is after 7 Apr 2017,
For i=1To c-1                   ''  Iterate over index
n=Cells(i,1)                    ''  Get array val at index
l=InStr(44444,n)                ''  Check if val is all 4s
s=IIf(d*l,"&nbsp;","")          ''  If after 7 Aug 2017, and All 4s, let `s` be "&nbsp;"
v=IIf((d=0)*l,n,v)              ''  If all 4s, and not after date, let v hold n, else hold v
?"<s>"s;""&n;s"</s>, ";         ''  Print striked vales, with "&nbsp;", if applicable
Next                            ''  Loop
?""&Cells(i,1)                  ''  Print last value in array
                                ''  (below) Print meme, if needed
?IIf(v,"crossed out "&v &" is still regular "&v &" ;(","");

-2 байта для изменения формата даты на YYYYMMDD

-1 байт для сравнения с 42832(значение int для 07 Apr 2017), спасибо @Neil

-2 байта для удаления 1,из InStrутверждения, спасибо @ SeaDoggie01

Тейлор Скотт
источник
Я думаю, For i=1To~-cа For i=1To c-1не возможно в Excel VBA? Если я правильно помню, Bitwise not is Notвместо ~или возможны оба варианта? (Обратите внимание, что я почти ничего не знаю об Excel VBA, поэтому я, вероятно, говорю здесь что-то глупое.; P)
Кевин Круйссен,
@KevinCruijssen Да, побитовое не есть Not , так что нет ~:(
Тейлор Скотт
1
Я думаю, что вы можете сохранить больше байтов, изменив формат даты обратно на дату и сравнив с 42832(целочисленное значение 2017-04-07).
Нил
Я думаю, что вы можете сохранить 2 байта, удалив "1" из instr (это необязательно)
seadoggie01
2

Сетчатка 0.8.2 , 130 байт

$
;42833
O`;.{5}
\b(4+),(?=.*;42833;)
&$1&,
&
&nbsp;
.{12}$

\b(4+),.*
$&¶crossed out $1 is still regular $1 ;(
(.+?),
<s>$1</s>, 

Попробуйте онлайн! Ссылка включает в себя тестовые случаи. Использует отметки даты Excel (дни с 1899-12-31, но в том числе 1900-02-49). 141 байт для версии, которая принимает даты ISO:

$
;2017-04-08
O`;.{10}
\b(4+),(?=.*;2017-04-08;)
&$1&,
&
&nbsp;
.{22}$

\b(4+),.*
$&¶crossed out $1 is still regular $1 ;(
(.+?),
<s>$1</s>, 

Попробуйте онлайн! Ссылка включает в себя тестовые случаи. Объяснение:

$
;2017-04-08

Добавьте дату отсечения ко входу.

O`;.{10}

Сортировать даты. Если указанная дата наступает в день или после даты закрытия, то первой датой будет дата окончания.

\b(4+),(?=.*;2017-04-08;)
&$1&,
&
&nbsp;

В этом случае, обернуть 4+в &nbsp;(используя два этапа , как это экономит байты).

.{22}$

Удалить даты, как они сделали свою работу.

\b(4+),.*
$&¶crossed out $1 is still regular $1 ;(

Если есть свободное пространство 4+, добавьте мем.

(.+?),
<s>$1</s>, 

Вычеркните все устаревшие значения байтов.

Нил
источник
Вы можете сохранить 5 байтов , используя формат даты без -.
Кевин Круйссен
@KevinCruijssen Я мог бы сэкономить еще больше байтов, запросив его в качестве даты Excel (дни с 1899-12-31). Как далеко я могу пойти с этим?
Нил
Хм .. Знаешь что, это тоже хорошо для меня. Как April 8th, 2017делается if-заявление на дату, мне все равно. Это не основная часть этой проблемы.
Кевин Круйссен,
Это будет 428328 апреля 2017 года?
Кевин Круйссен,
@KevinCruijssen Мой Excel говорит, что это седьмое.
Нил
1

Рубин, 208 184 180 байт

TIO-тест

Спасибо за @KevinCruijssen за сохранение 2 байта!

->n,d{*h,t=n;i=20170408>d;f=?\n;h.map{|u|o=u.digits|[]==[4];f=o&&i ?f+"crossed out #{u} is still regular #{u} ;(":f;o&&!i ?"<s>&nbsp;#{u}&nbsp;</s>":"<s>#{u}</s>"}*", "+", #{t}"+f}

Это лямбда-функция, которая принимает список чисел и целое число в качестве даты в формате YYYYmmdd.

Петр Ленкефи
источник
Можно ли добавить TIO-ссылку с тестовым кодом? А переключение форматов таким образом, что это целочисленный ввод, действительно сэкономит несколько байтов. :)
Кевин Круйссен
@KevinCruijssen Добавлена ​​ссылка;)
Питер Ленкефи
Благодарность! +1 от меня. Вы можете сохранить 2 байта, удалив пробелы после ?. Кроме того, для вашего TIO вы можете разделить действительный код отправки и тестовый код с помощью верхнего / нижнего колонтитула, как это . :)
Кевин Круйссен
1

JavaScript, 194 байта

(a,d,l=a.pop(),n=a.find(x=>/^4+$/.exec(x)),s=a.map(n=>`<s>${n}</s>, `).join``+l)=>d<1491609600?n?s+`
crossed out ${n} is still regular ${n} ;(`:s:s.replace(/>(4+)</g,(_,m)=>`>&nbsp;${m}&nbsp;<`)

darrylyeo
источник
1

Haskell , 227 байт

i[]=1>0;i('4':s)=i s;i(_:_)=0>1
f l d=m l++c where a=head$filter i l;t d|d<42832=("","\ncrossed out "++a++" is still regular "++a++" ;(")|1>0=("&nbsp;","");(b,c)=t d;w n|i n=b++n++b|1>0=n;m[n]=n;m(x:s)="<s>"++w x++"</s>, "++m s

Попробуйте онлайн! Запустите fсо списком lи датой d. 42832 - это дата изменения.

Евгений Новиков
источник
Можно ли добавить TIO-ссылку с тестовым кодом?
Кевин Круйссен,
@KevinCruijssen в России запрещен
Евгений Новиков
О, не знал этого. Ну, я не очень хорошо знаю Haskell, иначе я бы сам немного его проверил. Но сам код кажется логичным, поэтому, тем не менее, +1 от меня.
Кевин Круйссен,
@KevinCruijssen Вы можете скопировать код в TIO, сделать ссылку и добавить ее к записи
Евгений Новиков
@KevinCruijssen TIO забанен по ошибке, но мне лень использовать прокси / связываться с ISP по этому поводу
Евгений Новиков
1

JavaScript (Node.js) , 173 байта

a=>d=>a.map(x=>--i<1?x:`<s>${(b=/^4+$/.exec(x)?(c=x,d)<14915808e5?n=[]:"&nbsp;":"")+x+b}</s>`,n="",c=0,i=a.length).join`, `+(n&&`
crossed out ${c} is still regular ${c} ;(`)

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

Использование синтаксиса карри f(array)(js_timestamp)

Сиеру Асакото
источник