文字列の「運」を決定する


35

文字列を指定すると、その文字列の「運」を返します。

文字列の運は、このチャレンジの目的のために完全に補ったので、次のように決定される整数です。

  • 文字列の基本的な運は1です。
  • 単語「lucky」(大文字と小文字は区別されません)と共有する連続した文字ごとに、luckに2を掛けます。たとえば、文字列が「lu mberjack」または「sma ck」の場合、4を掛けます。 2 ^連続した文字の共有数。)
    • 共有文字は、「ラッキー」に表示されるのと同じ順序である必要がありますが、同じ値の単語のどこからでも開始できます(「luc」は「cky」と同じ8 *乗数です)。
    • 単語に複数のオカレンスがあり、ラッキーと連続した文字を共有している場合、文字の最も長い連続した文字列を使用します。
  • 任意の文字については、「omen」という単語と共有し、運から2を引きます。
    • 文字を任意の順序で任意の回数一致させることができます。たとえば、文字列 "nnnnnomemenn"は24運(12の一致する文字)を失います

例:

luck("lucky")
>>32

2 ^ 5(連続した5文字)= 32

luck("firetruck")
>>6

2 ^ 3-2(前兆と共有されるuckeからの連続した3文字)

luck("memes")
>>-7

1-8(基本額、4は「前兆」と共有)

これはコードゴルフであるため、バイト数が最も少ない答えが優先されます。

任意の方法で入出力できます-関数の作成、標準入力の使用など。

関数の場合、その言語にとって意味のあるデータ型を想定します。(たとえば、JavaScriptでは、aが渡され、a Stringを返しますNumber

編集:入力はすべて小文字であると想定できます。


8
素敵な最初の挑戦!
アレックスA.

2
プログラムは大文字入力を受け入れるべきですか?
busukxuan

2
@busukxuanいい質問です-いいえ、大文字の入力を受け入れる必要はありません。
チャーレッドグラス

@catあなたが何を求めているのかよくわかりません。ただし、すべての入力が小文字であると仮定することができ、大文字の入力をキャッチする必要はありません。
チャーレッドグラス

1
特定の入力の運の上限または下限を想定できますか?すなわち、私が逃げることができるビット/データ型の最小数は何ですか、またはそれは私の言語が処理できるのと同じくらい大きいですか?つまり、あるべきですか、int8_t str_luck(const char* str);そうあるべきuint64_t str_luck(const char* str);ですか?

回答:


7

05AB1E36 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

オンラインで試す

Adnanのおかげで2バイト節約


1ワードの圧縮はで行うこともできる'ため、26:Œv'¸éyåiyˆ}}¯é¤go¹'ƒÖ¦Ãg·-:)の場合。
アドナン

@アドナン:奇妙だ。私はそれを試したことは確かでした。どうやら。ありがとう!
エミグナ

なぜこれが一番の答えではないのですか?
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

編集:@Titusのおかげで、文字Lが入力に表示されないと想定して11バイト保存しました。@Oriolのおかげで5バイト節約されました。125 114 109バイトのES6バージョン:

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
文字列の場合は4つ()、この場合は2つ。あなたが一緒に節約する6つをすべて食べますmatch(/[omen]/)。残念。
タイタス

1
@Titusそれがあなたが意図したものかどうかはわかりませんLが、substrの最後に(元の文字列には表示されません)を追加することで、余分な一致を心配する必要はなく、実際に同じ配列を[5,4,3,2,1,0]両方使用できますなんと13バイト節約できます!
ニール

1
-2*s.split(/[omen]/).length+2短いです。
オリオール

6

ピス、27 26 28バイト

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

OPのおかげで1バイト節約されました:-)

説明:

                                 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おっと、私の間違い:
busukxuan

1
「幸運」な文字を含まない文字列では機能しないようです。たとえば「ミーム」。
エミグナ

1
@エミグナああ 再びゼロケース....ありがとう、修正しました!
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バイト(-nフラグから86 +3 )

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は奇妙です。(ab)それを使用するための+1。また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

ヒントをありがとう!Rubyの群衆は私を打ち負かしたように見えますが、237になりました。
クリストファーブルクドルフ

もう1つの小さなこと:簡単に匿名関数に短縮function luck(r)することができますr=>。それがこの課題に必要なことです。また、私はチャレンジを編集したので、ケースを心配する必要はありませんので、削除することができますr=r.toLowerCase();
charredgrass

代わりに、私は信じるsubstringことができますslice(ただし、これはテストしますが、よく
わかり

3

ルビー、57バイト

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

gets$.副作用として1に設定し、$.連続するラッキーキャラクターに一致する正規表現が一致しなくなるまで、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

Mathematica、86バイト

コード:

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

説明:

LongestCommonSubsequence入力とに共通する最長の連続部分文字列を返します"lucky"StringLengthその長さを示します。入力内のStringCount文字の出現回数をカウントし"omen"ます。


2

Python(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

ハスケル(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

Python 3、168 157 152 139 144 136バイト

編集:私が見たはずだった本当に明白なことはもっと簡単に変更され、いくつかはやや目立たなくなりました。

編集2:愚かな(˚n˚)。プログラムはエラーをスローしました。直しました。実際には153ではありません:(

5バイトを節約してくれたLeaky Nunと、8バイトを13節約してくれたjmilloyに感謝します。

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ループを1つだけ使用することで改善される可能性があります。おそらくいくつかの改善を使用できます。私はまだこれのこつを得ています。


while p+1になるwhile-~p
リーキー修道女

以来b=s[p:q]、正しいlen(b)必要がありますq-pか?
リーキー修道女

入力と印刷方法を盗みましたが、残りは非常に異なっていました、ありがとう!私はあなただけで行う場合を考えるprint(2**m-2*sum(i in"omen" for i in s))148のように、あなたの最後の3行のためにあなたが良くやりますか?
jmilloy

ああ、s [p:q] while-~q:n=q-p;m=n if(s[p:q]in"lucky")*n>m else m;q-=1を143のif句に移動するだけですか?
jmilloy

sum(map(s.count,"omen"))1バイトを節約し、135バイトになります
Black Owl Kai

1

PHPプログラム、139 135 108バイト

最初の出現が短い複数の部分文字列では、量子跳躍が失敗します。:(

実際にregister_globalsをオンにしてPHP <5.4でさらに7バイト節約できます

<?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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.