Thông dịch viên thao tác chuỗi


11

Tóm lược

Một ngôn ngữ thao tác chuỗi mới đã được tạo ra, chỉ sử dụng các ký tự $+#-!*|@>! Nhiệm vụ của bạn là triển khai một trình thông dịch cho nó với càng ít byte càng tốt.

Đầu vào

Một chuỗi, là một dòng duy nhất của ngôn ngữ này. Điều này có thể được thực hiện theo bất kỳ cách hợp lý nào (stdin, tham số hàm, đối số dòng lệnh, v.v.) hoặc như một biến được xác định trước. Nếu chương trình yêu cầu đầu vào của người dùng, hãy chấp nhận tất cả đầu vào của người dùng mà nó yêu cầu từ stdin và không có gì nữa, xem bên dưới. Bạn có thể cho rằng nó là một chương trình hợp lệ.

Đầu ra

Dù ngôn ngữ sẽ xuất ra, thông số kỹ thuật dưới đây. Bạn phải xuất một chuỗi, theo bất kỳ cách hợp lý nào (thiết bị xuất chuẩn, đầu ra hàm, v.v.) hoặc giá trị biến. Khi ngôn ngữ đầu ra rõ ràng, điều này phải đi đến thiết bị xuất chuẩn. Sơ hở tiêu chuẩn bị cấm.

Thông số kỹ thuật ngôn ngữ

Xử lý và cú pháp

Ngôn ngữ có một hình thức xử lý rất đơn giản vì nó chỉ thực hiện thao tác chuỗi: nó bắt đầu bằng một chuỗi rỗng ( "") và thay đổi nó theo từng thuật ngữ. Một thuật ngữ được tạo thành từ một hoặc hai phần: một hàm (bên dưới) theo sau có thể là một tham số (bên dưới), điều chỉnh hành vi của nó. Các điều khoản được phân tách bằng đường ống ( |). Bạn có thể cho rằng nó sẽ không phải là một chương trình trống và không có thuật ngữ nào sẽ trống. Bạn nên xuất giá trị ở cuối chương trình.

Chức năng

Ngôn ngữ chỉ có 6 chức năng, như hình dưới đây. Mỗi chức năng chấp nhận một hoặc không tham số.

  • + nối chuỗi (lấy một tham số chuỗi, nối chuỗi đó với giá trị hiện tại)
  • ! đảo ngược thứ tự ký tự của giá trị hiện tại (không có tham số)
  • * lặp lại chuỗi (lấy một tham số nguyên, lặp lại giá trị hiện tại nhiều lần)
  • - xóa tất cả các lần xuất hiện của một giá trị (lấy một tham số chuỗi, xóa tất cả các lần xuất hiện của nó khỏi giá trị hiện tại)
  • $ [pseudo-] ngẫu nhiên xáo trộn giá trị hiện tại (không có tham số)
  • <xuất giá trị hiện tại thành stdout(không có tham số)

Giá trị

Đây là các giá trị có thể được truyền cho các hàm, được biểu thị bằng biểu thức chính quy phù hợp với chúng:

  • @[^|]*một chuỗi ký tự, bao gồm bất kỳ ký tự nào khác ngoài đường ống. Nó có thể trống rỗng.
  • #[0-9]+ một số nguyên
  • >dòng tiếp theo của stdin. Nếu được sử dụng với *, chuyển đổi thành số nguyên.

Các trường hợp thử nghiệm

╔════════════════════════╤═════════════╤══════════════╗
║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    ║
╟────────────────────────┼─────────────┼──────────────╢
║+@>#                    │             |>#            ║
╚════════════════════════╧═════════════╧══════════════╝

Lưu ý rằng trường hợp thử nghiệm 2 là ngẫu nhiên, vì vậy mọi hoán vị của các ký tự trong đó đều hợp lệ. Ngoài ra, các đầu ra trong bảng được phân tách bằng các dòng mới, nhưng chương trình của bạn không phải làm như vậy. Giá trị cuối cùng trong mỗi trường hợp đầu ra cuối cùng.

Ví dụ (Un-golfed) trình thông dịch python

Hãy thử trực tuyến! IMO tốt hơn nếu bạn chạy nó thông qua IDLE hoặc bất cứ điều gì bạn sử dụng. (Tôi đã đánh nó xuống còn 424 byte sau đó, nhưng tôi chắc chắn rằng bạn có thể làm tốt hơn nhiều).


2
Cho phép đầu vào đã ở trong một biến là không chuẩn, như cho phép đầu ra ở trong một biến.
Jonathan Allan

Ví dụ của bạn dường như in một dòng mới mỗi <lần gặp phải. Đây có phải là bắt buộc?
Hiện thân của sự thiếu hiểu biết

Chương trình sẽ có dòng mới trong đó? Bởi vì nếu có thể, nó vô hiệu hóa câu trả lời của Chas Brown
Hiện thân của sự thiếu hiểu biết

2
Đối với các câu hỏi trong tương lai của bạn, vui lòng xem xét việc tránh các định dạng I / O cồng kềnh . Giới hạn đầu vào cho stdin tốn thêm byte trong một số ngôn ngữ và không mang lại nhiều thách thức.
Arnauld

1
@digEmAll Cái tôi vừa thêm vào là +@>#gì? Tôi đã sử dụng #aswell.
Artemis vẫn không tin tưởng vào

Câu trả lời:


3

Ruby -palF\| , 146 142 byte

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

Hãy thử trực tuyến!

Câu trả lời Python của cảng Chas Brown . Không in dòng mới sau khi đầu ra.

Như thường lệ, phiên bản Ruby 2.6 sẽ ngắn hơn 2 byte với lập chỉ mục phạm vi vô tận ( i[2..]).


6

R , 287 286 273 269 ​​byte

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}

Hãy thử trực tuyến!

  • -1 cảm ơn @Kirill L.
  • -4 cảm ơn @Giuseppe

Mã không được kiểm soát và giải thích:

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 byte

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

Hãy thử trực tuyến!

-4 vì raw_inputđược yêu cầu.

9 byte nhờ Hiện thân của Vô minh ; 1 byte chỉ từ Ascii .


Đầu vào khác với chương trình phải từ stdin, như được chỉ định trong câu hỏi.
Artemis vẫn không tin tưởng SE

Tôi sử dụng Python 3, nhưng theo như tôi biết, việc sử dụng đầu vào đòi hỏi raw_input. Sửa lỗi cho tôi nếu tôi sai ..
Artemis vẫn không tin SE

Theo tài liệu Py 2.7: input([prompt])Tương đương với eval (raw_input (prompt)). Chức năng này không bắt lỗi người dùng. Nếu đầu vào không hợp lệ về mặt cú pháp, một SyntaxError sẽ được đưa ra.
Artemis vẫn không tin tưởng SE

Vì vậy, vấn đề bạn nêu ra là một cái gì đó giống như ở đây , nơi các chuỗi đầu vào sẽ cần được trích dẫn - thay vì không được trích dẫn như trong tình huống stdin 'đúng'. Một lần nữa, thông thường các quy tắc I / O là một chút lỏng lẻo; nhưng tôi sẽ sửa đổi.
Chas Brown

Cảm ơn đã thay đổi. Bạn có thể lưu một vài byte bằng cách thay đổi thành Python 3 và sử dụng mã cũ + 3 byte cho dấu ngoặc, nhưng ... dù sao đi nữa
Artemis vẫn không tin tưởng vào


1

Perl 5 -MList::Util=shuffle -pF/\|/ , 220 217 210 183 byte

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}{

Hãy thử trực tuyến!


1

Javascript, 292 267 byte

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}

Câu đố


Trường hợp thử nghiệm 6 không hoạt động tốt ...
Artemis vẫn không tin tưởng vào

1
@ArtemisFowl, Cảm ơn, regex không hoạt động chính xác và chuyển sang split..join đã lưu một vài byte.
Johan du Toit
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.