Интерпретатор строки манипуляции

11

Резюме

Был создан новый язык для работы со строками, использующий только символы $+#-!*|@>! Ваша задача - реализовать для него интерпретатор с минимальным количеством байтов.

вход

Строка, представляющая собой одну строку этого языка. Это может быть принято любым разумным способом (стандартным параметром, параметром функции, аргументом командной строки и т. Д.) Или как предопределенная переменная. Если программа запрашивает ввод пользователя, примите все вводимые пользователем запросы от stdin и ничего более, см. Ниже. Вы можете предположить, что это действительная программа.

Выход

Какой бы язык не выводился, спецификации приведены ниже. Вы должны вывести строку любым приемлемым способом (стандартный вывод, вывод функции и т. Д.) Или значение переменной. Когда язык выводит явно, это должно идти в stdout. Стандартные лазейки запрещены.

Спецификации языка

Обработка и синтаксис

Язык имеет очень простую форму обработки, поскольку он выполняет только манипуляции со строками: он начинается с пустой строки ( "") и меняет ее с каждым термином. Термин состоит из одной или двух частей: функции (ниже), за которой следует, возможно, параметр (ниже), который редактирует его поведение. Термины разделены трубками ( |). Вы можете предположить, что это не будет пустой программой, и ни один термин не будет пустым. Вы должны вывести значение в конце программы.

функции

Язык имеет всего 6 функций, как показано ниже. Каждая функция принимает один или ноль параметров.

  • + объединить строки (принимает один строковый параметр, объединяет его с текущим значением)
  • ! изменить порядок символов текущего значения (без параметра)
  • * повторить строку (принимает один целочисленный параметр, повторяет текущее значение много раз)
  • - удаляет все вхождения значения (принимает один строковый параметр, удаляет все вхождения этого значения из текущего значения)
  • $ [псевдо-] случайным образом перемешивает текущее значение (без параметров)
  • <вывести текущее значение stdout(без параметров)

Ценности

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

  • @[^|]*строковый литерал, включая любой символ, кроме труб. Это может быть пустым.
  • #[0-9]+ целое число буквальное
  • >следующая строка stdin. Если используется с *, конвертировать в целое число.

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

╔════════════════════════╤═════════════╤══════════════╗
║code                    │input        │output        ║
╟────────────────────────┼─────────────┼──────────────╢
║+>|!|+@hello|*>         │13           │31hello31hello║
║                        │2            │              ║
╟────────────────────────┼─────────────┼──────────────╢
║+>|+@abcdefg|$          │hello        │hcloeebafdlg  ║
╟────────────────────────┼─────────────┼──────────────╢
║+@how areyou|-@o|->     │w            │h areyu       ║
╟────────────────────────┼─────────────┼──────────────╢
║+@out|<|*#3             │             │out           ║
║                        │             │outoutout     ║
╟────────────────────────┼─────────────┼──────────────╢
║+>                      │what ever 345│what ever 345 ║
╟────────────────────────┼─────────────┼──────────────╢
║+@$pe<i@l|<|-@$pe<i@l|+>│A|$o $pe<!@| │$pe<i@l       ║
║                        │             │A|$o $pe<!@|  ║
╟────────────────────────┼─────────────┼──────────────╢
║<|+>|!|<                │input text   |              ║
║                        │             │txet tupni    ║ 
║                        │             │txet tupni    ║
╟────────────────────────┼─────────────┼──────────────╢
║+@>#                    │             |>#            ║
╚════════════════════════╧═════════════╧══════════════╝

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

Пример (без гольфа) интерпретатора Python

Попробуйте онлайн! ИМО лучше, если вы запустите его через IDLE или что вы используете. (После этого я проиграл 424 байта, но я уверен, что у вас получится лучше).

Артемида все еще не доверяет ЮВ
источник
2
Разрешение ввода уже в переменной является нестандартным, как и вывод в одной.
Джонатан Аллан
Ваши примеры, кажется, печатают новую строку каждый раз, когда <встречаются. Это обязательно?
Воплощение невежества
Будет ли в программе новая строка? Потому что, если это возможно, это лишает законной силы ответ Часа Брауна
Воплощение Невежества
2
Для ваших будущих вопросов, пожалуйста, избегайте громоздких форматов ввода / вывода . Ограничение ввода для stdin стоит дополнительных байтов на некоторых языках и не приводит к серьезным проблемам.
Арно
1
@digEmAll Как тот , который я просто добавил +@>#? Я использовал также #.
Артемида все еще не доверяет SE

Ответы:

3

Рубин -palF\| , 146 142 байта

r='';$F.map{|i|x=i[1]!=?>?i[2..-1]:gets.chomp;eval %w[r.reverse! r*=x.to_i 0 $><<r r=r.chars.shuffle*'' r.gsub!x,'' r+=x][i[0].ord*5%11]};$_=r

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

Порт Часов Брауна в Python ответ . Не выводит новые строки после вывода.

Как обычно, версия Ruby 2.6 будет на 2 байта короче с бесконечной индексацией диапазона ( i[2..]).

Кирилл Л.
источник
6

R , 287 286 273 269 байт

function(C,x='',`[`=gsub,`!`=intToUtf8,`?`=utf8ToInt){for(k in el(strsplit(C,'\\|'))){B=eval(parse(t='^.'['','(?<=.)>$'['readLines(,1)','[@#](.+)'['"\\1"',k],,T]]));x=switch((?substr(k,1,1))%%13-2,strrep(x,B),paste0(x,B),,B['',x,f=T],!rev(?x),print(x),,!sample(?x))};x}

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

  • -1 благодаря @Kirill L.
  • -4 благодаря @Giuseppe

Развернутый код и объяснение:

function(C){                                      # C is the string manipulation expression
  x = ''                                          # initialize x = ''
  tokens = el(strsplit(C,'\\|'))                  # split C by pipe '|'
  for(k in tokens){                               # for each token k
    arg2 = k
    arg2 = gsub('[@#](.+)','"\\1"',k)             # replace @X or #X with "X" (in quotes)
    arg2 = gsub('(?<=.)>$','"readLines(,1)"',
                 arg2,perl=T)                     # replace > with readLines(,1)
    arg2 = gsub('^.','',arg2)                     # remove the first character
    B = eval(parse(t=arg2))                       # evaluate the string : this will be our 
                                                  # second argument B
    A = substr(k,1,1)                             # take the first character : 
                                                  # i.e. the main command (+,-,! etc)
    x = switch(A,                                 # switch on the main command, execute the 
            '+'=paste0(x,B),                      # corresponding expression and 
            '!'=intToUtf8(rev(utf8ToInt(x))),     # store the result into x
            '*'=strrep(x,B),                      # Note: in the actual code we switch on
            '-'=B['',x,f=T],                      # the utf8 value MOD 13-2 of the command
            '$'=intToUtf8(sample(utf8ToInt(x))),
            '<'=print(x)
        )
    }
    x                                             # return x (and print it implicitly)
}
digEmAll
источник
3

Python 2 , 215 219 209 208 байт

from random import*
I=raw_input;o=''
for t in I().split('|'):p=t[1:]=='>'and I()or t[2:];exec"o=o[::-1] o*=int(p) 0 print(o) o=''.join(sample(o,len(o))) o=o.replace(p,'') o+=p".split()[ord(t[0])*5%11]
print o

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

-4 потому что raw_inputтребуется.

9 байт благодаря « Варианту невежества» ; 1 байт только для Ascii .

Час Браун
источник
Входные данные, кроме программы, должны быть из стандартного ввода, как указано в вопросе.
Артемида до сих пор не доверяет
Я использую Python 3, но, насколько мне было известно, это требует ввода raw_input. Поправь меня, если я ошибаюсь ..
Артемида до сих пор не доверяет SE
Согласно Py 2.7 документы: input([prompt])Эквивалент eval (raw_input (подсказка)). Эта функция не отлавливает ошибки пользователя. Если входные данные не являются синтаксически допустимыми, возникает синтаксическая ошибка.
Артемида до сих пор не доверяет
Итак, проблема, которую вы поднимаете, выглядит примерно так: здесь входные строки должны быть заключены в кавычки, а не в кавычки, как в «истинной» ситуации с stdin. Опять же, как правило, правила ввода-вывода немного слабоваты; но я изменю.
Час Браун
Спасибо за изменение. Вы можете сэкономить несколько байтов, перейдя на Python 3 и используя свой старый код + 3 байта для скобок, но ... +1 в любом случае
Артемида по-прежнему не доверяет SE
1

Perl 5 -MList::Util=shuffle -pF/\|/ , 220 217 210 183 байта

map{$,=s/..//r;$\=reverse$\if/^!/;$,ne""||chomp($,=<>),$\=~s/\Q$,//g if/^-/;say$\if/^</;$\=join"",shuffle$\=~/./g if/^\$/;$\.=$,eq""?<>=~s/\n//r:$,if/^\+/;$\x=$,eq""?<>:$,if/^\*/}@F}{

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

Xcali
источник
1

Javascript, 292 267 байт

f=(p)=>{c='';p.split`|`.map(l=>{v=l.substr(2);v=l[1]=='#'?parseInt(v):l[1]=='>'?prompt():v;c={'+':_=>c+v,'-':_=>c.split(v).join``,'*':_=>c.repeat(v),'$':_=>[...c].sort(_=>.5-Math.random()).join``,'!':_=>[...c].reverse().join``,'<':_=>alert(c)||c}[l[0]]();});return c}

JSFiddle

Йохан дю Туа
источник
Тестовый пример 6 не совсем работает ...
Артемида по-прежнему не доверяет SE
1
@ArtemisFowl, спасибо, регулярное выражение не работает должным образом и переключается на split..jin сэкономил пару байтов.
Йохан дю Туа