Tentukan "Keberuntungan" dari sebuah string

35

Diberikan string, kembalikan "keberuntungan" string itu.

Keberuntungan string, karena saya baru saja mengarang untuk tujuan tantangan ini, adalah bilangan bulat, ditentukan sebagai berikut:

  • Keberuntungan dasar untuk string adalah 1.
  • Untuk setiap huruf berturut-turut yang dibagikan dengan kata "keberuntungan" (tidak peka huruf besar-kecil), gandakan keberuntungan dengan 2. Misalnya, jika string Anda adalah " lu mberjack" atau "sma ck " Anda akan mengalikan dengan 4. (Lebih khusus, 2 ^ jumlah karakter berurutan yang dibagikan.)
    • Huruf yang dibagikan harus dalam urutan yang sama secara berurutan seperti "beruntung" tetapi dapat dimulai di mana saja di kata untuk nilai yang sama ("luc" memiliki pengali 8 * yang sama dengan "cky").
    • Jika kata tersebut memiliki banyak kejadian di mana ia berbagi karakter berturut-turut dengan lucky, gunakan string karakter berturut-turut terpanjang.
  • Untuk huruf APA PUN yang dibagikan dengan kata "pertanda" kurangi 2 dari keberuntungan.
    • Itu bisa cocok dengan karakter berapa kali, dalam urutan apa pun. Misalnya string "nnnnnomemenn" kehilangan 24 keberuntungan (12 huruf yang cocok)

Contoh:

luck("lucky")
>>32

2 ^ 5 (5 huruf berurutan) = 32

luck("firetruck")
>>6

2 ^ 3 - 2 (3 surat berturut-turut dari uck , e dibagikan dengan pertanda)

luck("memes")
>>-7

1 - 8 (jumlah dasar, 4 dibagikan dengan "pertanda")

Ini adalah kode golf, jadi jawabannya dengan byte paling sedikit menang.

Anda dapat input dan output dengan cara apa pun yang Anda inginkan - menulis fungsi, menggunakan input standar, dll.

Untuk fungsi, anggap tipe data apa pun yang masuk akal untuk bahasa itu. (Misalnya, dalam JavaScript, Anda akan lulus Stringdan mengembalikan a Number)

Sunting: Anda dapat menganggap setiap input huruf kecil.

charredgrass
sumber
8
Tantangan pertama yang bagus!
Alex A.
2
Haruskah program menerima input huruf besar?
busukxuan
2
@busukxuan Pertanyaan bagus - tidak, tidak perlu menerima input huruf besar.
charredgrass
@ kucing Tidak yakin saya cukup mengerti apa yang Anda minta. Tapi Anda bisa berasumsi bahwa semua input akan menjadi huruf kecil dan Anda tidak perlu menangkap input huruf besar.
charredgrass
1
Bisakah kita mengasumsikan batas atas atau bawah pada keberuntungan dari input yang diberikan? yaitu berapa jumlah bit / tipe data terkecil yang bisa saya hindari, atau sebesar apa yang bisa ditangani oleh bahasa saya? yaitu, apakah seharusnya int8_t str_luck(const char* str);atau seharusnya uint64_t str_luck(const char* str);?
kucing

Jawaban:

7

05AB1E , 36 32 28 26 byte

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

Penjelasan

Œ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

Cobalah online

Disimpan 2 byte berkat Adnan

Emigna
sumber
Kompresi untuk 1 kata juga dapat dilakukan dengan ', jadi untuk 26: Œv'¸éyåiyˆ}}¯é¤go¹'ƒÖ¦Ãg·-:).
Adnan
@ Adnan: Aneh. Saya yakin saya telah mencobanya. Sepertinya tidak. Terima kasih!
Emigna
mengapa ini bukan jawaban teratas?
noɥʇʎԀʎzɐɹƆ
7

JavaScript (ES7), 123 112 107 byte

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

Sunting: Disimpan 11 byte berkat @Titus dengan mengasumsikan bahwa surat Litu tidak muncul di input. Disimpan 5 byte berkat @Oriol. Versi ES6 untuk 125 114 109 byte:

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>

Neil
sumber
Mengapa Anda menggunakan replace([^])bukan match([])? Apakah Anda membuang 3 byte atau ada alasan?
Titus
@Titus Berapa byte yang dibutuhkan untuk menangani nullhasil pertandingan?
Neil
1
Empat untuk string, dan sepasang ()dalam hal ini; memakan semua enam yang akan Anda simpan match(/[omen]/). Kasihan.
Titus
1
@Titus Tidak yakin apakah itu yang Anda maksudkan tetapi dengan menambahkan sebuah Lke ujung substr (yang tidak akan pernah muncul di string asli) Saya tidak perlu khawatir tentang pertandingan asing dan saya benar-benar dapat menggunakan array yang sama [5,4,3,2,1,0]dua kali, menghemat 13 byte kekalahan!
Neil
1
-2*s.split(/[omen]/).length+2lebih pendek.
Oriol
6

Pyth, 27 26 28 byte

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

1 byte disimpan berkat OP :-)

Penjelasan:

                                 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

Uji di sini .

busukxuan
sumber
1
Saya bukan ahli dalam Pyth tapi saya yakin Anda bisa berubah "omen"menjadi adil "omendan Pyth akan mengerti
charredgrass
@charredgrass Ups, kesalahan saya :-)
busukxuan
1
Tampaknya tidak berfungsi untuk string tanpa karakter berbentuk "beruntung" di dalamnya. "meme" misalnya.
Emigna
1
@Emigna Ah. kotak nol lagi .... Terima kasih, perbaiki!
busukxuan
6

Ruby, 91 87 byte

String#countPenggunaan finnicky menyerang lagi! (Ketika melewati sebuah String, ia menghitung semua kemunculan setiap huruf dalam argumen fungsi alih-alih semua kemunculan seluruh string.)

Cobalah online

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

Versi yang mengambil garis dari STDIN dan mencetaknya: 89 byte (86 +3 dari -nbendera)

p 2**(z=0..5).max_by{|j|z.map{|i|$_[b="lucky"[i,j]]?b.size: 0}.max}-2*$_.count("omen")
Nilai Tinta
sumber
1
._. itu String#countaneh. +1 untuk (ab) menggunakannya. Apakah lebih pendek untuk digunakan getsdaripada fungsi?
Downgoat
1
@Downgoat jika saya getsjuga harus putsuntuk output, jadi tidak dalam kasus ini.
Nilai Tinta
4

Ruby: 100 byte

->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}
addison
sumber
Cobalah /[omen]/sebagai regex untuk menurunkannya - itu akan cocok dengan karakter apa pun dan lebih baik dalam penggunaan praktis daripada rantai |untuk karakter tunggal.
charredgrass
3

Javascript - 206 Bytes

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}
Christopher Burgdorff
sumber
1
Anda dapat mengubah kondisi ini: s[k]=='o'||s[k]=='m'||s[k]=='e'||s[k]=='n'agar terlihat seperti ini:"oman".split("").includes(s[k])
addison
1
Selamat datang di PPCG! Anda dapat menurunkan ini dengan menghapus spasi putih untuk menghemat byte. Selain itu, alih-alih (s[k]=='o'||s[k]=='m'||s[k]=='e'||s[k]=='n')Anda dapat menggunakan ('omen'.indexOf(s[k])+1)(dengan asumsi ini adalah JavaScript)
charredgrass
Terima kasih atas tipsnya! Menurunkannya menjadi 237, meskipun sepertinya kerumunan Ruby membuat saya berdetak.
Christopher Burgdorff
Hal kecil lainnya: Anda bisa menyingkatnya function luck(r)untuk r=>menjadikannya fungsi anonim, itu saja yang diperlukan untuk tantangan ini. Saya juga mengedit tantangan sehingga Anda tidak perlu khawatir tentang kasus sehingga Anda dapat menghapusr=r.toLowerCase();
charredgrass
Alih-alih substringAnda dapat menggunakan slicesaya percaya (coba ini, karena saya tidak yakin)
Downgoat
3

Ruby, 57 byte

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

getsset $.ke 1 sebagai efek samping, lalu kami tambahkan sampai ekspresi reguler yang cocok dengan $.karakter beruntung berturut - turut tidak lagi cocok.

histokrat
sumber
3

Haskell, 99

Pendekatan lain ... Saya baru belajar tentang fungsi alias

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

Pemakaian

f"lucky"
32

f"firetruck"
6

f"memes"
-7
Zylviij
sumber
2

Mathematica, 86 byte

Kode:

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

Penjelasan:

LongestCommonSubsequencemengembalikan substring bersebelahan terpanjang yang umum untuk input dan "lucky". StringLengthmemberikan panjangnya. StringCountmenghitung jumlah kemunculan karakter "omen"dalam input.


sumber
2

Python (139 Bytes)

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)
Jmilloy
sumber
Anda dapat menyimpan satu byte dengan menggunakanfrom intertools import*
wnnmaw
1

TSQL, 233 byte

Golf:

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

Tidak Disatukan:

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

Cobalah online

t-clausen.dk
sumber
1

Haskell ( 134 132 Bytes)

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

Bukan pegolf kode atau programmer Haskell, jadi akan sangat senang dengan beberapa tips yang satu ini.

(Contoh: g "firetruck")

ForemanBob
sumber
Saya juga bukan Haskell Expert, tetapi berhasil memahat beberapa bye dengan mengubah sedikit algoritme dan menggunakan alias fungsi pada fungsi yang digunakan kembali.
Zylviij
1

Python 3, 168 157 152 139 144 136 byte

EDIT: Hal-hal yang sangat jelas saya seharusnya melihat lebih mudah telah diubah, dan beberapa sedikit kurang jelas.

Sunting 2: stoopid (˚n˚). Program melempar kesalahan. Saya memperbaikinya. sebenarnya bukan 153 :(

Terima kasih kepada Leaky Nun karena telah menghemat 5 byte, dan untuk jmilloy karena telah menghemat 13 8 byte.

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

Program berjalan melalui semua substring yang mungkin ada dalam input (mungkin mungkin, karena ia menghitung substring yang tidak mungkin juga, 8 hingga 7, misalnya), memeriksa apakah substring berada dalam "beruntung", kemudian menetapkan eksponen 2 hingga panjang substring harus lebih besar dari nilai saat ini. Mungkin dapat ditingkatkan dengan hanya menggunakan satu loop sementara. Mungkin bisa menggunakan beberapa peningkatan; Saya masih memahami ini.

Lemon dirusak
sumber
while p+1menjadiwhile-~p
Leaky Nun
karena b=s[p:q], len(b)pasti q-pbenar?
Leaky Nun
Saya mencuri input dan metode cetak, tetapi sisanya sangat berbeda, terima kasih! Saya pikir jika Anda hanya melakukan print(2**m-2*sum(i in"omen" for i in s))untuk tiga baris terakhir Anda, Anda akan melakukan lebih baik, seperti 148?
jmilloy
Oh, dan Anda bisa memindahkan s [p: q] ke dalam klausa if while-~q:n=q-p;m=n if(s[p:q]in"lucky")*n>m else m;q-=1untuk 143?
jmilloy
sum(map(s.count,"omen"))menghemat satu byte, menjadikannya 135
Black Owl Kai
1

Program PHP, 139 135 108 byte

lompatan kuantum gagal untuk banyak substring di mana kejadian pertama lebih pendek. :(

sebenarnya saya bisa menyimpan 7 byte lagi di PHP <5.4 dengan register_globals aktif

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

pemakaian: php -d error_reporting=0 <filename> <string>

+5 untuk suatu fungsi:

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

tes (pada fungsi)

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>';
Titus
sumber
0

Scala, 155 byte

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
melach
sumber