Wprowadzenie
Okazuje się, że kosmici kochają memy tak samo jak my. Każda napotkana do tej pory rasa obcych ma swoją własną wersję 2spooky4me
(patrz poniższe pytanie ) i równoważną, z pewnymi zmianami. Mieszkańcy planety CUTE1f nie mogą poradzić sobie z dużą ilością strachów, więc ich ulubionym duchem jest 1spooky2me
, podczas gdy użytkownicy skeletor7 uwielbiają ich trochę, więc mają tendencję do używania 9spooky11me
.
Wyzwanie
Tłumaczenie memów jest ciężką pracą, więc powierzono ci zadanie napisania uniwersalnego tłumacza memów, aby pomóc tym facetom w prawidłowym dostępie do memenetu. Twój program zaakceptuje mema i transformację, które zostaną zastosowane do sekwencji cyfr w tym memie, aby były odpowiednie dla mieszkańców innej planety.
Wejście
Twój program otrzyma dwa ciągi wejściowe:
- Mem wejściowy (np
2spooky4me
.). Mecze [a-zA-Z0-9]+
.
- Transformacja do zastosowania do niej (np. Przejście
+1
od 2spooky4me
do 3spooky5me
). Zestawienia [+\-*/^]\d+
(trzeba przyjąć +
, -
, *
, /
, i ^
jako podmiotów, niezależnie od rodzimej reprezentacji w języku polskim).
Wynik
Twój program musi zwrócić ciąg znaków (wydrukowany na standardowe wyjście lub odpowiednik) z podaną transformacją zastosowaną do sekwencji cyfr w memie wejściowej. W dziwnym cyklu wydarzeń okazuje się również, że wszystkie napotkane dotąd rasy wolą memy integralne niż ułamkowe, więc te transformacje powinny wykonywać arytmetykę liczb całkowitych (np. 1spooky1me /2
Powinny skutkować 0spooky0me
).
Przykłady
Obowiązują standardowe operacje arytmetyczne:
Input: 2spooky4me +1
Output: 3spooky5me
Input: 2spooky4me -1
Output: 1spooky3me
Input: 2spooky4me *15
Output: 30spooky60me
Input: 10spooky900me /5
Output: 2spooky180me
Sekwencje cyfr są integralne; Obcinanie liczb całkowitych powinno wystąpić w takich przypadkach:
Input: idontunderstandmemes3 /2
Output: idontunderstandmemes1
Wpis może nie zawierać żadnych sekwencji cyfr:
Input: notreallyafunnymeme *100
Output: notreallyafunnymeme
Musisz obsługiwać potęgowanie, nawet jeśli nie jest to operacja natywna w wybranym języku:
Input: 2spooky4me ^3
Output: 8spooky64me
Długość łańcucha nie ma ograniczenia liczby sekwencji cyfr w ciągu:
Input: some1meme2sequences3can4be5really6long7 /2
Output: some0meme1sequences1can2be2really3long3
Uzupełnienie
Jeśli twój język obsługuje liczby całkowite o dowolnej precyzji jako funkcję języka, musisz ich użyć. Jeśli nie, nie trzeba obsługiwać liczb całkowitych o dowolnej dokładności. Na przykład musisz używać Integer
w języku Haskell zamiast, Int
ponieważ jest on dostępny jako część języka; w Java
nie jest wymagane używanie, BigInteger
ponieważ jest to funkcja biblioteki, a nie funkcja języka.
Input: 2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000spooky4me /2
Output: 1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000spooky2me
To jest golf golfowy , więc standardowe luki są zabronione, a najkrótsza odpowiedź w bajtach wygrywa!
Tabela liderów
Fragment kodu na dole tego postu generuje tabelę wyników na podstawie odpowiedzi a) jako lista najkrótszych rozwiązań dla każdego języka oraz b) jako ogólna tabela wyników.
Aby upewnić się, że twoja odpowiedź się pojawi, zacznij od nagłówka, korzystając z następującego szablonu Markdown:
## Language Name, N bytes
gdzie N
jest rozmiar twojego zgłoszenia. Jeśli poprawić swój wynik, to może zachować stare porachunki w nagłówku, uderzając je przez. Na przykład:
## Ruby, <s>104</s> <s>101</s> 96 bytes
Jeśli chcesz umieścić w nagłówku wiele liczb (np. Ponieważ twój wynik jest sumą dwóch plików lub chcesz osobno wymienić kary za flagi tłumacza), upewnij się, że rzeczywisty wynik jest ostatnią liczbą w nagłówku:
## Perl, 43 + 2 (-p flag) = 45 bytes
Możesz także ustawić nazwę języka jako link, który pojawi się we fragmencie:
## [><>](http://esolangs.org/wiki/Fish), 121 bytes
<style>body { text-align: left !important} #answer-list { padding: 10px; width: 290px; float: left; } #language-list { padding: 10px; width: 290px; float: left; } table thead { font-weight: bold; } table td { padding: 5px; }</style><script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <div id="language-list"> <h2>Shortest Solution by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr> </thead> <tbody id="languages"> </tbody> </table> </div> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr> </thead> <tbody id="answers"> </tbody> </table> </div> <table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr> </tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr> </tbody> </table><script>var QUESTION_ID = 79809; var ANSWER_FILTER = "!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe"; var COMMENT_FILTER = "!)Q2B_A2kjfAiU78X(md6BoYk"; var OVERRIDE_USER = 45941; var answers = [], answers_hash, answer_ids, answer_page = 1, more_answers = true, comment_page; function answersUrl(index) { return "https://api.stackexchange.com/2.2/questions/" + QUESTION_ID + "/answers?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + ANSWER_FILTER; } function commentUrl(index, answers) { return "https://api.stackexchange.com/2.2/answers/" + answers.join(';') + "/comments?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + COMMENT_FILTER; } function getAnswers() { jQuery.ajax({ url: answersUrl(answer_page++), method: "get", dataType: "jsonp", crossDomain: true, success: function (data) { answers.push.apply(answers, data.items); answers_hash = []; answer_ids = []; data.items.forEach(function(a) { a.comments = []; var id = +a.share_link.match(/\d+/); answer_ids.push(id); answers_hash[id] = a; }); if (!data.has_more) more_answers = false; comment_page = 1; getComments(); } }); } function getComments() { jQuery.ajax({ url: commentUrl(comment_page++, answer_ids), method: "get", dataType: "jsonp", crossDomain: true, success: function (data) { data.items.forEach(function(c) { if (c.owner.user_id === OVERRIDE_USER) answers_hash[c.post_id].comments.push(c); }); if (data.has_more) getComments(); else if (more_answers) getAnswers(); else process(); } }); } getAnswers(); var SCORE_REG = /<h\d>\s*([^\n,<]*(?:<(?:[^\n>]*>[^\n<]*<\/[^\n>]*>)[^\n,<]*)*),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/; var OVERRIDE_REG = /^Override\s*header:\s*/i; function getAuthorName(a) { return a.owner.display_name; } function process() { var valid = []; answers.forEach(function(a) { var body = a.body; a.comments.forEach(function(c) { if(OVERRIDE_REG.test(c.body)) body = '<h1>' + c.body.replace(OVERRIDE_REG, '') + '</h1>'; }); var match = body.match(SCORE_REG); if (match) valid.push({ user: getAuthorName(a), size: +match[2], language: match[1], link: a.share_link, }); else console.log(body); }); valid.sort(function (a, b) { var aB = a.size, bB = b.size; return aB - bB }); var languages = {}; var place = 1; var lastSize = null; var lastPlace = 1; valid.forEach(function (a) { if (a.size != lastSize) lastPlace = place; lastSize = a.size; ++place; var answer = jQuery("#answer-template").html(); answer = answer.replace("{{PLACE}}", lastPlace + ".") .replace("{{NAME}}", a.user) .replace("{{LANGUAGE}}", a.language) .replace("{{SIZE}}", a.size) .replace("{{LINK}}", a.link); answer = jQuery(answer); jQuery("#answers").append(answer); var lang = a.language; lang = jQuery('<a>'+lang+'</a>').text(); languages[lang] = languages[lang] || {lang: a.language, lang_raw: lang.toLowerCase(), user: a.user, size: a.size, link: a.link}; }); var langs = []; for (var lang in languages) if (languages.hasOwnProperty(lang)) langs.push(languages[lang]); langs.sort(function (a, b) { if (a.lang_raw > b.lang_raw) return 1; if (a.lang_raw < b.lang_raw) return -1; return 0; }); for (var i = 0; i < langs.length; ++i) { var language = jQuery("#language-template").html(); var lang = langs[i]; language = language.replace("{{LANGUAGE}}", lang.lang) .replace("{{NAME}}", lang.user) .replace("{{SIZE}}", lang.size) .replace("{{LINK}}", lang.link); language = jQuery(language); jQuery("#languages").append(language); } }</script>
BigInteger
do swoich obliczeń?Odpowiedzi:
Jolf,
1514 bajtówWypróbuj tutaj!
Wyjaśnienie
Warto zauważyć, że zaktualizowałem Jolfa po tym wyzwaniu, dodając kilka wbudowanych RegExp. Może to być
1211 bajtów:źródło
Rubinowy,
504443 bajtyOdpowiedź FGITW. Muszę iść szybko!
Dzięki @Neil za oszczędność 6 bajtów.
No tak, przekreślone 44 to wciąż 44
źródło
a=gets;$><<gets.gsub(/\d+/){eval$&+a}
. Mój jednak ominął rzecz ^! = ** i prawdopodobnie jest trochę dłuższy.^
. : DPerl,
3634 bajtówKod źródłowy ma 30 bajtów i wymaga przełączników
-pi
( +4 bajty ). Pobiera pierwsze dane wejściowe ze STDIN, a drugie dane wejściowe jako argument-i
.Dzięki @DenisIbaev za grę w golfa z 2 bajtów!
Przetestuj na Ideone .
źródło
-pi
ma 4 bajty?-pi
od reszty polecenia."0|$&"
jest krótszy niż"0|".$&
."0|$&$^I"
działa również. Dzięki!PowerShell v2 +,
139137 bajtówOoof ... 47 bajtów tylko do rozliczenia,
^
ponieważ nie jest to natywny operator w PowerShell. Zaoszczędź 2 bajty dzięki @TessellatingHeckler.Zajmuje wejście jak
$a=<word>
,$b=<operation>
jak.\universal-spooky-meme.ps1 2spooky4me ^3
. My-split
$a
na cyfrach, otaczając to w parens, więc zachowujemy ograniczniki i przepuszczamy wynikową tablicę przez pętlę|%{...}
. Jeśli bieżącym elementem jest liczba, jesteśmy na pierwszym miejscuif
. Musimy sprawdzić, czy pierwszym znakiem$b
jest^
. Jeśli nie, po prostu konkatenujemy nasz bieżący kawałek i$b
wysyłamy go doiex
(podobnego doeval
), a następnie zostawiamy w przygotowaniu. W przeciwnym razie musimy utworzyć ciąg wykładniczy za pomocą"$_*"*$b.Trim('^')+1
i potokować toiex
i pozostawić w potoku. Dla podanego2spooky4me ^3
przykładu, to będzie2*2*2*1
i4*4*4*1
, odpowiednio.W przeciwnym razie po prostu pozostawiamy ciąg w stanie, w jakim się znajduje.
Wszystkie te wyniki są gromadzone z potoku za pomocą enkapsulujących parens, zanim zostaną z
-join
powrotem połączone w jeden ciąg. To jest ponowne pozostawienie w potoku, a wynik jest domyślny po zakończeniu programu.Przykłady
źródło
Floor(("$_$b"|iex))
zFloor((iex $_$b))
zaoszczędzić kilka, a możeiex $_+$b
.JavaScript (ES7),
5857 bajtówEdycja: Zapisałem 1 bajt, gdy przypomniałem sobie, że
replace
działa również na ciągi literalne.źródło
Pyth, 29
Działa to poprzez wyodrębnienie każdej liczby z mema, a następnie przeplatanie (
.i
), a następnie spację i zawinięcie w listę z drugim argumentem. Więc jeśli nasz numer to7
i mieliśmy^20
chcemy uzyskać listę:["^", "7 ", "20"]
. Spłaszczanie i używanie w tym celu Pytheval
(.v
) zawsze daje pożądaną operację. Na koniec wartości te są przeplatane z oryginalnym podziałem łańcucha na wystąpienia liczb.Może to być bajt krótszy, jeśli oba dane wejściowe byłyby otoczone znakami cudzysłowu, lub dwa bajty krótsze, gdyby tylko jedno z nich mogło być cytowane.
Wypróbuj tutaj lub uruchom pakiet testowy
źródło
Python 2,
156898887 bajtówZainspirowany innymi odpowiedziami, które używają funkcji podstawiania swoich języków z funkcją obsługi funkcji do przetwarzania części liczbowych długiego
i
łańcucha nput za pomocąo
peratora. Pech dla Pythona,^
należy go zastąpić**
, co kosztuje aż 18 bajtów..group(0)
Wywołanie tylko na dostęp do obiektu mecz jest reprezentacja ciąg nie polepszył sprawy ...Dzięki QPaysTaxes za wykrycie fałszywej przestrzeni i RootTwo za niepotrzebny argument
.group
!źródło
i,o:
p.group()
. (domyślnie 0); i (2) wstawr=re.sub;
zastępuj pierwszere.sub
połączenie,r
a następnie użyjr('^','**',o)
zamiasto.replace(...)
r('^','**',o)
wtedy wymaga ucieczki^
do\^
w celu dopasowania do charakteru, a nie począteko
, nie oszczędzając netto bajty :-( - ale dzięki za wskazanie niepotrzebny0
!JavaScript (ES6) 99 bajtów
Kolejny przykład, dlaczego nie lubimy czekać, aż ES7 uzyska kompatybilność
Przykład możliwy do uruchomienia:
źródło
\d+|\D+
, co jest równoważne z.+
.[a-zA-Z0-9]+
czy chcesz wyrażenia regularne, nie? A[a-zA-Z]+|[0-9]+
jeśli podział ma znaczenie?Math.pow
bezpośrednio, ponieważ i tak musisz to zrobić w specjalnym przypadku. Czy używasz również podziału na liczby całkowite?\d+|\D+
nie to samo, co.+
. Nie są takie same, ponieważ rozszerzenie Kleene odbywa się przedor
. Byłoby tak samo, gdyby to wyglądało(\d|\D)+
, ale w rzeczywistości nie pasowałoby do wszystkich powiedzmy2a
w jednej grupie, byłyby to dwie oddzielne grupy.Julia,
715954 bajtówWymóg użycia,
big
jeśli jest dostępny, sprawia, że jest to znacznie dłużej niż mogłoby być ...Wypróbuj online!
źródło
Kotlin,
416413 bajtówBrak
eval()
w Kotlinie naprawdę podniósł liczbę bajtów ...Wypróbuj online!
Nie golfił
źródło
PowerShell (v4),
124120 bajtów(nowe linie są tutaj tylko po to, aby uniknąć przewijania w poziomie, działają, gdy są zapisane jako jedna linia).
Poproszono o komentarze i wersję bez golfa:
iex
jest jakeval()
w innych językach. Po prostu robi"2spooky" "+3"
->eval("2+3")
^
operatora ani żadnego innego wygodnego potęgowania, takiego jak**
, może używać tylko[math]::Pow()
wywołania biblioteki, więc jest duży blok do obsługi tej gałęzi."2*" * n
które staje się,"2*2*2*2*"
a następnie dodaje+1
na końcu do pomnożenia przez jeden zamiast narzekać na końcowe*
.[math]::Truncate()
. Zamiast tego zapisuję znaki, używając-replace
do przycięcia przecinka dziesiętnego i wszystkiego po nim.Przypadki testowe:
NB. W ostatnim teście liczby przelewają się
[BigInteger]
automatycznie na typ , ale są renderowane w notacji naukowej. Na szczęście każda znana rasa zdolna do komunikowania się między gwiazdami ma wystarczający rozwój naukowy, aby bez problemu przetwarzać notację naukową.źródło
Bash + GNU coreutils, 144 bajtów
To patrzy na zmianę między cyframi i cyframi, dlatego losowy nieprawidłowy znak wejściowy (przecinek) jest dodawany do ciągu wejściowego. Ten przecinek jest następnie ignorowany na wyjściu. Konwencja OP jest dokładnie zgodna ze składnią,
bc
której używa się tutaj do obliczeń matematycznych.źródło
Lua,
14593 bajtówźródło
R, 163 bajty
Dla kogoś, kto uczy się wyrażeń regularnych i podstawiania ciągów w języku R, było to dość trudne wyzwanie. Zwłaszcza, że dopasowanie liczb jest łatwe, ale nie mogłem znaleźć sposobu na użycie wielu podstawień
gsub
. Ponadto nie wiem, czyeval(parse(paste0(...
jest to najbardziej efektywny sposób przełączania się między operacjami. Może taswitch
funkcja lepiej tu pasuje.Wyjaśnienie
źródło
JavaScript (ES6), 85 bajtów
Nie golfowany:
źródło
()
wokół argumentu lambda, nie potrzebujeszvar
, i powinieneś używać parens i przecinka zamiast nawiasów klamrowych ireturn
^
jest to szczególny przypadek dla JavaScript, to jest nieco bitowy XOR zamiastMath.pow
Groovy,
6460 bajtówZastępuje wszystkie wystąpienia cyfr zamknięciem, które ocenia operację na części cyfr przekazywanego słowa. Jeśli przekaże funkcję wykładniczą, zastępuje ją odpowiednią notacją. Groovy niejawnie obsługuje konwersję BigInteger / BigDecimal podczas używania,
Eval.me()
ponieważ parsowane ciągi znaków mogą potencjalnie znajdować się poza2^32-1
zakresem.Wyjaśniono
{a,b->...}
- Zamknięcie z dwoma argumentami.a.replaceAll(/\d+/,{...})
- Wyszukaj wszystkie sekwencje cyfr w ciągu i zamień na zamknięcie.{Eval.me(it+b.replace("^","**"))}
- Mówiąc dokładniej, zamknięcie z każdym dopasowaniem z dołączoną operacją, a następnie ocenione jako kod groovy..replace("^","**")
- Zastąp pierwsze wystąpienie^
groovy wykładnikiem operatora**
w podanej operacji. Jeśli chcesz, aby działało to z ciągami pełnego równania, które używają wykładników wykładniczych, użyjreplaceAll()
zamiast tego kary minus 3 bajty.Zabawna uwaga: jego scenariusz jest prawidłowym testem:
(22348952345238905290858906209862398036spooky409552me, /200*4943^8-23939+((100/203)+600)
źródło
RProgN , 39 bajtów
Wyjaśniono
Technicznie nieprawidłowa odpowiedź, ponieważ ten język dla niego nie istniał. Jednak nie został specjalnie zaprojektowany do tego ani żadnego konkretnego dodatku. Więc to uruchamiam. Pozwać mnie.
Wypróbuj online!
źródło
Perl 6, 111 bajtów
Niestety
EVAL
jest domyślnie wyłączona. Musisz także użyćdiv
do podziału liczb całkowitych.źródło