Universal Spooky Meme Übersetzer

43

Einführung

Es stellt sich heraus, dass Aliens Meme genauso lieben wie wir. Jede fremde Rasse, der wir bisher begegnet sind, hat eine eigene Version von 2spooky4me(siehe folgende Frage ) und eine entsprechende Version , allerdings mit einigen Abweichungen. Die Bewohner des Planeten CUTE1f können nicht viel mit Spuk umgehen, so dass ihr bevorzugter Spuk ist 1spooky2me, während skeletor7 Mitglieder sie als Spuk lieben, so dass sie dazu neigen, Spuk zu benutzen 9spooky11me.

Herausforderung

Das Übersetzen von Memes ist harte Arbeit. Sie haben also die Aufgabe, einen universellen Meme-Übersetzer zu schreiben, der diesen Leuten hilft, richtig auf das Memenet zuzugreifen. Ihr Programm akzeptiert ein Mem und eine Transformation, die auf die Ziffernfolgen in diesem Mem angewendet werden, damit es für die Bewohner eines anderen Planeten geeignet ist.

Eingang

Ihr Programm erhält zwei Texteingaben:

  1. Das Eingabe-Meme (zB 2spooky4me). Streichhölzer [a-zA-Z0-9]+.
  2. Die Transformation, die darauf angewendet werden soll (z. B. +1von 2spooky4menach 3spooky5me). Spiele [+\-*/^]\d+(Sie müssen akzeptieren +, -, *, /, und ^als Betreiber, unabhängig von der nativen Darstellung in Ihrer Sprache).

Ausgabe

Ihr Programm muss eine Zeichenfolgenausgabe (gedruckt als Standardausgabe oder gleichwertig) mit der angegebenen Transformation zurückgeben, die auf die Ziffernfolgen im Eingabemem angewendet wird. In einer seltsamen Wendung der Ereignisse stellt sich auch heraus, dass alle bisher angetroffenen Rassen ganzzahlige Meme gegenüber fraktionierten vorziehen, sodass diese Transformationen eine Ganzzahlarithmetik durchführen sollten (z. B. ergeben 1spooky1me /2sollten 0spooky0me).

Beispiele

Es gelten die üblichen Rechenoperationen:

Input:  2spooky4me +1
Output: 3spooky5me

Input:  2spooky4me -1
Output: 1spooky3me

Input:  2spooky4me *15
Output: 30spooky60me

Input:  10spooky900me /5
Output: 2spooky180me

Ziffernfolgen sind ganzzahlig; Integer-Trunkierung sollte in folgenden Fällen auftreten:

Input:  idontunderstandmemes3 /2
Output: idontunderstandmemes1

Ihre Eingabe darf keine Ziffernfolgen enthalten:

Input:  notreallyafunnymeme *100
Output: notreallyafunnymeme

Sie müssen die Potenzierung unterstützen, auch wenn es sich nicht um eine native Operation in der Sprache Ihrer Wahl handelt:

Input:  2spooky4me ^3
Output: 8spooky64me

Es gibt keine Begrenzung für die Länge der Zeichenfolge für die Anzahl der Ziffernfolgen in der Zeichenfolge:

Input:  some1meme2sequences3can4be5really6long7 /2
Output: some0meme1sequences1can2be2really3long3

Nachtrag

Wenn Ihre Sprache Ganzzahlen mit beliebiger Genauigkeit als Sprachfunktion unterstützt, müssen Sie diese verwenden. Wenn dies nicht der Fall ist, müssen Sie keine Ganzzahlen mit beliebiger Genauigkeit unterstützen. Beispielsweise müssen Sie Integerin Haskell verwenden, anstatt, Intweil es als Teil der Sprache verfügbar ist. In Javamüssen Sie nicht verwenden, BigIntegerda es sich um eine Bibliotheksfunktion und nicht um eine Sprachfunktion handelt.

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

Das ist , also sind Standard-Schlupflöcher verboten und die kürzeste Antwort in Bytes gewinnt!

Bestenliste

Das Stapel-Snippet am Ende dieses Beitrags generiert die Rangliste aus den Antworten a) als Liste der kürzesten Lösungen pro Sprache und b) als Gesamtrangliste.

Um sicherzustellen, dass Ihre Antwort angezeigt wird, beginnen Sie Ihre Antwort mit einer Überschrift. Verwenden Sie dazu die folgende Markdown-Vorlage:

## Language Name, N bytes

Wo Nist die Größe Ihres Beitrags? Wenn Sie Ihren Score zu verbessern, Sie können alte Rechnungen in der Überschrift halten, indem man sich durch das Anschlagen. Zum Beispiel:

## Ruby, <s>104</s> <s>101</s> 96 bytes

Wenn Sie mehrere Nummern in Ihrem Header enthalten sein sollen (zB weil Ihre Punktzahl ist die Summe von zwei Dateien oder Sie wollen Liste Dolmetscher Flagge Strafen separat), stellen Sie sicher , dass die tatsächliche Punktzahl der ist letzte Nummer in der Kopfzeile:

## Perl, 43 + 2 (-p flag) = 45 bytes

Sie können den Namen der Sprache auch als Link festlegen, der dann im Snippet angezeigt wird:

## [><>](http://esolangs.org/wiki/Fish), 121 bytes

Itai Ferber
quelle
3
Ihr letzter Testfall ist falsch. Sie haben eine zu viele Nullen in der Ausgabe, um / 5 zu sein.
Nic Hartley
5
Zuallererst ist dies ein einigermaßen gut zusammengestellter erster Beitrag, also herzlichen Glückwunsch :) Hinweis: Wir haben eine Sandbox, in der Sie Ihre Herausforderung für Feedback veröffentlichen können, bevor sie live geht.
FryAmTheEggman
3
Willkommen bei PPCG (obwohl Sie anscheinend seit mehr als zwei Jahren hier sind). Schöne erste Herausforderung. Ist der Zusatz zu beliebiger Genauigkeit Integer Mandat , dass zum Beispiel Java muß verwenden BigIntegerfür ihre Berechnungen?
AdmBorkBork
18
Jedes Alienrennen, dem wir bisher begegnet sind ... Das ist absolut wahr! :-)
Luis Mendo
2
Es ist Ihre Herausforderung und letztendlich Ihre Aufgabe, aber das ist nicht wirklich fair gegenüber Sprachen, die eine andere Syntax verwenden.
Dennis

Antworten:

10

Jolf, 15 14 Bytes

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

Probieren Sie es hier aus!

Erläuterung

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

Es macht Spaß zu bemerken, dass ich Jolf nach dieser Herausforderung aktualisiert und einige RegExp-Buildins hinzugefügt habe. Dies können 12 bis 11 Bytes sein:

ρiLRdC!6+HI
Conor O'Brien
quelle
24

Ruby, 50 44 43 Bytes

Antwort von FGITW. Muss schnell los!

Vielen Dank an @Neil für das Speichern von 6 Bytes.

Ach ja, durchgestrichen 44 ist immer noch 44

->m,t{m.gsub(/\d+/){eval$&+t.sub(?^,'**')}}
Wert Tinte
quelle
Oh, Mann, das ist fast genau eine Antwort , die ich war Stossen weg an: a=gets;$><<gets.gsub(/\d+/){eval$&+a}. Meins hat die Sache mit ^! = ** jedoch verpasst und ist wahrscheinlich etwas länger.
Nic Hartley
3
+1, wenn Ihre gesamte Lösung 4 Byte kürzer ist als in PowerShell, nur um damit fertig zu werden ^. : D
AdmBorkBork
15

Perl, 36 34 Bytes

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

Der Quellcode ist 30 Bytes lang und benötigt die Schalter -pi( +4 Bytes ). Es nimmt die erste Eingabe von STDIN, die zweite Eingabe als Argument an -i.

Vielen Dank an @DenisIbaev für das Golfen mit 2 Bytes!

Teste es auf Ideone .

Dennis
quelle
Ja, ich dachte mir, wenn irgendjemand meine Ruby-Antwort schlagen könnte, wäre es Dennis und / oder Perl, und Sie erfüllten beide Erwartungen gleichzeitig
Value Ink
1
-piist 4 Bytes?
CalculatorFeline
@CatsAreFluffy Derzeit besteht Konsens darin, die Bearbeitungsentfernung vom Aufruf ohne die Flags zu zählen. Dazu gehört ein Leerzeichen, um sich -pivom Rest des Befehls zu trennen .
Dennis
"0|$&"ist kürzer als "0|".$&.
Denis Ibaev
@DenisIbaev Da die Eingabe alphanumerisch ist, "0|$&$^I"funktioniert das auch. Vielen Dank!
Dennis
9

PowerShell v2 +, 139 137 Bytes

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 Byte, nur um das zu berücksichtigen, ^da dies kein nativer Operator in PowerShell ist. 2 Bytes gespart dank @TessellatingHeckler.

Nimmt die Eingabe wie $a=<word>, $b=<operation>wie .\universal-spooky-meme.ps1 2spooky4me ^3. Wir setzen die -split $aZiffern in Parens ein, um die Begrenzer beizubehalten, und leiten das resultierende Array durch eine Schleife |%{...}. Wenn das aktuelle Stück eine Zahl ist, sind wir in der ersten if. Wir müssen prüfen, ob das erste Zeichen von $bist ^. Ist dies nicht der Fall, verketten wir einfach unser aktuelles Stück und $bsenden es an iex(ähnlich wie eval). Lassen Sie das dann in der Pipeline. Andernfalls müssen wir eine Exponentiationszeichenfolge mit "$_*"*$b.Trim('^')+1und Pipe erstellen iexund diese in der Pipeline belassen. Für das gegebene 2spooky4me ^3Beispiel wird dies sein 2*2*2*1und 4*4*4*1ist.

Andernfalls belassen wir den String einfach in der Pipeline.

Alle diese Ergebnisse werden aus der Pipeline mit den Kapselungsparens gesammelt, bevor sie -joinwieder zu einer Zeichenfolge zusammengefasst werden. Dies ist der Rest, der in der Pipeline verbleibt, und die Ausgabe erfolgt implizit bei Programmbeendigung.

Beispiele

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

PS C:\Tools\Scripts\golfing> .\universal-spooky-meme.ps1 2spooky4me /3
0spooky1me
AdmBorkBork
quelle
Ich schrieb meine eigenen, bevor ich mir die Antworten ansah, und dann habe ich auch einige Ihrer Ideen zusammengetragen - danke. Ich glaube , Sie ersetzen könnte Floor(("$_$b"|iex))mit Floor((iex $_$b))sparen ein paar, oder vielleicht iex $_+$b.
TessellatingHeckler
@TessellatingHeckler Danke für die zwei Bytes!
AdmBorkBork
8

JavaScript (ES7), 58 57 Bytes

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

Bearbeiten: 1 Byte gespeichert, als ich mich erinnerte, dass dies replaceauch für wörtliche Zeichenfolgen funktioniert.

Neil
quelle
Cool, ich arbeite an einer ES6-Lösung
Bálint
Können Sie Curry, um ein Byte zu speichern?
Gcampbell
1
@gcampbell Ja, aber ich bin zu faul.
Neil
6

Pyth, 29

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

Dies funktioniert, indem jede Zahl aus dem Mem extrahiert und anschließend ( .i) mit einem Leerzeichen gefolgt und mit dem anderen Argument in eine Liste eingeschlossen wird. Also , wenn unsere Zahl ist 7und wir hatten ^20wir die Liste bekommen würde: ["^", "7 ", "20"]. Durch Reduzieren und Verwenden von Pyth's eval( .v) erhalten Sie immer die gewünschte Operation. Schließlich werden diese Werte mit der ursprünglichen Zeichenfolge verschachtelt, die beim Auftreten von Zahlen aufgeteilt wird.

Dies kann ein Byte kürzer sein, wenn beide Eingaben von Anführungszeichen umgeben sind, oder zwei Byte kürzer, wenn nur eines von ihnen in Anführungszeichen gesetzt werden kann.

Probieren Sie es hier aus oder führen Sie eine Test Suite aus

FryAmTheEggman
quelle
6

Python 2, 156 89 88 87 Bytes

Inspiriert von den anderen Antworten, die die Substitutionsfunktion ihrer Sprachen mit einem Funktionshandler verwenden, um die numerischen Teile der langen input-Zeichenfolge mit dem oPerator zu verarbeiten. Pech für Python, das ^muss durch ersetzt werden **, was satte 18 Bytes kostet. Der .group(0)Aufruf, nur auf die Zeichenfolgendarstellung des Übereinstimmungsobjekts zuzugreifen , verbessert die Dinge nicht ...

Vielen Dank an QPaysTaxes für das Aufspüren eines falschen Leerzeichens und RootTwo für das unnötige Argument .group!

import re
lambda i,o:re.sub(r'\d+',lambda p:str(eval(p.group()+o.replace('^','**'))),i)
ojdo
quelle
Ich denke, Sie können den Raum nachi,o:
Nic Hartley
Sie können zwei weitere Bytes speichern: (1) mit p.group(). (Standardeinstellung ist 0); und (2) Setzen Sie r=re.sub;ersetzen ersten re.subAnruf mit rund verwenden Sie dann r('^','**',o)statto.replace(...)
RootTwo
@RootTwo: Für mich ist das r('^','**',o)erfordert dann Flucht ^zu \^, um die Zeichen zu finden , nicht den Anfang o, netto keine Bytes Speichern :-( - aber danke für den Hinweis auf die unnötige 0!
ojdo
5

Javascript (ES6) 99 Bytes

Ein weiteres Beispiel, warum wir es hassen, auf die Kompatibilität von ES7 zu warten

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

Lauffähiges Beispiel:

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

Bálint
quelle
Ihre passenden regulären Ausdrücke scheinen ein bisschen abzulaufen. Im ausführbaren Beispiel lassen Sie Großbuchstaben weg, wodurch sie aus dem Ergebnis entfernt werden ("2spooky4ME", "+1" => "3spooky5"), und im ersten Beispiel stimmen Sie mit ab \d+|\D+, was äquivalent zu ist .+. [a-zA-Z0-9]+ist der Regex, den du willst, nein? Oder [a-zA-Z]+|[0-9]+ob die Aufteilung einen Unterschied macht?
Itai Ferber
Es wäre wahrscheinlich einfacher, es Math.powdirekt aufzurufen, da Sie es sowieso in Sonderfällen ausführen müssen. Verwenden Sie auch die Ganzzahldivision?
Neil
@Neil Ich habe das vergessen, Minute
Bálint
@Neil gibt es einen besseren Weg für die Decke?
Bálint
1
@ItaiFerber \d+|\D+Ist nicht ganz das Gleiche wie .+. Sie sind nicht die gleichen, weil die kleene Expansion vor dem geschieht or. Es wäre das Gleiche, wenn es so aussehen würde (\d|\D)+, aber wie es ist, würde es nicht zu allen 2ain einer Gruppe passen , es wären zwei getrennte Gruppen.
FryAmTheEggman
5

Julia, 71 59 54 Bytes

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

Das Erfordernis zu verwenden, bigwenn verfügbar, macht dies viel länger als es sein könnte ...

Probieren Sie es online!

Dennis
quelle
4

Kotlin, 416 413 Bytes

Das Fehlen eines eval()in Kotlin hat die Anzahl der Bytes wirklich erhöht ...

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

Probieren Sie es online!

Ungolfed

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() }))
    }
}
The_Lone_Devil
quelle
4

PowerShell (v4), 124 - 120 Byte

# 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'\..*'"}})

(Die Zeilenumbrüche sind nur hier, um horizontales Scrollen zu vermeiden. Sie funktionieren, wenn sie als eine Zeile gespeichert werden.)

Kommentare und ungolfed Version wurde angefordert:

$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)
  • .Net regex Bibliothek kann mit einem Skript eine ersetzen tun , die ausgeführt wird auf dem Inhalt des Spiels, und Powershell - Typen Strings in Zahlen werfen, und iexsind wie eval()in anderen Sprachen. Es macht einfach "2spooky" "+3"->eval("2+3")
  • Außer ... es kann keine ^Operatoren oder andere bequeme Potenzierungen verarbeiten **. Es kann nur den [math]::Pow()Bibliotheksaufruf verwenden, daher gibt es einen großen Block, um diesen Zweig zu behandeln.
    • Die aktualisierte Version stiehlt eine Idee von @TimmyD und führt stattdessen eine String-Multiplikation durch, "2*" * ndie sich am Ende zu einer Multiplikation mit eins "2*2*2*2*"addiert, +1anstatt sich über das Trailing zu beschweren *.
  • Außer ... .Net rundet Banker standardmäßig auf die nächste gerade Zahl und 3/2 = 2 statt 3/2 = 1. Diese Herausforderung erfordert Kürzung, und das bedeutet [math]::Truncate(). Stattdessen speichere ich Zeichen, indem ich -replaceeinen Dezimalpunkt und alles, was danach steht, abschneide.

Testfälle:

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. Im letzten Test laufen die Zahlen [BigInteger]automatisch über, werden aber in wissenschaftlicher Notation gerendert. Glücklicherweise hat jede bekannte Rasse, die in der Lage ist, zwischen den Sternen zu kommunizieren, genug wissenschaftliche Entwicklung, um die wissenschaftliche Notation problemlos verarbeiten zu können.

TessellatingHeckler
quelle
1
Sie können in anderen Antworten sehen, wie sie eine ziemlich unlesbare Golfversion und dann eine separate ungolfed-Version zum Untersuchen des Codeverhaltens liefern. Sie sollten dies mit Ihrem tun (nämlich die Zeilenumbrüche in der Golfversion entfernen).
jpmc26
Vielen Dank für die Gutschrift, aber nicht für meinen Trick - ich habe ihn aus dem PowerShell Tips-Thread gezogen.
AdmBorkBork
Anscheinend interessiert es mich genug, einen Kommentar zu hinterlassen, und jemand anderes interessiert sich genug, um meinen Kommentar zu unterstützen. ;)
jpmc26
Nein, ich sagte, Sie sollten eine vollgolferische und eine vollgolferische Version haben. Der Golfspieler muss gescrollt werden. Der Ungolfspieler wird und wird nicht besser lesbar sein als der, den Sie haben.
jpmc26
1
@ jpmc26 Ok, ich habe in einer ungolfierten, kommentierten Version editiert.
TessellatingHeckler
3

Bash + GNU-Coreutils, 144 Bytes

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

Hierbei wird der Wechsel zwischen Ziffern und Nicht-Ziffern betrachtet. Aus diesem Grund wird ein zufälliges ungültiges Eingabezeichen (Komma) an die Eingabezeichenfolge angehängt. Dieses Komma wird dann in der Ausgabe ignoriert. Die Konvention des OP folgt genau der Syntax, bcdie hier für die Mathematik verwendet wird.

rexkogitans
quelle
Übrigens wegen der Diskussion in der PowerShell-Lösung von @TessellatingHeckler: In meiner Lösung können Sie das Programm in eine einzelne Zeile übersetzen, indem Sie die Zeilenumbrüche durch Semikolons ersetzen, was seine Länge nicht ändert.
rexkogitans
3

Lua, 145 93 Bytes

r=io.read;m=r()o=r()m=m:gsub("%d",function(n)return loadstring("return..."..o)(n)end)print(m)
Ausplaudern
quelle
Warum nicht einfach eine Funktion posten?
Bálint
2

R 163 Bytes

Als jemand, der reguläre Ausdrücke und String-Substitution in R lernt, erwies sich dies als eine ziemlich schwierige Herausforderung. Vor allem, weil das Abgleichen der Zahlen einfach ist, ich aber keine Möglichkeit gefunden habe, mehrere Substitutionen mit zu verwenden gsub. Außerdem weiß ich nicht, ob eval(parse(paste0(...es am effizientesten ist, zwischen Operationen zu wechseln. Vielleicht ist die switch-Funktion hier besser geeignet.

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

Erläuterung

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
}
Billywob
quelle
Ich denke, Sie können eine Menge Bytes sparen, wenn Sie gsub mit einem Abschluß für die Übereinstimmungen verwenden, was Sie in Ihrem Kommentar angedeutet haben. Ich weiß allerdings nicht, wie ich es in R machen soll. Ich kämpfte auch damit, bis ich herausfand, wie man das in Groovy macht. war so ziemlich ein Game Changer.
Magic Octopus Urn
2

Javascript (ES6), 85 Bytes

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

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

Ungolfed:

x = (s) => {
  var a = s.split(" ");
  return [...a[0]].map(x => (!isNaN(x)) ? eval(x + a[1]) : x).join ``
}
console.log(x("2spookie5me +1"));
Bladimir Ruiz
quelle
Weiß jemand, ob ich Leerzeichen mit dem Spread-Operator teilen kann? Von diesem an Split (""); zu ["" ... s]; Zumindest ist das die Idee.
Bladimir Ruiz
Sie brauchen nicht ()um das Lambda-Argument, Sie brauchen nicht var, und Sie sollten Parens und den Komma-Operator anstelle von geschweiften Klammern und verwendenreturn
Cyoce
Auch ^ist ein Sonderfall für JavaScript, es ist ein bitweises XOR anstelle vonMath.pow
Sunny Pun
2

Groovy, 64 60 Bytes

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

Ersetzt alle Instanzen von Ziffern durch einen Abschluss, der die Operation für die Ziffernteile des übergebenen Wortes bewertet. Wenn eine Exponentenfunktion übergeben wird, wird sie durch die richtige Notation ersetzt. Groovy verarbeitet implizit die BigInteger / BigDecimal-Konvertierung, wenn Eval.me()geparste Zeichenfolgen möglicherweise außerhalb des 2^32-1Bereichs liegen.

Erklärt

{a,b->...} - Abschluss mit zwei Argumenten.

a.replaceAll(/\d+/,{...}) - Suchen Sie nach allen Ziffernfolgen in einer Zeichenfolge und ersetzen Sie sie durch einen Abschluss.

{Eval.me(it+b.replace("^","**"))} - Genauer gesagt, ein Abschluß mit jeder Übereinstimmung, an die die Operation angehängt wurde, wird dann als Groovy-Code ausgewertet.

.replace("^","**")- Ersetzen Sie die erste Instanz von ^durch den Operator "Groovy Exponent" **in der angegebenen Operation. Wenn Sie möchten, dass dies mit vollständigen Gleichungszeichenfolgen funktioniert, die Exponenten verwenden, verwenden Sie replaceAll()stattdessen eine 3-Byte-Strafe.

Eine lustige Randnotiz ist ein gültiges Testszenario:
(22348952345238905290858906209862398036spooky409552me, /200*4943^8-23939+((100/203)+600)

Magische Kraken-Urne
quelle
1

RProgN , 39 Bytes

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

Erklärt

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

Technisch ungültige Antwort, da diese Sprache dafür nicht existiert. Es wurde jedoch weder speziell dafür noch für eine bestimmte Ergänzung entwickelt. Also führe ich es. Verklagen Sie mich.

Probieren Sie es online!

Ein Taco
quelle
0

Perl 6, 111 Bytes

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

Leider EVAList standardmäßig deaktiviert. Außerdem müssen Sie divfür die Ganzzahldivision verwenden.

bb94
quelle