Универсальный переводчик Spooky Meme


43

Введение

Оказывается, инопланетяне любят мемов так же, как и мы. Каждая инопланетная раса, с которой мы столкнулись до сих пор, имеет свою собственную версию 2spooky4me(см. Следующий вопрос ) и эквивалентную, но с некоторыми вариациями. Жители планеты CUTE1f не могут справиться с большим количеством призрака, поэтому их предпочитают 1spooky2me, в то время как skeletor7 любят их, поэтому они склонны использовать 9spooky11me.

Вызов

Переводить мемы - тяжелая работа, поэтому вам поручено написать универсальный переводчик мемов, чтобы помочь этим парням получить доступ к меменету. Ваша программа примет мем и преобразование, которое будет применено к последовательности цифр в этом меме, чтобы сделать его подходящим для жителей другой планеты.

вход

Ваша программа получит два строковых ввода:

  1. Входной мем (например 2spooky4me). Матчи [a-zA-Z0-9]+.
  2. Преобразование, чтобы применить к нему (например +1, перейти от 2spooky4meк 3spooky5me). Матчи [+\-*/^]\d+(вы должны принять +, -, *, /, и в ^качестве операторов, независимо от родного представления на вашем языке).

Выход

Ваша программа должна вернуть строковый вывод (напечатанный на стандартный вывод или эквивалентный) с заданным преобразованием, примененным к последовательностям цифр во входном меме. При странном повороте событий также выясняется, что все встречающиеся расы предпочитают интегральные мемы, а не дробные, поэтому эти преобразования должны выполнять целочисленную арифметику (например, 1spooky1me /2приводить к 0spooky0me).

Примеры

Стандартные арифметические операции применяются:

Input:  2spooky4me +1
Output: 3spooky5me

Input:  2spooky4me -1
Output: 1spooky3me

Input:  2spooky4me *15
Output: 30spooky60me

Input:  10spooky900me /5
Output: 2spooky180me

Цифровые последовательности являются целыми; целочисленное усечение должно происходить в таких случаях:

Input:  idontunderstandmemes3 /2
Output: idontunderstandmemes1

Ваш ввод может не содержать последовательности цифр:

Input:  notreallyafunnymeme *100
Output: notreallyafunnymeme

Вы должны поддерживать возведение в степень, даже если это не нативная операция на выбранном вами языке:

Input:  2spooky4me ^3
Output: 8spooky64me

Нет ограничений на длину строки количества последовательностей цифр в строке:

Input:  some1meme2sequences3can4be5really6long7 /2
Output: some0meme1sequences1can2be2really3long3

добавление

Если ваш язык поддерживает целые числа произвольной точности в качестве языковой функции, вы должны использовать их. Если это не так, вам не нужно поддерживать целые числа произвольной точности. Например, вы должны использовать Integerв Haskell вместо того, Intпотому что он доступен как часть языка; в Java, вы не обязаны использовать, BigIntegerпотому что это функция библиотеки, а не функция языка.

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

Это , поэтому стандартные лазейки запрещены, и выигрывает самый короткий ответ в байтах!

Leaderboard

Фрагмент стека в нижней части этого поста создает таблицу лидеров из ответов а) в виде списка кратчайшего решения для каждого языка и б) в качестве общей таблицы лидеров.

Чтобы убедиться, что ваш ответ обнаружен, начните его с заголовка, используя следующий шаблон уценки:

## Language Name, N bytes

где Nразмер вашего представления. Если вы улучшите свой счет, вы можете сохранить старые результаты в заголовке, вычеркнув их. Например:

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

Если вы хотите включить в заголовок несколько чисел (например, потому что ваш результат равен сумме двух файлов или вы хотите перечислить штрафы за флаг интерпретатора отдельно), убедитесь, что фактический результат является последним числом в заголовке:

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

Вы также можете сделать имя языка ссылкой, которая будет отображаться во фрагменте кода:

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


3
Ваш последний контрольный пример неверен. У вас на выходе слишком много нулей, чтобы он был / 5.
Ник Хартли

5
Прежде всего, это достаточно хорошо составленное первое сообщение, так что поздравляю :) Обратите внимание, у нас есть песочница, где вы можете опубликовать свой запрос для обратной связи, прежде чем он будет опубликован.
FryAmTheEggman

3
Добро пожаловать в PPCG (хотя вы, очевидно, были здесь более 2 лет). Хороший первый вызов. Требует ли приложение о целых числах произвольной точности то, что, например, Java должна использовать BigIntegerдля своих вычислений?
AdmBorkBork

18
Каждая инопланетная раса, с которой мы сталкивались до сих пор ... Это абсолютно верно! :-)
Луис Мендо

2
Это ваша задача и, в конечном счете, зависит от вас, но это не совсем справедливо по отношению к языкам, которые используют другой синтаксис.
Денис

Ответы:


10

Джольф, 15 14 байтов

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

Попробуй это здесь!

объяснение

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

Интересно отметить, что после этого испытания я обновил Jolf, добавив несколько встроенных функций RegExp. Это может быть 12 11 байт:

ρiLRdC!6+HI

24

Рубин, 50 44 43 байта

FGITW ответ. Должен идти быстро!

Спасибо @Neil за сохранение 6 байтов.

Ах да, зачеркнуто 44 все еще 44

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

О, человек, это почти точно ответ я тыкать прочь на: a=gets;$><<gets.gsub(/\d+/){eval$&+a}. Моя пропустила вещь ^! = **, и, вероятно, немного дольше.
Ник Хартли,

3
+1 за то, чтобы все ваше решение было на 4 байта короче, чем то, что нужно в PowerShell только для обработки ^. : D
AdmBorkBork

15

Perl, 36 34 байта

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

Исходный код имеет длину 30 байт и требует переключателей -pi( +4 байта ). Он принимает первый вход из STDIN, второй вход в качестве аргумента -i.

Спасибо @DenisIbaev за 2 байта в гольфе!

Проверьте это на Ideone .


Да, я подумал, что если кто-нибудь сможет побить мой ответ на Ruby, это будет Деннис и / или быть в Perl, и вы в итоге выполнили оба ожидания одновременно
Value Ink

1
-piтакое 4 байта?
CalculatorFeline

@CatsAreFluffy Текущий консенсус заключается в подсчете расстояния редактирования от вызова без флагов. Это включает в себя пробел, чтобы отделить -piот остальной части команды.
Деннис

"0|$&"короче чем "0|".$&.
Денис Ибаев

@DenisIbaev Поскольку ввод буквенно-цифровой, "0|$&$^I"тоже работает. Благодарность!
Денис

9

PowerShell v2 +, 139 137 байт

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 байт просто для учета, ^поскольку это не собственный оператор в PowerShell. Сохранено 2 байта благодаря @TessellatingHeckler.

Принимает входной сигнал , как $a=<word>, $b=<operation>, как .\universal-spooky-meme.ps1 2spooky4me ^3. Мы -split $aна цифрах, заключая это в паренсы, чтобы мы держали разделители, и передать результирующий массив через цикл |%{...}. Если текущий кусок является числом, мы в первом if. Нам нужно проверить , является ли первый символ $bIS ^. Если это не так, мы просто объединяем наш текущий фрагмент и $bотправляем его iex(аналогично eval), а затем оставляем это в конвейере. В противном случае нам нужно создать строку возведения в степень с помощью "$_*"*$b.Trim('^')+1и передать ее в канал iexи оставить ее в конвейере. Для приведенного 2spooky4me ^3примера это будет 2*2*2*1и 4*4*4*1, соответственно.

В противном случае мы просто оставляем строку как есть на конвейере.

Все эти результаты собираются из конвейера с инкапсулирующими паренами, а затем -joinобъединяются в одну строку. Это повторный запуск в конвейере, и вывод неявно при завершении программы.

Примеры

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

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

Я написал свои собственные, прежде чем искать ответы, а затем ущипнул некоторые из ваших идей - спасибо. Я думаю , что вы могли бы заменить Floor(("$_$b"|iex))с , Floor((iex $_$b))чтобы сэкономить пару, или , может быть iex $_+$b.
TessellatingHeckler

@TessellatingHeckler Спасибо за два байта!
AdmBorkBork

8

JavaScript (ES7), 58 57 байт

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

Редактировать: Сохранено 1 байт, когда я вспомнил, что replaceтакже работает с литеральными строками.


Круто, я работаю над решением ES6
Bálint

Можете ли вы карри, чтобы сохранить байт?
gcampbell

1
@gcampbell Да, но мне лень.
Нил

6

Пиф, 29

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

Это работает путем извлечения каждого числа из мема, а затем чередования ( .i), за которым следует пробел и завернутый в список с другим аргументом. Так что, если наш номер 7и мы имели ^20мы получим список: ["^", "7 ", "20"]. Сглаживание и использование Pyth's eval( .v) всегда дает нужную нам операцию. Наконец, эти значения чередуются с исходной строкой, разбитой на вхождения чисел.

Это может быть на байт короче, если оба входа были заключены в кавычки, или на два байта короче, если только один из них может быть заключен в кавычки.

Попробуйте здесь или запустите Test Suite


6

Python 2, 156 89 88 87 байт

Вдохновлен другими ответами, которые используют функцию подстановки своих языков с помощью обработчика функций для обработки числовых частей длинной iстроки onput с помощью ператора. К несчастью для Python, его ^необходимо заменить **, что стоит колоссальные 18 байт. .group(0)Вызова только для доступа к объекту матча «s строковое представление не делает вещи лучше ...

Спасибо QPaysTaxes за обнаружение ложного пространства и RootTwo за ненужный аргумент .group!

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

Я думаю, что вы можете избавиться от места послеi,o:
Ник Хартли

Вы можете сохранить еще два байта: (1) с помощью p.group(). (по умолчанию 0); и (2) вставить r=re.sub;заменить первый re.subвызов rи затем использовать r('^','**',o)вместоo.replace(...)
RootTwo

@RootTwo: Для меня, r('^','**',o)тогда требуется избежать , ^чтобы \^для того , чтобы соответствовать символу, а не начало o, чистый не экономя ни одного байта :-( - но спасибо за указывая ненужных 0!
ojdo

5

Javascript (ES6) 99 байт

Другой пример, почему мы ненавидим ждать, пока ES7 получит совместимость

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

Runnable пример:

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


Ваши подходящие регулярные выражения, кажется, немного не в порядке. В выполняемом примере вы пропускаете заглавные буквы, что исключает их из результата ("2spooky4ME", "+1" => "3spooky5"), а в первом примере вы сопоставляете \d+|\D+, что эквивалентно .+. [a-zA-Z0-9]+Вы хотите регулярное выражение, нет? Или, [a-zA-Z]+|[0-9]+если разделение имеет значение?
Итай Фербер

Вероятно, было бы проще вызывать Math.powнапрямую, так как в любом случае вам придется использовать его в особом случае. Кроме того, вы используете целочисленное деление?
Нейл

@Neil Я забыл это, минутку
Bálint

@ Нил, есть ли лучший способ потолка?
Балинт

1
@ItaiFerber \d+|\D+Не совсем так же, как .+. Они не одинаковы, потому что расширение клини происходит до or. Было бы то же самое, если бы это выглядело (\d|\D)+, но как бы, это не соответствовало бы всем, скажем, 2aв одной группе, это были бы две отдельные группы.
FryAmTheEggman


4

Котлин, 416 413 байт

Отсутствие eval()в Kotlin действительно увеличило количество байтов ...

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

Попробуйте онлайн!

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

4

PowerShell (v4), 124 120 байт

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

(новые строки предназначены только для того, чтобы избежать горизонтальной прокрутки, они работают при сохранении одной строки).

Были запрошены комментарии и разглаженная версия:

$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 может выполнять замену блоком сценариев, который выполняется для содержимого совпадения, а PowerShell преобразует строки типов в числа, iexкак и eval()в других языках. Это просто делает "2spooky" "+3"->eval("2+3")
  • За исключением ... он не может обрабатывать ^оператор или любое другое удобное возведение в степень, например **, он может использовать только [math]::Pow()библиотечный вызов, поэтому есть большой блок для обработки этой ветви.
    • Обновленная версия крадет идею из @TimmyD и вместо этого выполняет умножение строк - "2*" * nкоторое становится, "2*2*2*2*"а затем добавляет +1в конце умножение на единицу, вместо того, чтобы жаловаться на трейлинг *.
  • За исключением ... .Net выполняет округление Banker's, которое округляет до ближайшего четного числа по умолчанию, и 3/2 = 2, а не 3/2 = 1. Этот вызов требует усечения, и это означает [math]::Truncate(). Вместо этого я сохраняю символы, используя -replaceобрезку десятичной точки и что-нибудь после нее.

Тестовые случаи:

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. В последнем тесте числа [BigInteger]автоматически переходят в тип , но отображаются в научной записи. К счастью, каждая известная раса, способная общаться между звездами, имеет достаточно научных разработок, чтобы без проблем обрабатывать научные обозначения.


1
В других ответах вы можете увидеть, как они предоставляют довольно нечитаемую версию для игры в гольф, а затем отдельную версию для игры в коде. Вы должны сделать это со своим (а именно, удалить переводы строки в версии для гольфа).
jpmc26

Спасибо за кредит, но не за мой трюк - я вытащил его из ветки PowerShell Tips.
AdmBorkBork

По-видимому, я забочусь о том, чтобы оставить комментарий, а кому-то еще достаточно, чтобы поддержать мой комментарий. ;)
jpmc26

Нет, я сказал, что у вас должна быть полностью играемая в гольф версия и полностью безголовая версия. Игра в гольф потребует прокрутки. Безголовый не будет и будет более читабельным, чем тот, который у вас есть.
jpmc26

1
@ jpmc26 Хорошо, я редактировал в некомментированной, закомментированной версии.
TessellatingHeckler

3

Bash + GNU coreutils, 144 байта

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

Здесь рассматривается изменение между цифрами и не цифрами, поэтому к входной строке добавляется случайный недопустимый символ ввода (запятая). Эта запятая затем игнорируется в выводе. Соглашение OP точно соответствует синтаксису, bcкоторый используется здесь для выполнения математических операций.


Кстати, из-за обсуждения в PowerShell-решении @TessellatingHeckler: в моем решении вы можете перевести программу в одну строку, заменив разрывы строк точкой с запятой, которая не меняет ее длину.
rexkogitans

3

Луа, 145 93 байта

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

Почему бы просто не опубликовать функцию?
Балинт

2

R 163 байта

Для тех, кто изучает регулярные выражения и подстановку строк в R, это оказалось довольно сложной задачей. Тем более, что сопоставить числа легко, но я не смог найти способ использовать множественные замены с gsub. Кроме того, я не знаю, eval(parse(paste0(...является ли самый эффективный способ переключения между операциями. Может быть, switch-функция лучше подходит здесь.

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

объяснение

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
}

Я думаю, что вы можете сэкономить тонну байтов, если вы используете gsub с закрытием на матчах, на что вы намекали в своем комментарии. Я не знаю, как сделать это в R, хотя. Я тоже боролся с этим, пока не узнал, как это сделать в Groovy; был в значительной степени изменит правила игры.
Волшебная Урна Осьминога

2

Javascript (ES6), 85 байт

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

Кто-нибудь знает, могу ли я разделить пробелы с помощью оператора Spread? Из этого с.сплит (""); к ["" ... с]; По крайней мере, это идея.
Владимир Руис

Вам не нужно ()разбирать лямбда-аргумент, вам не нужно var, и вы должны использовать вместо фигурных скобок return
парены

Кроме того, ^это особый случай для JavaScript, это побитовый XOR вместоMath.pow
Sunny Pun

2

Groovy, 64 60 байт

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

Заменяет все вхождения цифр на замыкание, которое оценивает операцию над цифрами частей переданного слова. Если передана функция экспоненты, она заменяет ее соответствующими обозначениями. Groovy неявно обрабатывает преобразование BigInteger / BigDecimal при использовании, Eval.me()потому что проанализированные строки могут быть вне 2^32-1диапазона.

Разъяснения

{a,b->...} - Закрытие с двумя аргументами.

a.replaceAll(/\d+/,{...}) - Поиск всех последовательностей цифр в строке и заменить на закрытие.

{Eval.me(it+b.replace("^","**"))} - В частности, замыкание с каждым сопоставлением, к которому добавлена ​​операция, а затем оценивается как отличный код.

.replace("^","**")- Замените первый экземпляр ^на оператор Groovy экспоненты **в предоставленной операции. Если вы хотите, чтобы это работало с полными строками уравнений, в которых используются показатели степени, используйте replaceAll()вместо этого штраф в +3 байта.

Забавно, что это правильный тестовый сценарий:
(22348952345238905290858906209862398036spooky409552me, /200*4943^8-23939+((100/203)+600)


1

RProgN , 39 байт

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

Разъяснения

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

Технически неверный ответ, потому что этот язык для него не существовал. Тем не менее, он не был специально разработан для этого, ни каких-либо конкретных дополнений. Так что я бегу это. Подать в суд на меня.

Попробуйте онлайн!


0

Perl 6, 111 байт

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

К сожалению, EVALпо умолчанию отключено. Кроме того, вы должны использовать divдля целочисленного деления.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.