Determina la "fortuna" di una stringa


35

Data una stringa, restituisce la "fortuna" di quella stringa.

La fortuna di una stringa, come ho completamente inventato ai fini di questa sfida, è un numero intero, determinato come segue:

  • La fortuna di base per una stringa è 1.
  • Per ogni lettera consecutiva che condivide con la parola "fortunato" (senza distinzione tra maiuscole e minuscole), moltiplica la fortuna per 2. Ad esempio, se la stringa fosse " lu mberjack" o "sma ck ", moltiplicheresti per 4. (Più specificamente, 2 ^ numero di caratteri consecutivi condivisi.)
    • Le lettere condivise devono essere nello stesso ordine consecutivo in "fortunato" ma possono iniziare ovunque nella parola per lo stesso valore ("luc" ha lo stesso moltiplicatore 8 * di "cky").
    • Se la parola ha più occorrenze in cui condivide caratteri consecutivi con lucky, usa la stringa consecutiva più lunga dei caratteri.
  • Per QUALUNQUE lettera condivisa con la parola "presagio" sottrarre 2 dalla fortuna.
    • Può abbinare un personaggio ogni volta, in qualsiasi ordine. Ad esempio la stringa "nnnnnomemenn" perde 24 fortuna (12 lettere corrispondenti)

Esempio:

luck("lucky")
>>32

2 ^ 5 (5 lettere consecutive) = 32

luck("firetruck")
>>6

2 ^ 3 - 2 (3 lettere consecutive da uck , e condivise con presagio)

luck("memes")
>>-7

1 - 8 (importo di base, 4 condivisi con "presagio")

Questo è il codice golf, quindi vince la risposta con il minor numero di byte.

Puoi inserire e produrre come preferisci: scrivi una funzione, usa l'input standard, ecc.

Per le funzioni, supponiamo che qualunque tipo di dati abbia senso per quella lingua. (Ad esempio, in JavaScript, verrai passato a Stringe restituito a Number)

Modifica: puoi presumere che qualsiasi input sia in minuscolo.


8
Bella prima sfida!
Alex A.

2
Il programma dovrebbe accettare input maiuscoli?
busukxuan,

2
@busukxuan Buona domanda - no, non è necessario accettare input maiuscoli.
charredgrass

@cat Non sono sicuro di aver capito bene cosa stai chiedendo. Ma puoi solo supporre che tutti gli input siano in minuscolo e non devi catturare alcun input in maiuscolo.
charredgrass,

1
Possiamo assumere un limite superiore o inferiore per la fortuna di un dato input? cioè qual è il numero più piccolo di bit / tipo di dati con cui riesco a cavarmela o è grande quanto la mia lingua è in grado di gestire? cioè, dovrebbe essereint8_t str_luck(const char* str); o dovrebbe essere uint64_t str_luck(const char* str);?
cat

Risposte:


7

05AB1E , 36 32 28 26 byte

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

Spiegazione

Œ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

Provalo online

Salvato 2 byte grazie ad Adnan


La compressione per 1 parola può anche essere eseguita con ', quindi per 26: Œv'¸éyåiyˆ}}¯é¤go¹'ƒÖ¦Ãg·-:).
Adnan,

@Adnan: strano. Ero certo di averlo provato. Apparentemente no. Grazie!
Emigna,

perché questa non è la risposta migliore?
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

Modifica: salvato 11 byte grazie a @Titus supponendo che la lettera Lnon compaia nell'input. 5 byte salvati grazie a @Oriol. Versione ES6 per 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>


Perché usi replace([^])invece di match([])? Sprechi 3 byte o c'è un motivo?
Tito

@Titus Quanti byte costa gestire un nullrisultato di partita?
Neil,

1
Quattro per una stringa e una coppia ()in questo caso; mangiando tutti e sei con i quali risparmieresti match(/[omen]/). Pietà.
Tito

1
@Titus Non sono sicuro se questo è ciò che intendevi, ma aggiungendo un Lalla fine del substr (che non apparirà mai nella stringa originale) non devo preoccuparmi di corrispondenze estranee e posso effettivamente usare lo stesso array [5,4,3,2,1,0]entrambe le volte, salvando un enorme 13 byte!
Neil,

1
-2*s.split(/[omen]/).length+2è più corto.
Oriol,

6

Pyth, 27 26 28 byte

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

1 byte salvato grazie all'OP :-)

Spiegazione:

                                 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

Provalo qui .


1
Non sono un esperto di Pyth ma credo che tu possa cambiare "omen"in giusto "omene
Pyth

@charredgrass Oops, il mio errore :-)
busukxuan

1
Non sembra funzionare con una stringa senza caratteri "fortunati". "meme" per esempio.
Emigna,

1
@Emigna Ah. il caso zero di nuovo .... Grazie, risolto!
Busukxuan,

6

Rubino, 91 87 byte

String#countL 'uso di Finnicky colpisce ancora! (Quando passa una stringa, conta tutte le occorrenze di ciascuna lettera nell'argomento della funzione anziché tutte le occorrenze dell'intera stringa.)

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

Una versione che prende le righe da STDIN e le stampa: 89 byte (86 +3 dalla -nbandiera)

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

1
._. che String#countè strano. +1 per (ab) utilizzarlo. Inoltre è più breve da usare getspiuttosto che una funzione?
Downgoat,

1
@Downgoat se dovessi getsanche putsper l'output, quindi non in questo caso.
Value Ink

4

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

Prova /[omen]/come regex per giocare a golf: si abbinerà a qualsiasi personaggio ed è meglio nell'uso pratico che concatenare |i singoli personaggi.
charredgrass,

3

Javascript - 206 byte

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
Potresti cambiare questa condizione: s[k]=='o'||s[k]=='m'||s[k]=='e'||s[k]=='n'per assomigliare a questo:"oman".split("").includes(s[k])
addison

1
Benvenuti in PPCG! Puoi golf giù rimuovendo gli spazi bianchi per conservare i byte. Inoltre, al posto di (s[k]=='o'||s[k]=='m'||s[k]=='e'||s[k]=='n')te potresti usare ('omen'.indexOf(s[k])+1)(supponendo che questo sia JavaScript)
charredgrass

Grazie per i suggerimenti! Sono arrivato al 237, anche se sembra che la folla di Ruby mi abbia battuto.
Christopher Burgdorff, l'

Un'altra piccola cosa: puoi abbreviare function luck(r)per r=>renderla solo una funzione anonima, questo è tutto ciò che è necessario per questa sfida. Inoltre ho apportato una modifica alla sfida in modo da non doversi preoccupare del caso in modo da poter rimuovere ilr=r.toLowerCase();
charredgrass

Invece di substringte posso usare slicecredo (prova questo, però, non sono sicuro)
Downgoat

3

Rubino, 57 byte

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

getsviene impostato $.su 1 come effetto collaterale, quindi lo incrementiamo fino a quando l'espressione regolare corrispondente a $.caratteri fortunati consecutivi non corrisponde più.


3

Haskell, 99

Un altro approccio ... Ho appena imparato a conoscere l'aliasing delle funzioni

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

uso

f"lucky"
32

f"firetruck"
6

f"memes"
-7

2

Mathematica, 86 byte

Codice:

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

Spiegazione:

LongestCommonSubsequencerestituisce la sottostringa contigua più lunga comune all'input e "lucky". StringLengthdà la sua lunghezza. StringCountconta il numero di occorrenze dei caratteri di "omen"nell'input.


2

Python (139 byte)

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)

Puoi salvare un byte usandofrom intertools import*
wnnmaw l'

1

TSQL, 233 byte

golfed:

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

Ungolfed:

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

Provalo online


1

Haskell ( 134 132 byte)

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

Non un giocatore di codice né un programmatore Haskell, quindi mi piacerebbe avere qualche consiglio su questo.

(Esempio: g "firetruck")


Non sono neanche un esperto di Haskell, ma sono riuscito a ritagliarmi alcuni byte modificando leggermente l'algoritmo e usando gli alias delle funzioni sulle funzioni riutilizzate.
Zylviij,

1

Python 3, 168 157 152 139 144 136 byte

EDIT: cose davvero ovvie che avrei dovuto vedere più facilmente sono state cambiate e alcune leggermente meno ovvie.

Modifica 2: stoopid (˚n˚). Il programma ha generato errori. L'ho sistemato. non in realtà 153 :(

Grazie a Leaky Nun per aver salvato 5 byte e jmilloy per aver salvato 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))

Il programma esegue tutte le sottostringhe possibili in input (possibilmente possibile, perché calcola anche sottostringhe impossibili, da 8 a 7, ad esempio), controlla se la sottostringa è in "fortunato", quindi imposta l'esponente di 2 alla lunghezza di la sottostringa dovrebbe essere maggiore del valore corrente. Forse potrebbe essere migliorato usando solo un ciclo while. Potrebbe forse usare qualche miglioramento; Lo sto ancora prendendo in giro.


while p+1diventawhile-~p
Leaky Nun l'

da allora b=s[p:q], len(b)deve essere q-pgiusto?
Leaky Nun,

Ti ho rubato il metodo di input e stampa, ma il resto è stato molto diverso, grazie! Penso che se lo fai solo print(2**m-2*sum(i in"omen" for i in s))per le tue ultime tre righe, farai meglio, come 148?
jmilloy,

Oh, e puoi semplicemente spostare s [p: q] nella clausola if while-~q:n=q-p;m=n if(s[p:q]in"lucky")*n>m else m;q-=1per 143?
jmilloy,

sum(map(s.count,"omen"))salva un byte, rendendolo 135
Black Owl Kai il

1

Programma PHP, 139 135 108 byte

il salto quantico fallisce per più sottostringhe in cui la prima occorrenza è più breve. :(

in realtà ho potuto salvare altri 7 byte in PHP <5.4 con register_globals attivo

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

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

+5 per una funzione:

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

test (sulla funzione)

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 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.