Визначте "Удача" рядка


35

Дано рядок, поверніть йому "удачу".

Удача струни, як я цілком склав для цього завдання, - ціле число, визначене так:

  • Основна удача для струни - 1.
  • Кожен лист поспіль ділиться на слово "пощастило" (нечутливий до регістру), помножте удачу на 2. Наприклад, якщо ваш рядок був " lu mberjack" або "sma ck ", ви помножите на 4. (Більш конкретно, 2 ^ кількість послідовних символів, що ділиться.)
    • Спільні букви мають бути в тому ж послідовному порядку, що відображається у "щасливчику", але може починатися в будь-якому місці слова з однаковим значенням ("luc" має той же множник 8 *, що і "cky").
    • Якщо слово має кілька випадків, коли воно ділиться послідовними символами з щасливчиком, використовуйте найдовшу послідовну рядок символів.
  • Для будь-якого листа він ділиться зі словом "прикмета" відняти 2 від удачі.
    • Він може відповідати символу в будь-якій кількості разів, у будь-якому порядку. Наприклад, рядок "nnnnnomemenn" втрачає 24 удачі (12 відповідних букв)

Приклад:

luck("lucky")
>>32

2 ^ 5 (5 листів підряд) = 32

luck("firetruck")
>>6

2 ^ 3 - 2 (3 послідовні листи від uck , e поділяються з ознакою)

luck("memes")
>>-7

1 - 8 (базова сума, 4 ділиться з "ознакою")

Це кодовий гольф, тому відповідь з найменшими байтами виграє.

Ви можете вводити та виводити будь-який спосіб, який хочете - написати функцію, використовувати стандартний ввід тощо.

Для функцій припустимо, який би тип даних не мав сенсу для цієї мови. (Наприклад, у JavaScript вам передадуть a Stringі поверніть a Number)

Редагувати: Ви можете припустити, що будь-який вхід є малим.


8
Приємний перший виклик!
Алекс А.

2
Чи повинна програма приймати великі літери?
busukxuan

2
@busukxuan Добре запитання - ні, не потрібно приймати великі літери.
вугільна трава

@cat Не впевнений, я цілком розумію, про що ти питаєш. Але ви можете припустити, що всі дані будуть малі, і вам не потрібно вводити будь-які великі введення.
chargragrass

1
Чи можемо ми припустити верхню або нижню межу на долю даного введення? тобто яка найменша кількість біт / тип даних, з якими я можу піти, чи вона така велика, наскільки може вчинити моя мова? тобто має бути int8_t str_luck(const char* str);чи має бути uint64_t str_luck(const char* str);?
кіт

Відповіді:


7

05AB1E , 36 32 28 26 байт

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

Пояснення

Œ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

Спробуйте в Інтернеті

Збережено 2 байти завдяки Аднану


Стиснення на 1 слово також можна зробити за допомогою ', так що для 26: Œv'¸éyåiyˆ}}¯é¤go¹'ƒÖ¦Ãg·-:).
Аднан

@Adnan: Дивно. Я був певен, що спробував це. Мабуть, ні. Спасибі!
Емінья

чому це не найкраща відповідь?
noɥʇʎԀʎzɐɹƆ

7

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

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

Редагувати: Збережено 11 байт завдяки @Titus, припускаючи, що літера Lне відображається на вході. Збережено 5 байт завдяки @Oriol. Версія ES6 на 125 114 109 байт:

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
;
<input oninput=o.textContent=f(this.value)><pre id=o></pre>


Для чого ви використовуєте replace([^])замість match([])? Ви витрачаєте 3 байти чи є причина?
Тит

@Titus Скільки байтів коштує вирішити nullрезультат матчу?
Ніл

1
Чотири для струни, а пара ()в цьому випадку; з'їсти всі шість, на яких ви б заощадили match(/[omen]/). Шкода.
Тит

1
@Titus Не впевнений, що це ви мали на увазі, але додавши Lв кінець субстрату (який ніколи не з’явиться в початковій рядку) Мені не доведеться турбуватися про сторонні збіги, і я можу реально використовувати один і той же масив [5,4,3,2,1,0]обидва рази, економія колосальних 13 байт!
Ніл

1
-2*s.split(/[omen]/).length+2коротше.
Оріол

6

Pyth, 27 26 28 байт

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

1 байт збережено завдяки OP :-)

Пояснення:

                                 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

Перевірте це тут .


1
Я не фахівець з Pyth, але я вважаю, що ви можете змінитись "omen"на справедливі, "omenі Pyth зрозуміє
charredgrass

@charredgrass На жаль, моя помилка :-)
busukxuan

1
Схоже, це не працює для рядка без символів, що утворюють "пощастило" в ньому. "меми", наприклад.
Емінья

1
@Emigna Ах. нульовий випадок знову .... Дякую, виправлено!
busukxuan

6

Рубі, 91 87 байт

String#countВибагливе використання знову вражає! (При передачі рядка він підраховує всі випадки кожної літери в аргументі функції замість усіх входжень усього рядка.)

Спробуйте в Інтернеті

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

Версія, яка бере рядки від STDIN і друкує їх: 89 байт (86 +3 від -nпрапора)

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

1
._. що String#countце дивно. +1 для (ab), використовуючи його. Також коротше використовувати, getsа не функцію?
Пуховина

1
@Downgoat, якщо я getsтеж повинен putsдля виведення, тож не в цьому випадку.
Значення чорнила

4

Ruby: 100 байт

->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}

Спробуйте, /[omen]/як регулярний вирив гольфу вниз, - він буде відповідати будь-якому персонажу і краще в практичному використанні, ніж прив'язування |s для окремих персонажів.
вугільна трава

3

Javascript - 206 байт

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}

1
Ви можете змінити цю умову: s[k]=='o'||s[k]=='m'||s[k]=='e'||s[k]=='n'виглядати так:"oman".split("").includes(s[k])
addison

1
Ласкаво просимо до PPCG! Ви можете заграти в гольф, видаливши пробіли, щоб зберегти байти. Також замість (s[k]=='o'||s[k]=='m'||s[k]=='e'||s[k]=='n')вас можна було б використовувати ('omen'.indexOf(s[k])+1)(припустимо, що це JavaScript)
charredgrass

Дякуємо за поради! Отримав це до 237, хоча, схоже, натовп Рубі мене побив.
Крістофер Бургдорф

Ще одна невелика річ: ви можете скоротити function luck(r)їх доr=> щоб просто зробити це анонімною функцією. Це все, що потрібно для цього завдання. Також я r=r.toLowerCase();
змінив

Замість substring ви можете використовувати sliceя вважаю (протестуйте це, хоча, як я не впевнений)
Downgoat

3

Рубін, 57 байт

b=gets.count'omen'
$.+=1while/[lucky]{#$.}/
p 2**$./2-2*b

getsвстановлюється $.як 1 в якості побічного ефекту, тоді ми збільшуємо його до тих пір, поки регулярний вираз, що відповідає $.послідовним щасливим символам, більше не збігається.


3

Хаскелл, 99

Ще один підхід ... Я щойно дізнався про функцію псевдоніму

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

Використання

f"lucky"
32

f"firetruck"
6

f"memes"
-7

2

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

Код:

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

Пояснення:

LongestCommonSubsequenceповертає найдовшу суміжну підрядку, спільну для входу та "lucky". StringLengthдає свою довжину. StringCountпідраховує кількість "omen"входів символів вхідних даних.


2

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

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)

Ви можете зберегти один байт, скориставшисьfrom intertools import*
wnnmaw

1

TSQL, 233 байти

Гольф:

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

Безголівки:

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

Спробуйте в Інтернеті


1

Haskell ( 134 132 байт)

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")

Не кодовий гольфіст, ані програміст Haskell, тому я би радив кілька порад щодо цього.

(Приклад: g "firetruck")


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

1

Пітон 3, 168 157 152 139 144 136 байт

EDIT: Дійсно очевидні речі, які я повинен був бачити легшими, були змінені, а деякі трохи менш очевидні.

Редагування 2: стоопід (˚n˚). Програма кинула помилки. Я це виправив. насправді 153 :(

Завдяки Leaky Nun за збереження 5 байтів, а також jmilloy за збереження 13 8 байт.

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))

Програма працює через усі можливі підрядки вхідних даних (можливо, тому що вона також обчислює неможливі підрядки, наприклад, 8 - 7), перевіряє, чи підрядок має "пощастило", а потім встановлює показник 2 на довжину підстрока повинна, якщо вона перевищує поточну величину. Можливо, це можна покращити, використовуючи лише один цикл while. Можливо, можна скористатися деяким удосконаленням; Я все ще зависаю цього.


while p+1стаєwhile-~p
Leaky Nun

оскільки b=s[p:q], len(b)мабуть, q-pправильно?
Leaky Nun

Я вкрав у вас спосіб введення та друку, але все інше зробив зовсім інше, дякую! Я думаю, якщо ти просто зробиш print(2**m-2*sum(i in"omen" for i in s))для своїх останніх трьох рядків, ти зробиш краще, як 148?
jmilloy

О, і ви можете просто перемістити s [p: q] в пункт if якщо while-~q:n=q-p;m=n if(s[p:q]in"lucky")*n>m else m;q-=1143?
jmilloy

sum(map(s.count,"omen"))економить один байт, зробивши це 135
Чорна сова Кай

1

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

квантовий стрибок не вдається для декількох підрядів, де перше виникнення коротше. :(

насправді я міг би зберегти ще 7 байт у PHP <5.4 із включеним register_globals

<?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);

використання: php -d error_reporting=0 <filename> <string>

+5 для функції:

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);}

тести (за функцією)

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>';


0

Scala, 155 байт

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.