Podany ciąg zwraca „szczęście” tego ciągu.
Szczęście sznurka, które właśnie nadrobiłem na potrzeby tego wyzwania, jest liczbą całkowitą, określoną w ten sposób:
- Podstawowym szczęściem dla sznurka jest 1.
- Dla każdej kolejnej litery, którą dzieli ze słowem „szczęśliwy” (bez względu na wielkość liter), pomnóż szczęście przez 2. Na przykład, jeśli ciąg znaków to „ lu mberjack” lub „sma ck ”, pomnożysz przez 4. (Dokładniej, 2 ^ liczba udostępnionych kolejnych znaków.)
- Litery współdzielone muszą być w tej samej kolejności, w jakiej występują w „szczęśliwym”, ale mogą zaczynać się w dowolnym miejscu tego słowa dla tej samej wartości („luc” ma ten sam 8 * mnożnik jak „cky”).
- Jeśli słowo ma wiele wystąpień, w których dzieli kolejne znaki ze szczęśliwymi, użyj najdłuższego ciągu kolejnych znaków.
- W przypadku KAŻDEJ litery, którą dzieli ze słowem „omen”, odejmij 2 od szczęścia.
- Może pasować do postaci dowolną ilość razy, w dowolnej kolejności. Na przykład ciąg „nnnnnomemenn” traci 24 szczęścia (12 pasujących liter)
Przykład:
luck("lucky")
>>32
2 ^ 5 (5 kolejnych liter) = 32
luck("firetruck")
>>6
2 ^ 3 - 2 (3 kolejne litery od uck , e wspólne z omen)
luck("memes")
>>-7
1–8 (kwota podstawowa, 4 wspólne z „omen”)
To jest golf golfowy, więc wygrywa odpowiedź z najmniejszą liczbą bajtów.
Możesz wprowadzać i wyprowadzać w dowolny sposób - napisz funkcję, użyj standardowego wejścia itp.
W przypadku funkcji załóż, że dowolny typ danych ma sens dla tego języka. (Na przykład w JavaScript zostaniesz przekazany a String
i zwrócisz a Number
)
Edycja: Możesz założyć, że każde wejście jest pisane małymi literami.
int8_t str_luck(const char* str);
czy powinno być, czy powinno byćuint64_t str_luck(const char* str);
?Odpowiedzi:
05AB1E ,
36322826 bajtówWyjaśnienie
Wypróbuj online
Zaoszczędzono 2 bajty dzięki Adnan
źródło
'
, więc dla 26:Œv'¸éyåiyˆ}}¯é¤go¹'ƒÖ¦Ãg·-
:).JavaScript (ES7),
123112107 bajtówEdycja: Zapisano 11 bajtów dzięki @Titus, zakładając, że litera
L
nie pojawia się na wejściu. Zaoszczędź 5 bajtów dzięki @Oriol. Wersja ES6 dla125114109 bajtów:źródło
replace([^])
zamiastmatch([])
? Czy marnujesz 3 bajty, czy jest jakiś powód?null
wynikiem dopasowania?()
w tym przypadku; zjadając wszystkie sześć, za które można by oszczędzićmatch(/[omen]/)
. Szkoda.L
do końca substr (który nigdy nie pojawi się w oryginalnym ciągu), nie muszę się martwić obcymi dopasowaniami i mogę używać tej samej tablicy za[5,4,3,2,1,0]
każdym razem, oszczędzając aż 13 bajtów!-2*s.split(/[omen]/).length+2
jest krótszy.Pyth,
272628 bajtów1 bajt zapisany dzięki OP :-)
Wyjaśnienie:
Sprawdź to tutaj .
źródło
"omen"
na sprawiedliwy"omen
i Pyth zrozumieRuby,
9187 bajtówString#count
drobne użycie znów uderza! (Po przekazaniu ciągu liczy wszystkie wystąpienia każdej litery w argumencie funkcji zamiast wszystkich wystąpień całego ciągu.)Wypróbuj online
Wersja, która pobiera wiersze ze STDIN i drukuje je: 89 bajtów (86 +3 z
-n
flagi)źródło
String#count
to dziwne. +1 za (ab) korzystanie z niego. Czy jest też krótszy w użyciugets
niż funkcja?gets
też muszęputs
dla danych wyjściowych, więc nie w tym przypadku.Ruby: 100 bajtów
źródło
/[omen]/
użyć wyrażenia regularnego, aby zagrać w golfa - będzie pasować do dowolnej postaci i jest lepszy w praktycznym użyciu niż łączenie łańcuchów|
pojedynczych postaci.JavaScript - 206 bajtów
źródło
s[k]=='o'||s[k]=='m'||s[k]=='e'||s[k]=='n'
aby wyglądać tak:"oman".split("").includes(s[k])
(s[k]=='o'||s[k]=='m'||s[k]=='e'||s[k]=='n')
możesz użyć('omen'.indexOf(s[k])+1)
(zakładając, że jest to JavaScript)function luck(r)
, abyr=>
uczynić ją anonimową funkcją, to wszystko, co jest potrzebne do tego wyzwania.r=r.toLowerCase();
substring
możesz używać,slice
wierzę (przetestuj to, bo nie jestem pewien)Rubinowy, 57 bajtów
gets
ustawia się$.
na 1 jako efekt uboczny, a następnie zwiększamy go, aż wyrażenie regularne pasujące do$.
kolejnych szczęśliwych znaków nie będzie już pasować.źródło
Haskell, 99
Inne podejście ... Właśnie dowiedziałem się o aliasingu funkcji
Stosowanie
źródło
Mathematica, 86 bajtów
Kod:
Wyjaśnienie:
LongestCommonSubsequence
zwraca najdłuższy ciągły podciąg wspólny dla danych wejściowych i"lucky"
.StringLength
podaje swoją długość.StringCount
zlicza liczbę wystąpień znaków"omen"
na wejściu.źródło
Python (139 bajtów)
źródło
from intertools import*
TSQL, 233 bajty
Gra w golfa:
Nie golfowany:
Wypróbuj online
źródło
Haskell (
134132 bajtów)Ani golfista, ani programista Haskell, więc chętnie napiszę kilka wskazówek na ten temat.
(Przykład:
g "firetruck"
)źródło
Python 3,
168157152139144136 bajtówEDYCJA: Naprawdę oczywiste rzeczy, które powinienem widzieć łatwiej, zostały zmienione, a niektóre nieco mniej oczywiste.
Edycja 2: stoopid (˚n˚). Program rzucał błędy. Naprawiłem to. właściwie nie 153 :(
Dzięki Leaky Nun za uratowanie 5 bajtów i jmilloy za uratowanie
138 bajtów.Program przechodzi przez wszystkie możliwe podciągi wejściowe (możliwe, ponieważ oblicza również podciągi niemożliwe, na przykład od 8 do 7), sprawdza, czy podłańcuch jest „szczęśliwy”, a następnie ustawia wykładnik 2 na długość podłańcuch powinien być większy niż bieżąca wartość. Ewentualnie można to poprawić, używając tylko jednej pętli while. Przydałaby się poprawa; Nadal się rozumiem.
źródło
while p+1
staje sięwhile-~p
b=s[p:q]
,len(b)
musi byćq-p
prawda?print(2**m-2*sum(i in"omen" for i in s))
dla ostatnich trzech linii, zrobisz to lepiej, na przykład 148?while-~q:n=q-p;m=n if(s[p:q]in"lucky")*n>m else m;q-=1
dla 143?sum(map(s.count,"omen"))
oszczędza jeden bajt, dzięki czemu jest 135Program PHP,
139135108bajtówskok kwantowy kończy się niepowodzeniem w przypadku wielu podciągów, w których pierwsze wystąpienie jest krótsze. :(
właściwie mógłbym zapisać kolejne 7 bajtów w PHP <5.4 z włączonym register_globals
stosowanie:
php -d error_reporting=0 <filename> <string>
+5 dla funkcji:
testy (na funkcji)
źródło
C # (interaktywny kompilator Visual C #) z flagą
/u:System.Text.RegularExpressions.Regex
, 99 bajtówWypróbuj online!
źródło
Scala, 155 bajtów
źródło