Інтерпретатор струнного маніпуляції


11

Підсумок

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

Вхідні дані

Рядок, що є єдиним рядком цієї мови. Це можна сприймати будь-яким розумним способом (stdin, параметр функції, аргумент командного рядка тощо), або як заздалегідь задану змінну. Якщо програма вимагає введення користувачем, прийміть усі користувальницькі дані, які вона вимагає від stdin, і більше нічого, див. Нижче. Ви можете припустити, що це дійсна програма.

Вихідні дані

Яку б мову не виводили, наведено нижче. Ви повинні виводити рядок будь-яким розумним способом (stdout, виведення функції тощо) або значення змінної. Коли мова виводить явно, це має перейти до stdout. Стандартні лазівки заборонені.

Мовні характеристики

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

Мова має дуже просту форму обробки, оскільки вона виконує лише рядкові маніпуляції: вона починається з порожнього рядка ( "") і змінює його з кожним терміном. Термін складається з однієї або двох частин: функції (внизу), за якою, можливо, параметр (внизу), який редагує його поведінку. Умови розділені трубами ( |). Ви можете припустити, що це не буде порожньою програмою, і жоден термін не буде порожнім. Ви повинні вивести значення в кінці програми.

Функції

Мова має всього 6 функцій, як показано нижче. Кожна функція або приймає один або нульовий параметри.

  • + об'єднати рядки (бере один параметр рядка, з'єднує його з поточним значенням)
  • ! Зміна порядку символів поточного значення (немає параметра)
  • * повторити рядок (приймає один цілий параметр, багато разів повторює поточне значення)
  • - видаляє всі входження значення (бере один параметр рядка, видаляє всі входження його з поточного значення)
  • $ [pseudo-] випадковим чином переміщує поточне значення (без параметра)
  • <вивести поточне значення 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 є випадковим, тому будь-яка перестановка символів у ньому дійсна. Крім того, результати в таблиці відокремлюються новими рядками, але програма не повинна робити те саме. Останнє значення в кожному випадку - кінцевий вихід.

Приклад інтерпретатора пітона (Un-golfed)

Спробуйте в Інтернеті! IMO краще, якщо ви запускаєте його через 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)
}

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 .


Вхід, окрім програми, повинен бути від stdin, як зазначено в питанні.
Артеміда досі не вірить SE

Я використовую Python 3, але, наскільки я усвідомлював, це потребує використання вводу raw_input. Виправте мене, якщо я помиляюся ..
Артеміда все ще не довіряє SE

Відповідно до Py 2.7, документи: input([prompt])еквівалентно eval (raw_input (підказка)). Ця функція не сприймає помилок користувача. Якщо введення не є синтаксично допустимим, буде піднято SyntaxError.
Артеміда досі не вірить SE

Отже, питання, яке ви піднімаєте, є чимось подібним до цього , де потрібно було б цитувати вхідні рядки, а не без котирування, як у "справжній" ситуації. Знову ж таки, зазвичай правила вводу / виводу трохи мляві; але я модифікую.
Час Браун

Дякуємо за зміну. Ви можете зберегти кілька байт, перейшовши на Python 3 та використовуючи свій старий код + 3 байти для дужок, але ... +1
все одно



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



1
@ArtemisFowl, Дякую, регулярний виправлення не працює належним чином і переключившись на спліт .. додати збережено пару байтів.
Йохан дю
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.