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:
- Das Eingabe-Meme (zB
2spooky4me
). Streichhölzer [a-zA-Z0-9]+
.
- Die Transformation, die darauf angewendet werden soll (z. B.
+1
von 2spooky4me
nach 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 /2
sollten 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 Integer
in Haskell verwenden, anstatt, Int
weil es als Teil der Sprache verfügbar ist. In Java
müssen Sie nicht verwenden, BigInteger
da es sich um eine Bibliotheksfunktion und nicht um eine Sprachfunktion handelt.
Input: 2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000spooky4me /2
Output: 1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000spooky2me
Das ist Code-Golf , 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 N
ist 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
<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
für ihre Berechnungen?Antworten:
Jolf,
1514 BytesProbieren Sie es hier aus!
Erläuterung
Es macht Spaß zu bemerken, dass ich Jolf nach dieser Herausforderung aktualisiert und einige RegExp-Buildins hinzugefügt habe. Dies können
12 bis11 Bytes sein:quelle
Ruby,
504443 BytesAntwort von FGITW. Muss schnell los!
Vielen Dank an @Neil für das Speichern von 6 Bytes.
Ach ja, durchgestrichen 44 ist immer noch 44
quelle
a=gets;$><<gets.gsub(/\d+/){eval$&+a}
. Meins hat die Sache mit ^! = ** jedoch verpasst und ist wahrscheinlich etwas länger.^
. : DPerl,
3634 BytesDer 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 .
quelle
-pi
ist 4 Bytes?-pi
vom Rest des Befehls zu trennen ."0|$&"
ist kürzer als"0|".$&
."0|$&$^I"
funktioniert das auch. Vielen Dank!PowerShell v2 +,
139137 BytesOoof ... 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
$a
Ziffern 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 erstenif
. Wir müssen prüfen, ob das erste Zeichen von$b
ist^
. Ist dies nicht der Fall, verketten wir einfach unser aktuelles Stück und$b
senden es aniex
(ähnlich wieeval
). Lassen Sie das dann in der Pipeline. Andernfalls müssen wir eine Exponentiationszeichenfolge mit"$_*"*$b.Trim('^')+1
und Pipe erstelleniex
und diese in der Pipeline belassen. Für das gegebene2spooky4me ^3
Beispiel wird dies sein2*2*2*1
und4*4*4*1
ist.Andernfalls belassen wir den String einfach in der Pipeline.
Alle diese Ergebnisse werden aus der Pipeline mit den Kapselungsparens gesammelt, bevor sie
-join
wieder zu einer Zeichenfolge zusammengefasst werden. Dies ist der Rest, der in der Pipeline verbleibt, und die Ausgabe erfolgt implizit bei Programmbeendigung.Beispiele
quelle
Floor(("$_$b"|iex))
mitFloor((iex $_$b))
sparen ein paar, oder vielleichtiex $_+$b
.JavaScript (ES7),
5857 BytesBearbeiten: 1 Byte gespeichert, als ich mich erinnerte, dass dies
replace
auch für wörtliche Zeichenfolgen funktioniert.quelle
Pyth, 29
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 ist7
und wir hatten^20
wir die Liste bekommen würde:["^", "7 ", "20"]
. Durch Reduzieren und Verwenden von Pyth'seval
(.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
quelle
Python 2,
156898887 BytesInspiriert von den anderen Antworten, die die Substitutionsfunktion ihrer Sprachen mit einem Funktionshandler verwenden, um die numerischen Teile der langen
i
nput-Zeichenfolge mit demo
Perator 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
!quelle
i,o:
p.group()
. (Standardeinstellung ist 0); und (2) Setzen Sier=re.sub;
ersetzen erstenre.sub
Anruf mitr
und verwenden Sie dannr('^','**',o)
statto.replace(...)
r('^','**',o)
erfordert dann Flucht^
zu\^
, um die Zeichen zu finden , nicht den Anfango
, netto keine Bytes Speichern :-( - aber danke für den Hinweis auf die unnötige0
!Javascript (ES6) 99 Bytes
Ein weiteres Beispiel, warum wir es hassen, auf die Kompatibilität von ES7 zu warten
Lauffähiges Beispiel:
quelle
\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?Math.pow
direkt aufzurufen, da Sie es sowieso in Sonderfällen ausführen müssen. Verwenden Sie auch die Ganzzahldivision?\d+|\D+
Ist nicht ganz das Gleiche wie.+
. Sie sind nicht die gleichen, weil die kleene Expansion vor dem geschiehtor
. Es wäre das Gleiche, wenn es so aussehen würde(\d|\D)+
, aber wie es ist, würde es nicht zu allen2a
in einer Gruppe passen , es wären zwei getrennte Gruppen.Julia,
715954 BytesDas Erfordernis zu verwenden,
big
wenn verfügbar, macht dies viel länger als es sein könnte ...Probieren Sie es online!
quelle
Kotlin,
416413 BytesDas Fehlen eines
eval()
in Kotlin hat die Anzahl der Bytes wirklich erhöht ...Probieren Sie es online!
Ungolfed
quelle
PowerShell (v4),
124 -120 Byte(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:
iex
sind wieeval()
in anderen Sprachen. Es macht einfach"2spooky" "+3"
->eval("2+3")
^
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."2*" * n
die sich am Ende zu einer Multiplikation mit eins"2*2*2*2*"
addiert,+1
anstatt sich über das Trailing zu beschweren*
.[math]::Truncate()
. Stattdessen speichere ich Zeichen, indem ich-replace
einen Dezimalpunkt und alles, was danach steht, abschneide.Testfälle:
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.quelle
Bash + GNU-Coreutils, 144 Bytes
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,
bc
die hier für die Mathematik verwendet wird.quelle
Lua,
14593 Bytesquelle
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, obeval(parse(paste0(...
es am effizientesten ist, zwischen Operationen zu wechseln. Vielleicht ist dieswitch
-Funktion hier besser geeignet.Erläuterung
quelle
Javascript (ES6), 85 Bytes
Ungolfed:
quelle
()
um das Lambda-Argument, Sie brauchen nichtvar
, und Sie sollten Parens und den Komma-Operator anstelle von geschweiften Klammern und verwendenreturn
^
ist ein Sonderfall für JavaScript, es ist ein bitweises XOR anstelle vonMath.pow
Groovy,
6460 BytesErsetzt 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 des2^32-1
Bereichs 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 SiereplaceAll()
stattdessen eine 3-Byte-Strafe.Eine lustige Randnotiz ist ein gültiges Testszenario:
(22348952345238905290858906209862398036spooky409552me, /200*4943^8-23939+((100/203)+600)
quelle
RProgN , 39 Bytes
Erklärt
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!
quelle
Perl 6, 111 Bytes
Leider
EVAL
ist standardmäßig deaktiviert. Außerdem müssen Siediv
für die Ganzzahldivision verwenden.quelle