Universal Spooky Meme Translator


43

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:

  1. Mem wejściowy (np 2spooky4me.). Mecze [a-zA-Z0-9]+.
  2. Transformacja do zastosowania do niej (np. Przejście +1od 2spooky4medo 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 /2Powinny 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ć Integerw języku Haskell zamiast, Intponieważ jest on dostępny jako część języka; w Javanie jest wymagane używanie, BigIntegerponieważ jest to funkcja biblioteki, a nie funkcja języka.

Input:  2000000000000000000000000000000000000000000000000000000000000000000000000000000‌​000000000000000000000000000000000spooky4me /2
Output: 1000000000000000000000000000000000000000000000000000000000000000000000000000000‌​000000000000000000000000000000000spooky2me

To jest , 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 Njest 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


3
Twój ostatni przypadek testowy jest nieprawidłowy. Na wyjściu jest jeden z zbyt wielu zer, aby mogło to być / 5.
Nic Hartley,

5
Przede wszystkim jest to dość dobrze ułożony pierwszy post, więc gratulacje :) Uwaga: mamy piaskownicę, w której możesz opublikować swoje wyzwanie w celu uzyskania opinii, zanim zostanie opublikowane.
FryAmTheEggman

3
Witamy w PPCG (chociaż najwyraźniej jesteś tu od ponad 2 lat). Ładne pierwsze wyzwanie. Czy dodatek dotyczący liczb całkowitych o dowolnej precyzji wymaga , aby na przykład Java musiała używać BigIntegerdo swoich obliczeń?
AdmBorkBork

18
Każda rasa obcych, z jakimi się spotkaliśmy ... To całkowicie prawda! :-)
Luis Mendo,

2
To twoje wyzwanie i ostatecznie zależy od ciebie, ale to niesprawiedliwe wobec języków, które stosują inną składnię.
Dennis

Odpowiedzi:


10

Jolf, 15 14 bajtów

ρi«\d+»dC!6+HI

Wypróbuj tutaj!

Wyjaśnienie

ρi«\d+»dC!6+HI
ρ «\d+»         replace all digits
 i              in the input
       d        (functional replace)
         !6     eval (using jolf's custom infix eval)
           +H   the number as a string plus
             I  the second input
        C       floor the result (integer truncate)

Warto zauważyć, że zaktualizowałem Jolfa po tym wyzwaniu, dodając kilka wbudowanych RegExp. Może to być 12 11 bajtów:

ρiLRdC!6+HI

24

Rubinowy, 50 44 43 bajty

Odpowiedź FGITW. Muszę iść szybko!

Dzięki @Neil za oszczędność 6 bajtów.

No tak, przekreślone 44 to wciąż 44

->m,t{m.gsub(/\d+/){eval$&+t.sub(?^,'**')}}

Och, człowieku, to jest prawie dokładnie odpowiedzią ja grzebie dala pod adresem: a=gets;$><<gets.gsub(/\d+/){eval$&+a}. Mój jednak ominął rzecz ^! = ** i prawdopodobnie jest trochę dłuższy.
Nic Hartley,

3
+1 za to, że całe twoje rozwiązanie jest o 4 bajty krótsze niż to, co jest potrzebne w PowerShell tylko do obsługi ^. : D
AdmBorkBork

15

Perl, 36 34 bajtów

s/\d+/"0|$&$^I"=~s#\^#**#r/gee

Kod ź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 .


Tak, pomyślałem, że jeśli ktoś mógłby pokonać moją odpowiedź Ruby, byłby to Dennis i / lub Perl, a ty spełniłeś oba oczekiwania w tym samym czasie
Value Ink

1
-pima 4 bajty?
CalculatorFeline

@CatsAreFluffy Obecny konsensus polega na policzeniu odległości edycji od wywołania bez flag. Obejmuje to miejsce do oddzielenia -piod reszty polecenia.
Dennis

"0|$&"jest krótszy niż "0|".$&.
Denis Ibaev

@DenisIbaev Ponieważ dane wejściowe są alfanumeryczne, "0|$&$^I"działa również. Dzięki!
Dennis

9

PowerShell v2 +, 139 137 bajtów

param($a,$b)-join($a-split"(\d+)"|%{if($_-match"\d+"){if($b[0]-ne'^'){[math]::Floor((iex $_$b))}else{"$_*"*$b.Trim('^')+1|iex}}else{$_}})

Ooof ... 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 $ana 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 miejscu if. Musimy sprawdzić, czy pierwszym znakiem $bjest ^. Jeśli nie, po prostu konkatenujemy nasz bieżący kawałek i $bwysyłamy go do iex(podobnego do eval), a następnie zostawiamy w przygotowaniu. W przeciwnym razie musimy utworzyć ciąg wykładniczy za pomocą "$_*"*$b.Trim('^')+1i potokować to iexi pozostawić w potoku. Dla podanego 2spooky4me ^3przykładu, to będzie 2*2*2*1i 4*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 -joinpowrotem połączone w jeden ciąg. To jest ponowne pozostawienie w potoku, a wynik jest domyślny po zakończeniu programu.

Przykłady

PS C:\Tools\Scripts\golfing> .\universal-spooky-meme.ps1 2spooky4me ^5
32spooky1024me

PS C:\Tools\Scripts\golfing> .\universal-spooky-meme.ps1 2spooky4me /3
0spooky1me

Napisałem własny, zanim spojrzałem na odpowiedzi, a potem uszczypnąłem niektóre z twoich pomysłów - dzięki. Myślę, że można zastąpić Floor(("$_$b"|iex))z Floor((iex $_$b))zaoszczędzić kilka, a może iex $_+$b.
TessellatingHeckler

@TessellatingHeckler Dzięki za dwa bajty!
AdmBorkBork

8

JavaScript (ES7), 58 57 bajtów

(s,t)=>s.replace(/\d+/g,n=>0|eval(n+t.replace('^','**')))

Edycja: Zapisałem 1 bajt, gdy przypomniałem sobie, że replacedziała również na ciągi literalne.


Fajnie, pracuję nad rozwiązaniem ES6
Bálint

Czy możesz curry, aby zapisać bajt?
gcampbell

1
@gcampbell Tak, ale jestem zbyt leniwy, aby.
Neil,

6

Pyth, 29

Jws.i:zK"\d+"3m.vs.iJ]+d;:zK1

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 to 7i mieliśmy ^20chcemy uzyskać listę: ["^", "7 ", "20"]. Spłaszczanie i używanie w tym celu Pyth eval( .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


6

Python 2, 156 89 88 87 bajtów

Zainspirowany 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ą operatora. 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!

import re
lambda i,o:re.sub(r'\d+',lambda p:str(eval(p.group()+o.replace('^','**'))),i)

Myślę, że możesz pozbyć się przestrzeni późnieji,o:
Nic Hartley,

Możesz zapisać jeszcze dwa bajty: (1), używając p.group(). (domyślnie 0); i (2) wstaw r=re.sub;zastępuj pierwsze re.subpołączenie, ra następnie użyj r('^','**',o)zamiasto.replace(...)
RootTwo

@RootTwo: Dla mnie, r('^','**',o)wtedy wymaga ucieczki ^do \^w celu dopasowania do charakteru, a nie początek o, nie oszczędzając netto bajty :-( - ale dzięki za wskazanie niepotrzebny 0!
ojdo

5

JavaScript (ES6) 99 bajtów

Kolejny przykład, dlaczego nie lubimy czekać, aż ES7 uzyska kompatybilność

(a,b)=>a.match(/\d+|\D+/g).map(_=>(d=- -_)?eval(b[0]=="\^"?Math.pow(_,b.slice(1)):d+b)|0:_).join``

Przykład możliwy do uruchomienia:

f=(a,b)=>a.match(/\d+|\D+/g).map(_=>(d=- -_)?Math.ceil(eval(b[0]=="\^"?Math.pow(_,b.slice(1)):d+b)):_).join``

alert(f(prompt("Enter string!"), prompt("Enter operation!")));


Twoje pasujące wyrażenia regularne wydają się być trochę wyłączone. W uruchamialnym przykładzie pomijasz wielkie litery, które usuwają je z wyniku („2spooky4ME”, „+1” => „3spooky5”), aw pierwszym przykładzie dopasowujesz do \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?
Itai Ferber

Prawdopodobnie łatwiej byłoby wywoływać Math.powbezpośrednio, ponieważ i tak musisz to zrobić w specjalnym przypadku. Czy używasz również podziału na liczby całkowite?
Neil

@Neil Zapomniałem tego, minuta
Bálint

@ Neil jest lepszy sposób na sufit?
Bálint

1
@ItaiFerber to \d+|\D+nie to samo, co .+. Nie są takie same, ponieważ rozszerzenie Kleene odbywa się przed or. Byłoby tak samo, gdyby to wyglądało (\d|\D)+, ale w rzeczywistości nie pasowałoby do wszystkich powiedzmy 2aw jednej grupie, byłyby to dwie oddzielne grupy.
FryAmTheEggman

5

Julia, 71 59 54 bajtów

/ 
x%y=replace(x,r"\d+",t->"big($t)"y|>parse|>eval)

Wymóg użycia, bigjeśli jest dostępny, sprawia, że ​​jest to znacznie dłużej niż mogłoby być ...

Wypróbuj online!


4

Kotlin, 416 413 bajtów

Brak eval()w Kotlinie naprawdę podniósł liczbę bajtów ...

fun main(a:Array<String>){var r=Regex("\\d+");var i=a[0];var n=a[1].takeLast(a[1].length-1).toInt();when(a[1][0]){'+'->print(r.replace(i,{m->""+(m.value.toInt()+n)}));'*'->print(r.replace(i,{m->""+(m.value.toInt()*n)}));'/'->print(r.replace(i,{m->""+(m.value.toInt()/n)}));'-'->print(r.replace(i,{m->""+(m.value.toInt()-n)}));'^'->print(r.replace(i,{m->""+(Math.pow(m.value.toDouble(),n.toDouble())).toInt()}));}}

Wypróbuj online!

Nie golfił

fun main(a: Array<String>) {
    var r = Regex("""\d+""")
    var i = a[0]
    var n = a[1].takeLast(a[1].length - 1).toInt()
    when (a[1][0]) {
        '+' -> print(r.replace(i, { m -> "" + (m.value.toInt() + n) }))
        '*' -> print(r.replace(i, { m -> "" + (m.value.toInt() * n) }))
        '/' -> print(r.replace(i, { m -> "" + (m.value.toInt() / n) }))
        '-' -> print(r.replace(i, { m -> "" + (m.value.toInt() - n) }))
        '^' -> print(r.replace(i, { m -> "" + (Math.pow(m.value.toDouble(), n.toDouble())).toInt() }))
    }
}

4

PowerShell (v4), 124 120 bajtów

# New 120 byte version:
$s,$a=$args;[regex]::Replace($s,'\d+',{($(if($a-ne($a=$a.Trim('^'))){
"$args*"*$a+1}else{"$args$a"})|iex)-replace'\..*'})

# Previous 124 byte version
$s,$a=$args;[regex]::Replace($s,'\d+',{if($a[0]-eq'^'){
[math]::pow("$args",$a.Trim('^'))}else{iex "$args$a-replace'\..*'"}})

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

$meme, $instruction = $args

# Scriptblock which processes the numbers
# to be replaced. $args is the input number.
$replacement = {

    # Generates a string of the calculation, by:
    # Removing leading ^ character, if present.
    # ^3 -> 3,      +3 -> +3
    # See if it was present, and switch code paths.
    # (Can be one combined step in the golf)
    # Switch code paths for "raise to the power of",
    # or basic arithmetic.
    $trimmedInstruction = $instruction.Trim('^')
    $tmp = if ( $instruction -ne $trimmedInstruction ) {

        # String multiplication, changes
        # function input "45" and instruction "3" into
        # "45*45*45*+1". The "3" implicitly casts to [int]
        # the +1 is there to make the trailing * not crash.
        "$args*" * $instruction + 1

    } else {
        # Cobble the basic math together as a string
        # "45" and "+10" becomes
        # "45+10"
        "$args$instruction"
    }

    # eval() the generated string (e.g. "45+10" or "45*45*45*+1")
    $tmp = Invoke-Expression $tmp      # iex

    # Use a regex golf to replace trailing .23423
    # decimals in case of division with remainder.
    # Acts as [math]::floor(), harmless on other numbers.
    $tmp -replace'\..*'
}

# A regular expression replacement which picks out all 
# the numbers (\d+) and runs them through the
# replacement function. Returns a string which 
# ends up on stdout
[regex]::Replace($meme, '\d+', $replacement)
  • Biblioteka regex .Net może zastąpić blokiem skryptowym, który wykonuje się na treści dopasowania, a PowerShell rzutuje typy ciągów na liczby i iexjest jak eval()w innych językach. Po prostu robi "2spooky" "+3"->eval("2+3")
  • Z wyjątkiem ... nie może obsłużyć ^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.
    • Zaktualizowana wersja kradnie pomysł z @TimmyD i zamiast tego robi mnożenie ciągów - "2*" * nktóre staje się, "2*2*2*2*"a następnie dodaje +1na końcu do pomnożenia przez jeden zamiast narzekać na końcowe *.
  • Z wyjątkiem ... .Net wykonuje zaokrąglanie bankiera, które domyślnie zaokrągla do najbliższej liczby parzystej i 3/2 = 2 zamiast 3/2 = 1. To wyzwanie wymaga skrócenia, a to oznacza [math]::Truncate(). Zamiast tego zapisuję znaki, używając -replacedo przycięcia przecinka dziesiętnego i wszystkiego po nim.

Przypadki testowe:

PS D:\> .\meme.ps1 2spooky4me +1
3spooky5me

PS D:\> .\meme.ps1 2spooky4me -1
1spooky3me

PS D:\> .\meme.ps1 2spooky4me *15
30spooky60me

PS D:\> .\meme.ps1 10spooky900me /5
2spooky180me

PS D:\> .\meme.ps1 idontunderstandememes3 /2
idontunderstandememes1

PS D:\> .\meme.ps1 "idontunderstandememes3" "/2"
idontunderstandememes1

PS D:\> .\meme.ps1 "notreallyafunnymeme" "*100"
notreallyafunnymeme

PS D:\> .\meme.ps1 "2spooky4me" "^3"
8spooky64me

PS D:\> .\meme.ps1 "some1meme2sequences3can4be5really6long7" "/2"
some0meme1sequences1can2be2really3long3

PS D:\> .\meme.ps1 2000000000000000000000000000000000000000000000000000000000000000000000000000000‌​000000000000000000000000000000000spooky4me /2
1E+78‌​0spooky2me

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ą.


1
W innych odpowiedziach można zobaczyć, w jaki sposób zapewniają one raczej nieczytelną wersję gry w golfa, a następnie osobną wersję bez golfa do sprawdzania zachowania kodu. Powinieneś to zrobić ze swoim (czyli usunąć nowe wiersze w wersji golfowej).
jpmc26

Dzięki za kredyt, ale nie moja sztuczka - wyciągnąłem go z wątku Porady PowerShell.
AdmBorkBork

Najwyraźniej zależy mi na tym, aby zostawić komentarz, a komuś innemu zależy na głosowaniu w moim komentarzu. ;)
jpmc26

Nie, powiedziałem, że powinieneś mieć wersję w pełni golfową i wersję całkowicie nie golfową. Ten w golfa będzie wymagał przewijania. Niegolfowany nie będzie i będzie bardziej czytelny niż ten, który masz.
jpmc26

1
@ jpmc26 Ok, edytowałem w nieposkromionej, skomentowanej wersji.
TessellatingHeckler

3

Bash + GNU coreutils, 144 bajtów

d=
u=$1,
for((i=0;i<${#u};i++)){ l=${u:i:1}
[[ "$l" =~ [0-9] ]]&&d=$d$l||{ [ -z $d ]||echo -n `bc<<<$d$2`&&{ [ $l != , ]&&echo -n $l; };d=; }
}

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ą, bcktórej używa się tutaj do obliczeń matematycznych.


Nawiasem mówiąc, z powodu dyskusji w rozwiązaniu PowerShell autorstwa @TessellatingHeckler: W moim rozwiązaniu możesz przetłumaczyć program na pojedynczy wiersz, zastępując podziały wiersza średnikami, co nie zmienia jego długości.
rexkogitans

3

Lua, 145 93 bajtów

r=io.read;m=r()o=r()m=m:gsub("%d",function(n)return loadstring("return..."..o)(n)end)print(m)

Dlaczego nie opublikować funkcji?
Bálint

2

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, czy eval(parse(paste0(...jest to najbardziej efektywny sposób przełączania się między operacjami. Może ta switchfunkcja lepiej tu pasuje.

function(s,o){p=strsplit;y=p(gsub("\\d+","?",s),"?")[[1]];x=na.omit(as.integer(p(s,"[a-zA-Z]+")[[1]]));y[y=="?"]=floor(eval(parse(,,paste0("x",o))));cat(y,sep="")}

Wyjaśnienie

f=function(s,o){
    p=strsplit                                    # alias for stringsplit    
    y=p(gsub("\\d+","?",s),"?")[[1]]              # substitute numbers with "?" and split into vector on "?"
    x=na.omit(as.integer(p(s,"[a-zA-Z]+")[[1]]))  # split at alphabetical char, return vector with numbers to be operated on
    y[y=="?"]=floor(eval(parse(,,paste0("x",o)))) # replace inserted "?" with vector of numbers operated on
    cat(y,sep="")                                 # print concatenated vector
}

Myślę, że możesz zaoszczędzić mnóstwo bajtów, jeśli używasz gsub z zamknięciem meczów, o czym wspomniałeś w swoim komentarzu. Nie wiem jednak, jak to zrobić w R. Walczyłem z tym też, dopóki nie dowiedziałem się, jak to zrobić w Groovy; był prawie zmieniaczem gier.
Magic Octopus Urn

2

JavaScript (ES6), 85 bajtów

x=(s)=>{var a=s.split(" ");return[...a[0]].map(x=>(!isNaN(x))?eval(x+a[1]):x).join``}

console.log(x("2spookie5me +1"));

Nie golfowany:

x = (s) => {
  var a = s.split(" ");
  return [...a[0]].map(x => (!isNaN(x)) ? eval(x + a[1]) : x).join ``
}
console.log(x("2spookie5me +1"));

Czy ktoś wie, czy mogę dzielić spacje za pomocą operatora Spread? Z tego s.split („”); do [„” ... s]; Taki jest przynajmniej pomysł.
Bladimir Ruiz

Nie potrzebujesz ()wokół argumentu lambda, nie potrzebujesz var, i powinieneś używać parens i przecinka zamiast nawiasów klamrowych ireturn
Cyoce

Ponadto ^jest to szczególny przypadek dla JavaScript, to jest nieco bitowy XOR zamiastMath.pow
Sunny Pun

2

Groovy, 64 60 bajtów

{a,b->a.replaceAll(/\d+/,{Eval.me(it+b.replace("^","**"))})}

Zastę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ę poza 2^32-1zakresem.

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żyj replaceAll()zamiast tego kary minus 3 bajty.

Zabawna uwaga: jego scenariusz jest prawidłowym testem:
(22348952345238905290858906209862398036spooky409552me, /200*4943^8-23939+((100/203)+600)


1

RProgN , 39 bajtów

►x='%d+'§x'%D+'''Rx'%d+'''Rg'y'=y_}R

Wyjaśniono

►x='%d+'§x'%D+'''Rx'%d+'''Rg'y'=y_}R
►                                       # Spaceless segment.
 x=                                     # Assign the top value of the stack '[+*/-]\d+' 
   '$d+'§                         }R     # Replace everything in the pattern %d+ (all numbers) based on an anonymous function 
         x'%D+'''R                      # Replace all Non-digits in the modifer with nothing, leaving just the second argument for the operator.
                  x'%d+'''R             # Snip all digits, separating our operator from our digits such that digit operator exists in the stack.
                           g'y'=        # Grab the function that is represented by the top of the stack (the operator in this case)
                                y       # Run it
                                 _      # Floor the result. 

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!


0

Perl 6, 111 bajtów

{/(\w+)\s(<[+\-*/^]>)(\d+)/&&my \b=+$2;my \o=(*+b,*-b,* *b,*div b,* **b)[index "+-*/^",$1];$0.subst(/\d+/,o):g}

Niestety EVALjest domyślnie wyłączona. Musisz także użyć divdo podziału liczb całkowitych.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.