Codegolf - Определить «Удачу» Струны

  • Автор темы Саша13
  • Обновлено
  • 21, Oct 2024
  • #1

Учитывая строку, верните «удачу» этой строки.

Удача строки, как я только что придумал для этой задачи, представляет собой целое число, определяемое следующим образом:

  • Базовая удача для строки равна 1.
  • Для каждой последовательной буквы, которая совпадает со словом «счастливый» (без учета регистра), умножьте удачу на 2. Например, если ваша строка была «Луберджек" или "смаск" вы бы умножили на 4. (Более конкретно, 2^количество общих последовательных символов.)
    • Общие буквы должны располагаться в том же последовательном порядке, что и в слове «lucky», но могут начинаться в любом месте слова с тем же значением («luc» имеет тот же множитель 8*, что и «cky»).
    • Если слово встречается несколько раз, где оно разделяет последовательные символы со словом «счастливчик», используйте самую длинную последовательную строку символов.
  • За ЛЮБУЮ букву, которая совпадает со словом «предзнаменование», из удачи вычитают 2.
    • Он может соответствовать символу любое количество раз и в любом порядке. Например, строка «nnnnnomemenn» теряет 24 удачи (12 совпадающих букв).

Пример:

 
 
 Number 

2^5 (5 букв подряд) = 32

String

2^3 - 2 (3 буквы подряд из ок, е поделился с предзнаменованием)

luck("memes") >>-7

1–8 (базовое количество, 4 совместно с «предзнаменованием»)

Это код-гольф, поэтому побеждает ответ с наименьшим количеством байтов.

Вы можете вводить и выводить данные любым способом — написать функцию, использовать стандартный ввод и т. д.

Для функций предположите, что тип данных имеет смысл для этого языка. (Например, в JavaScript вам будет передано luck("firetruck") >>6 and return a luck("lucky") >>32 )

Изменить: вы можете предположить, что любой ввод имеет нижний регистр.

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

Саша13


Рег
22 Jul, 2011

Тем
65

Постов
176

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

05AB1E, 36 32 28 26 байт

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 n=>(1<<Matches(n,"l?u?c?k?y?").OrderBy(x=>x.Value).Last().Length)-n.Count(x=>"omen".Any(c=>c==x))*2
 

Объяснение

/u:System.Text.RegularExpressions.Regex

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

Сэкономлено 2 байта благодаря Аднан

 

Danceptateece78


Рег
02 Jan, 2009

Тем
80

Постов
195

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

JavaScript (ES7), 123 112 107 байт

def f(w:String)=(1::List.fill((for(a<-1 to 5;s<-"lucky".sliding(a))yield if(w.contains(s)) a else 0).max){2}).product-2*w.filter("omen".contains(_)).length

Изменить: сохранено 11 байт благодаря @Titus, если предположить, что буква echo '<table border=1><tr><th>input</th><th>output</th><th>expected</th><th>ok?</th></tr>'; foreach([ 'lumberjack'=>0, 'smack'=>2, 'nnnnnomemenn'=>-23, 'lucky'=>32, 'omen'=>-7, 'firetruck'=>6, 'memes'=>-7, 'determine the “luck” of a string'=>0, 'amazing'=>-3, 'wicked'=>2, 'chucky'=>16, 'uckyuke'=>14, 'ugly'=>2, 'lucy'=>8, 'lukelucky'=>30 ] as $x=>$e){ $y=f($x); echo"$h<tr><td>",$x,'</td><td>',$y,'</td><td>',$e,'</td><td>',$e==$y?'Y':'N',"</td></tr>"; }echo '</table>'; does not appear in the input. Saved 5 bytes thanks to @Oriol. ES6 version for 125 114 109 bytes:

function f($s){for(;$i<5;$i++)for($j=6;--$j;)$r=max($r,strstr($s,substr('lucky*',$i,$j))?2**$j:1);return$r-2*preg_match_all('/[omen]/',$s);} php -d error_reporting=0 <filename> <string>
 

Leba10


Рег
09 Aug, 2014

Тем
65

Постов
167

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

Пиф, 27 26 28 байт

<?for($s=$argv[1];$i<5;$i++)for($j=6;--$j;)$r=max($r,strstr($s,substr('lucky*',$i,$j))?2**$j:1);echo$r-2*preg_match_all('/[omen]/',$s);

1 байт сэкономлен благодаря ОП :-)

Объяснение:

s=input() p=q=k=len(s) m=0 while-~p: while-~q:m=(m,q-p)[(s[p:q]in"lucky")*q-p>m];q-=1 p-=1;q=k print(2**m-2*sum(i in"omen"for i in s))

Проверьте это здесь.

 

Zetan


Рег
12 Dec, 2005

Тем
111

Постов
216

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

Рубин, 91 87 байт

g "firetruck" 's finnicky usage strikes again! (When passed a String, it counts all occurrences of each letter in the function argument instead of all occurrences of the entire string.)

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

import Data.List c[]=[] c s@(_:x)=inits s++c x l=length g q=2^(maximum$map(\z->l q-l(q\\z))$c"lucky")-2*(l$intersect q"omen")

Версия, которая принимает строки из STDIN и печатает их: 89 байт (86 +3 из DECLARE @t varchar(99)='oluck' ,@z INT=0 ,@a INT=0 ,@ INT=1 ,@c INT=0 WHILE @a<LEN(@t) SELECT @a+=IIF(@=1,1,0), @z=IIF('LUCKY'LIKE'%'+x+'%'and @>@z,@,@z), @c+=IIF(x IN('O','M','E','N'),2,0), @=IIF(@+@a-1=LEN(@t),1,@+1) FROM(SELECT SUBSTRING(@t,@a,@)x)x PRINT POWER(2,@z)-@c flag)

DECLARE @t varchar(99)='oluck' ,@z INT=0,@a INT=0,@ INT=1,@c INT=0WHILE @a<LEN(@t)SELECT @a+=IIF(@=1,1,0),@z=IIF('LUCKY'LIKE'%'+x+'%'and @>@z,@,@z),@c+=IIF(x IN('O','M','E','N'),2,0),@=IIF(@+@a-1=LEN(@t),1,@+1)FROM(SELECT SUBSTRING(@t,@a,@)x)x PRINT POWER(2,@z)-@c ||answer||

Рубин: 100 байт

import itertools as t s=input() print 2**max([j-i for i,j in t.combinations(range(6),2)if'lucky'[i:j]in s]+[0])-2*sum(_ in'omen'for _ in s) ||answer||

Javascript — 206 байт

"omen" ||answer||

Рубин, 57 байт

StringCount

StringLength sets "lucky" до 1 в качестве побочного эффекта, затем мы увеличиваем его до тех пор, пока регулярное выражение не будет соответствовать LongestCommonSubsequence consecutive lucky characters no longer matches.

 

Doliirredge


Рег
26 Mar, 2016

Тем
85

Постов
217

Баллов
662
  • 26, Oct 2024
  • #6

Хаскелл, 99

Другой подход... Я только что узнал о псевдонимах функций.

2^StringLength@LongestCommonSubsequence[#,"lucky"]-2StringCount[#,{"o","m","e","n"}]&

Использование

f"lucky" 32 f"firetruck" 6 f"memes" -7 ||answer||

Математика, 86 байт

Код:

import Data.List s=subsequences i=intersect l=length f n=2^(l$last$i(s"lucky")$s n)-2*l(i n$"omen")

Объяснение:

$. returns the longest contiguous substring common to the input and $. . gets gives its length. b=gets.count'omen' $.+=1while/[lucky]{#$.}/ p 2**$./2-2*b подсчитывает количество вхождений символов r=>{var a="lucky";r:for(var e=5;e>0;e--)for(var n=0;6>n+e;n++){var o=a.substring(n,e+n);if(r.includes(o))break r}for(var t=0,e=0;e<r.length;e++)('omen'.indexOf(r[e])+1)&&t++;return Math.pow(2,o.length)-2*t} in the input.

 

Acidsatan


Рег
28 May, 2011

Тем
85

Постов
214

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

Питон (139 байт)

->s{2**(m=0;4.times{|j|1.upto(5){|i|m=[i,m].max if s.match"lucky"[j,i]}};m)-s.scan(/[omen]/).size*2} ||answer||

TSQL, 233 байта

Гольф:

p 2**(z=0..5).max_by{|j|z.map{|i|$_[b="lucky"[i,j]]?b.size: 0}.max}-2*$_.count("omen")

Не в гольфе:

-n

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

 

Yana Su


Рег
24 Oct, 2020

Тем
100

Постов
185

Баллов
695
  • 26, Oct 2024
  • #8

Хаскелл (134 132 байта)

->s{2**(z=0..5).max_by{|j|z.map{|i|s[b="lucky"[i,j]]?b.size: 0}.max}-2*s.count("omen")}

Я не игрок в гольф и не программист на Haskell, поэтому хотел бы получить несколько советов по этому поводу.

(Пример: String#count )

 

Krocha


Рег
08 Sep, 2006

Тем
61

Постов
195

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

Python 3, 168 157 152 139 144 136 байт

РЕДАКТИРОВАТЬ: действительно очевидные вещи, которые мне следовало бы видеть проще, были изменены, а некоторые немного менее очевидны.

Редактировать 2: тупой (˚n˚). Программа выдавала ошибки. Я это исправил. не совсем 153 :(

Спасибо Leaky Nun за экономию 5 байт и jmilloy за экономию 13 8 байт.

Implicit Q as input .:Q Find all substrings of input +k}#"lucky" Filter for substring of "lucky", prepend "" in case of [] e Take last element, which is longest l Get its length ^2 Raise two to that @"omen"Q Filter Q for characters in "omen" l Get length; counts how many characters in "omen" there are y Double that - Find the difference

Программа перебирает все возможные подстроки на входе (возможно, потому что она вычисляет и невозможные подстроки, например, от 8 до 7), проверяет, находится ли подстрока в «счастливом» состоянии, затем устанавливает показатель степени 2 равным длине подстрока должна быть больше текущего значения. Возможно, можно улучшить, используя только один цикл while. Возможно, можно было бы улучшить ситуацию; Я все еще разбираюсь в этом.

 

Othetuaccum


Рег
18 Jun, 2006

Тем
72

Постов
195

Баллов
595
  • 26, Oct 2024
  • #10

Программа PHP, 139 135 108 байт

квантовый скачок невозможен для нескольких подстрок, первое из которых короче. :(

на самом деле я мог бы сэкономить еще 7 байт в PHP<5.4 с включенным Register_globals

-^2le+k}#"lucky".:Q)yl@"omen

использование: <input oninput=o.textContent=f(this.value)><pre id=o></pre>

+5 за функцию:

f= s=>(1<<[5,4,3,2,1,0].find((i,_,a)=>a.some(j=>s.includes("luckyL".substr(j,i)))))-2*~-s.split(/[omen]/).length ;

тесты (по функции)

L ||answer||

Скала, 155 байт

s=>2**[5,4,3,2,1,0].find((i,_,a)=>a.some(j=>s.includes("luckyL".substr(j,i))))-2*~-s.split(/[omen]/).length ||answer||

C# (интерактивный компилятор Visual C#) с флагом Œv } # for each substring of input '¸éyåi } # if substring is part of "lucky" yˆ # add it to global array ¯é¤ # get the longest such substring go # raise 2 to its length ¹'ƒÖ¦Ã # remove all chars from input that isn't in "omen" g· # get length and multiply by 2 - # subtract # implicitly display , 99 bytes

Œv'¸éyåiyˆ}}¯é¤go¹'ƒÖ¦Ãg·-

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

 

Xelen


Рег
21 Apr, 2006

Тем
74

Постов
223

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

Интересно