Строка — Пришествие Кодекса 2020, День 2, Часть 1

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

Сегодня мы с моей девушкой начали с Пришествие кода в этом году чтобы улучшить наш Python. Пока что мы прошли только День 1 и первую часть Дня 2. Последний мне показался очень забавным, поэтому, чтобы немного оживить его, и с советом Эрику Уэстлу, вот моя попытка превратив это в соревнование по Code Golf.

Задача

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

 
 wc -m 
in each char по крайней мере puts 23 and at most Output: 23 Input: 3-8 j: ksjjtvnjbjppjjjl 6-10 s: sszlkrsssss 1-4 z: znzfpz 7-11 m: dfkcbxmxmnmmtvmtdn 6-9 h: hlhhkhhhq 8-9 p: ppppppppvp 6-9 c: cccgccccmcch 5-8 g: bgkggjgtvggn 3-4 x: xxhk 10-12 h: hhhhhhhhhlhhhhdnh 5-6 j: zjjsjn 9-14 s: ksclwttsmpjtds 6-7 l: gtdcblql 1-4 d: dkndjkcd 1-6 k: kkkkkckmc 10-12 x: xxxxxxxxxrxl 2-5 v: fxdjtv 3-5 q: pjmkqdmqnzqppr 5-8 t: xtgtgtcht 6-11 j: nftjzjmfljqjrc 6-9 g: rskgggmgmwjggggvgb 11-12 v: vkvdmvdvvvdv 15-16 z: zzzzzzzzzzzzzzgxz 13-17 v: vvvvvvvvvvvvvvvvnv 9-14 j: clrfkrwhjtvzvqqj 1-12 l: lljljznslllffhblz 4-7 c: cccgcxclc 6-11 z: tbxqrzzbwbr 18-19 m: jmbmmqmshmczlphfgmf 1-5 s: ssvsq 4-5 k: kkkkw 4-7 f: fcqffxff 3-8 f: fffzthzf 9-12 v: vvvvvvvvvvvmvv 14-17 f: ftflcfffjtjrvfkffmvf 4-7 n: pnmnxnqqjp 6-7 r: rrrkrmr 4-13 k: drckdzxrsmzrkqckn 5-14 t: dttttttttttttt 13-14 v: vvvvfvvvvvvvvvv 7-12 j: jrljwnctjqjjxj 6-7 v: wchfzvm 1-8 d: dddddddzd 10-12 g: gvvzrglgrgggggggggg . С приведенными выше данными будет выведена действительная запись. Output: 3 Input: 1-5 c: abcdefg 5-12 j: abcdefg 1-5 z: zzzzzzzz 3-3 h: hahaha 4-20 e: egejeqwee ¹.

Действительные записи должны работать не только с двумя приведенными ниже примерами наборов данных, но и с любым набором данных, созданным Веб-сайт Advent of Code, день 2, часть 1 головоломка (так что идите уже туда, но просто приводить примеры тоже подойдет). Другие форматы ввода не допускаются. В частности, запись должна сама обрабатывать переводы строк.

Я опубликовал ответ на свою версию Ruby вместе с этим вопросом в надежде, что это поможет.

Вход

  • Многострочная строка, в которой каждая строка/элемент содержит число. ??? , a number ??? , персонаж ??? , and a string password ² (т.е., char ).
  • max и min являются целыми положительными числами, а char is guaranteed to be greater than or equal to password .
  • Насколько я могу судить, min s are all ASCII-alphabetical, as is the max .

Выход

  • Число, показывающее, сколько строк имело хотя бы max and at most min случаи min-max char: password in password .

Подсчет очков

  • Победителем станет самая короткая запись по символам³, нет байт (чтобы убедиться, что имена переменных, такие как char , max and min don't put contestants in the mood of the season at a disadvantage).

(Короче) Тестовый пример

23

(Длинный) Пример

max

¹: Но, скажем min (that is, without doing the actual work) is no valid entry.
²: В «Advent of Code» загадка заключается в том, что вы помогаете компании по прокату саней решить проблемы с компьютером. По какой-то причине их база паролей перепуталась, и вы пытаетесь это исправить, что требует от вас выяснить, какие пароли соответствуют политике паролей, которая состоит исключительно из определенного символа ( string ) to be present at least and at most a certain number of times.
³: Как определено через char .

#code-golf #строка #анализ

Parelnall


Рег
05 Jan, 2014

Тем
90

Постов
205

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

Руби, 56 символов

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 m¸£OvXÎr-'õ)øXÌèXÅÎÎ
 

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

Распаковывает до:

-x

Подсчет очков персонажей позволяет совершать подобные махинации!

Это также отличная демонстрация глобальных переменных регулярных выражений Ruby. Учитывая строку:

@0:S=INSTR(I$[0]," ")C=I$[0][S+1]N=S+3REPEAT N=INSTR(N+1,I$[0],C)INC M,N>0UNTIL N<0H=INSTR(I$[0],"-")U=VAL(LEFT$(I$[0],H))V=VAL(MID$(I$[0],H+1,S-H-1))INC O,M>=U&&M<=V:IF LEN(I$)GOTO@0 ?O

Наше регулярное выражение соответствует здесь:

@0:S=INSTR(I$[0]," ")C=I$[0][S+1]N=S+3 REPEAT N=INSTR(N+1,I$[0],C)INC M,N>0UNTIL N<0 H=INSTR(I$[0],"-") U=VAL(LEFT$(I$[0],H)) V=VAL(MID$(I$[0],H+1,S-H-1)) INC O,M>=U&&M<=V:IF LEN(I$)GOTO@0'newline char here ?O

Затем f=s=>eval(s.replace(/(.+)-(.+)(.): (.+)/g,(m,l,r,c,p)=>"+"+eval(`p.replace(/${c}/g,x=>--l*--r),l>=0&r>=0`))) console.log(f(`1-5 c: abcdefg 5-12 j: abcdefg 1-5 z: zzzzzzzz 3-3 h: hahaha 4-20 e: egejeqwee`)) console.log(f(`3-8 j: ksjjtvnjbjppjjjl 6-10 s: sszlkrsssss 1-4 z: znzfpz 7-11 m: dfkcbxmxmnmmtvmtdn 6-9 h: hlhhkhhhq 8-9 p: ppppppppvp 6-9 c: cccgccccmcch 5-8 g: bgkggjgtvggn 3-4 x: xxhk 10-12 h: hhhhhhhhhlhhhhdnh 5-6 j: zjjsjn 9-14 s: ksclwttsmpjtds 6-7 l: gtdcblql 1-4 d: dkndjkcd 1-6 k: kkkkkckmc 10-12 x: xxxxxxxxxrxl 2-5 v: fxdjtv 3-5 q: pjmkqdmqnzqppr 5-8 t: xtgtgtcht 6-11 j: nftjzjmfljqjrc 6-9 g: rskgggmgmwjggggvgb 11-12 v: vkvdmvdvvvdv 15-16 z: zzzzzzzzzzzzzzgxz 13-17 v: vvvvvvvvvvvvvvvvnv 9-14 j: clrfkrwhjtvzvqqj 1-12 l: lljljznslllffhblz 4-7 c: cccgcxclc 6-11 z: tbxqrzzbwbr 18-19 m: jmbmmqmshmczlphfgmf 1-5 s: ssvsq 4-5 k: kkkkw 4-7 f: fcqffxff 3-8 f: fffzthzf 9-12 v: vvvvvvvvvvvmvv 14-17 f: ftflcfffjtjrvfkffmvf 4-7 n: pnmnxnqqjp 6-7 r: rrrkrmr 4-13 k: drckdzxrsmzrkqckn 5-14 t: dttttttttttttt 13-14 v: vvvvfvvvvvvvvvv 7-12 j: jrljwnctjqjjxj 6-7 v: wchfzvm 1-8 d: dddddddzd 10-12 g: gvvzrglgrgggggggggg`)) is the part after the regex, s=>eval(s.replace(/(.+)-(.+)(.): (.+)/g,(m,l,r,c,p)=>"+"+eval(`p.replace(/${c}/g,x=>--l*--r),l>=0&r>=0`))) это часть, которая соответствует регулярному выражению, m,M,l,d,t;f(S,n,c)char**S,c;{for(t=n;n--;t-=d<m|d>M,S++)for(d=!sscanf(*S,"%d-%d %c: %n",&m,&M,&c,&l);l[*S];)d+=l++[*S]==c;n=t;} is the part before the regex, and int c,n,i,j;for(String[]x=s[i=n=c=0].split("\n"),a,r;i<x.length;n+=Integer.parseInt(r[0])>c|Integer.parseInt(r[1])<c?0:1)for(r=(a=x[i++].split(" "))[j=c=0].split("-");j<a[2].length();)if(a[1].charAt(0)==a[2].charAt(j++))c++;System.out.print(n); соответствует символу для подсчета, поэтому мы имеем:

$i

Поскольку Руби +0 just ignores garbage after a numeric string, we can just cast it to int.

Руби }{say$i+0 , 60 characters

$i

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

 

Kewin


Рег
08 Sep, 2013

Тем
84

Постов
201

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

Питон 3, 71 символ

$i++if$x>$`&&$x-2<$1

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

Распаковывает до:

$2

Обратите внимание, что нам нужно назвать функцию, даже если она не рекурсивная, поскольку мы переносим ее в $1 .

Вероятно, это не оптимально, поскольку нам не нужно использовать здесь регулярные выражения, но синтаксический анализ формата с использованием только стандартной библиотеки Python очень утомителен.

 

Kobis


Рег
20 Mar, 2005

Тем
81

Постов
197

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

ГАВК, 87 байт

=()=

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

Это довольно грубая сила, но есть несколько GAWK-измов, которые немного сокращают ситуацию.

Во-первых, выполнение вызовов «split» и «sub» в разделе условий тестирования означает отсутствие необходимости использовать $x characters.

Тогда, воспользовавшись тем фактом, что неинициализированные переменные обрабатываются как пустые строки (когда строки вызываются), это означает, что можно использовать $2 instead of {$x=()=/$2/g} и сохраните один символ.

Код также опирается на тот факт, что, когда неинициализированная переменная рассматривается как целое число, ее значение равно 0.

 

Vtchikulin2013


Рег
12 Nov, 2019

Тем
74

Постов
207

Баллов
587
  • 26, Oct 2024
  • #5

05AB1E, 16 байт

$`

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

Технически это счетчик персонажей с изюминкой!

-2 байта спасибо ovs!

На момент написания этот ответ является выигрышным!

Как?

$2 ||answer||

Желе, 25 19 байт=символы

$1

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

$` ||answer||

Ruby, 80 74 символов, спасибо pppery

/-(.+) (.):/

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

или если вам не нравятся «магические» числа:

/-(.+) (.):/;{$x=()=/$2/g};$i++if$x>$`&&$x-2<$1}{say$i+0

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

 

VekAllobeNold


Рег
02 May, 2017

Тем
67

Постов
211

Баллов
576
  • 26, Oct 2024
  • #7

Oracle SQL, 231/186/117 байт

»IΣυ

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

очевидное сокращение уменьшает его до 186 байт с заметным ухудшением читаемости.

⊞υ№…·⌊θ⌈θ№⊟ι§⊟ι⁰

С использованием ≔I⪪§ι⁰-θ to construct a regular expression to match the full input takes us down to 117 байт.

WΦ⪪S κ«

Регулярное выражение:

WΦ⪪S κ«≔I⪪§ι⁰-θ⊞υ№…·⌊θ⌈θ№⊟ι§⊟ι⁰»IΣυ ||answer||

Скала, 84 символа

{ }MSg Map this function to each line and sum the results: XI.s.CXX Construct this regex: -?\d+ (.) a~ Find the first match in the line (everything from the hyphen through the char) $` The part left of the match (the first number) <= is less than or equal to N the number of occurrences of $1 capture group 1 (the char) in $' the part right of the match (the password, with an extra colon and space that don't matter) <= which is less than or equal to -$0 the whole match, treated as a number, negated (the second number)

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

 

Cicicc


Рег
26 Jan, 2009

Тем
68

Постов
206

Баллов
566
  • 26, Oct 2024
  • #9

сетчатка, 43 байта

$+Y{a<=cNd<=b}MUg@+XW g is lines of stdin (due to -r flag); XW is builtin for regex \w +XW Construct the regex \w+ g@ Get all matches in each element of list g: this converts each line into a list containing the two numbers, the char, and the password { }MU Map this function, calling it on the four elements of each sublist: a The first number <= is less than or equal to cNd the number of occurrences of the char in the password <= which is less than or equal to b the second number The results are 1 if the condition is true, 0 otherwise $+Y Fold the list of 1s and 0s on addition (the Y is just there to make this operation lower precedence than MU)

Попробуйте онлайн! Объяснение:

$+Y{a<=cNd<=b}MUg@+XW

Прокрутите каждую строку ввода.

-r

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

Count[FromDigits/@(#≤{#5~StringCount~#3}≤#2)&@@@S[#~S~" ","-"|" "|":"],1>0]& S=StringSplit

Оцените этот сценарий в строке ввода.

s => // s = input string s[S = 'split']`\n` // split it on line-feeds .map(s => // for each line s: t += // update t: ( [m, M, c] = // [m, M, c] = [min, max, char] obtained by ... s[S](/\W/), // ... splitting s on non-alphanumerical characters k = s[S](c) // k = number of occurrences of c in s, minus 1 .length - 2 // (so we have to subtract 2 from the length of the array) ) >= m & // increment t if k is greater than or equal to m k <= M, // and less than or equal to M t = 0 // starting with t = 0 ) | t // end of map(); return t

Суммируйте количество успешных совпадений.

В качестве примера скрипт для строки s=>s[S='split']` `.map(s=>t+=([m,M,c]=s[S](/\W/),k=s[S](c).length-2)>=m&k<=M,t=0)|t is

s

На первом этапе удаляется все, кроме ssssssss , leaving s (1 для [^s] ^ss{6,10}$ itself and 7 occurrences in the string). The second stage then checks that there are between 7 and 11 occurrences.

 

Петрик


Рег
03 Apr, 2011

Тем
80

Постов
194

Баллов
624
  • 26, Oct 2024
  • #11

Пип (.+)-(.+) (.): .+ [^$3]¶¶^$3$3{$1,$2}$ , 21 characters

%`

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

Объяснение

%~`(.+)-(.+) (.): .+ [^$3]¶¶^$3$3{$1,$2}$ 1

В качестве бонуса вот 29 символов порт Сизифа элегантное решение Ruby использование переменных соответствия регулярных выражений:

n=0;$<.readlines.each{|s|i,a,c,p=s.match(/(\d+)-(\d+) (.): (.*)/).to_a.drop(1);m=p.count(c);n+=1 if (m>=i.to_i&&m<=a.to_i)};puts n

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

Объяснение:

_ split "\n"count{case s"$m-$n $c:$s"=>val o=s.count(c(0)==_);m.toInt<=o&o<=n.toInt} ||answer||

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

: start at the colon [^\3]+ read in the space and any other characters not the key (\3[^\3]*) the key character followed by any number of non-key characters {\1,\2} exactly lowerbound-upperbound times $ end of string

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

select count(*) from test where regexp_like(s,regexp_replace(s,'(\w+)-(\w+) (\w): \w+',':[^\3]+(\3[^\3]*){\1,\2}$'));

Прокрутите входные данные, разбивая каждую строку на пробелы.

regexp_replace

Извлеките числа из первой части строки.

select count(*) from test where length(regexp_replace(regexp_substr(s,'\w+',1,4),'[^'||regexp_substr(s,'\w+',1,3)||']','')) between regexp_substr(s,'\d+') and regexp_substr(s,'\d+',1,2);

Создайте диапазон этих чисел и проверьте, находится ли количество символов в строке в пределах этого диапазона.

with p as (select regexp_substr(s,'\d+') l, regexp_substr(s,'\d+',1,2) u, regexp_substr(s,'\w+',1,3) j, regexp_substr(s,'\w+',1,4) p from test) select count(*) from p where length(regexp_replace(p,'[^'||j||']','')) between l and u;

Выведите общее количество совпадений.

 

Oneboxone


Рег
25 Dec, 2014

Тем
83

Постов
172

Баллов
597
  • 26, Oct 2024
  • #12

Perl 5, 56 символов

Беги с def f(x,z=0): for l in x.splitlines():n,p=l.split(":");m,o=n.split("-");z+=int(m)<=p.count(o[-1])<=int(o[:-1]) return z . Takes input in the usual Perl ways: as standard input or as filenames passed as command line args.

p $<.count{|l|a,b,c,s,s=l.split /[- :]/;a.to_i>=x=s.count(c)and x<=b.to_i}

Мне нравится эта загадочная семантика регулярных выражений.

Объяснение:

p $<.count{|l|a,b,c,s=l.split /[- ]/;a.to_i>=x=s.count(c[0])and x<=b.to_i}

Сначала мы получаем минимум, максимум и символ, соответствующий ḲµḢ⁾-ryViḢċ@¥/ Monadic helper link: µ Consider Ḳ the argument split on spaces. Ḣ Pop the first element, ⁾-ry replace the hyphen with "r" (inclusive range dyad), V and eval. i Find the index (or 0 if not found) in that range of ċ the number of occurrences of Ḣ @ the first element of ¥/ the first remaining element of the split input in the second. ỴÇƇL Main link: Ỵ split on newlines, Ƈ filter by Ç helper link (is the password valid?), L length. , ḲµḢ⁾-ryViḢċ@¥/ ỴÇƇL , и | # Convert the input into a list ʒ# # For each element in each line ć'-¡Ÿ # Parse the range sR` # Unpack the string and character н # Parse the character ¢å # Is the number of occurences in the range? }g # How many lines have this condition? variables, respectively ( |ʒ#ć'-¡ŸsR`н¢å}g — это строка «все до совпадения», которая является нашим первым числом).

""

Затем мы видим, сколько a there are in the string and store that number in ; . Обратите внимание, что мы добавим превышение на единицу, поскольку мы также учитываем экземпляр перед двоеточием. split($1,b,"-")sub(":",a,$2){n=b[1];x=b[2];c=split($3,y,$2);t+=n<c&&--c<=x}END{print t} is creatively called the "Saturn" operator and is one of the Perl "secret" operators. We wrap this in a block so that the regex variables (which are block-local for some reason) don't overwrite our exec и import re f=lambda x:eval(re.sub('(\d+).(\d+).(.)(.+)\n?',r'+(\1<="\4".count("\3")<=\2)',x)) from the first match.

exec(bytes("浩潰瑲爠੥㵦慬?慤砠攺慶⡬敲献扵✨尨?⸩尨?⸩⸨⠩⬮尩㽮Ⱗ❲⠫ㅜ㴼尢∴挮畯瑮∨㍜⤢㴼㉜✩砬⤩",'U16')[2:])

Увеличить переменную ~/\d+ (.)/;($`.to_i..$&.to_i)===$'.count($1)||$.-=1 END{p$.} if the number of matches (correcting for our earlier overcount) is between the min and the max. It's times like these that make me really wish Perl had Python's transitive comparison operators.

-n

Еще один секретный оператор, который приведет нас к концу скрипта, после чего мы выведем количество правильных строк. Мы бросаем to_i at the end because $` = '3-' $& = '8 j' $1 = 'j' $' = ': ksjjtvnjbjppjjjl' начинается с неопределенного значения, и нам нужно вывести ноль, если совпадений вообще не было.

Вы можете узнать о секретных операторах, которые я использовал здесь, и о некоторых других, на соответствующая страница CPAN.

 

Fliniesseme20


Рег
06 Nov, 2011

Тем
61

Постов
206

Баллов
541
  • 26, Oct 2024
  • #15

Javascript, 106 символов

$&

Тест:

$' ||answer||

SmileBASIC 4, 198 символов

3-8 j: ksjjtvnjbjppjjjl \-/ Regex matches here

Получает входные данные через I$[]. Просто анализирует информацию о символах min-max и ищет каждую строку массива строк, подсчитывая и суммируя количество истинных совпадений.


Однострочная (иш) версия (то же количество символов):

3-8 j: ksjjtvnjbjppjjjl ||answer||

Япт p$<.count{|l|l=~/\d+ (.)/;($`.to_i..$&.to_i)===$'.count($1)} , 20 байты

Принимает входные данные в виде массива строк.

eval'㵰␼⹣潵湴э汼氽縯層⬠⠮⤯㬨①⹴潟椮⸤☮瑯彩⤽㴽␧⹣潵湴⠤ㄩ紻'.encode('utf-16').b

Попробуйте это

 

Tvv26


Рег
16 Apr, 2020

Тем
76

Постов
227

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

Интересно