문자열 조작 인터프리터


11

요약

문자 만 사용하여 새로운 문자열 조작 언어가 만들어졌습니다 $+#-!*|@>! 귀하의 작업은 가능한 한 적은 바이트로 해석기를 구현하는 것입니다.

입력

이 언어의 한 줄인 문자열입니다. 이것은 합리적인 방법 (stdin, function parameter, command line argument 등) 또는 사전 정의 된 변수로 취할 수 있습니다. 프로그램이 사용자 입력을 요청하면 stdin에서 요청하는 모든 사용자 입력을 수락하고 더 이상 아무것도하지 마십시오 . 아래를 참조하십시오. 유효한 프로그램이라고 가정 할 수 있습니다.

산출

언어가 무엇을 출력하든 아래 사양을 참조하십시오. 합리적인 방법 (stdout, 함수 출력 등) 또는 변수 값으로 문자열을 출력해야합니다. 언어가 명시 적으로 출력이 필수 stdout으로 이동 . 표준 허점은 금지되어 있습니다.

언어 사양

처리 및 구문

이 언어는 문자열 조작 만하기 때문에 매우 간단한 형태의 처리 방식을 가지고 있습니다. 언어는 빈 문자열 ( "")로 시작 하여 각 용어로 변경됩니다. 용어는 하나 또는 두 부분으로 구성됩니다. 기능 (아래)과 매개 변수 (아래)가 동작을 편집합니다. 용어는 파이프 ( |) 로 구분됩니다 . 빈 프로그램이 아니라고 가정 할 수 있으며 비어있는 용어는 없습니다. 프로그램 끝에서 값을 출력해야합니다.

기능

이 언어에는 아래에 표시된 것처럼 6 개의 기능 만 있습니다. 각 함수는 하나 또는 0 개의 매개 변수를 허용합니다.

  • + 문자열 연결 (하나의 문자열 매개 변수를 사용하여 현재 값으로 연결)
  • ! 현재 값의 문자 순서를 반대로합니다 (매개 변수 없음)
  • * 문자열을 반복합니다 (한 개의 정수 매개 변수를 사용하고 현재 값을 여러 번 반복 함)
  • - 값의 모든 항목을 제거합니다 (하나의 문자열 매개 변수를 취하여 현재 값에서 모든 항목을 제거함)
  • $ [의사-] 현재 값을 임의로 셔플합니다 (매개 변수 없음)
  • <현재 값을 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는 임의이므로 임의의 문자 순열이 유효합니다. 또한 테이블의 출력은 줄 바꿈으로 구분되지만 프로그램은 동일하지 않아도됩니다. 각 경우의 마지막 값은 최종 출력입니다.

예 (골프가 아닌) 파이썬 인터프리터

온라인으로 사용해보십시오! IDLE 또는 사용하는 모든 것을 통해 IMO를 실행하면 더 좋습니다. (후에 424 바이트로 골프를 쳤지 만 더 잘 할 수 있다고 확신합니다).


2
입력이 이미 변수에 있도록 허용하는 것은 비표준이며 출력이 하나로 설정 될 수 있습니다.
Jonathan Allan

귀하의 예제 <는 마주 칠 때마다 줄 바꿈을 인쇄하는 것 같습니다 . 이것이 필수입니까?
무지의 실시

프로그램에 줄 바꿈이 있습니까? 그것이 가능하다면, 그것은 Chas Brown의 답변을 무효화합니다
무지의 구체화

2
향후 질문에 대해서는 성가신 I / O 형식을 피 하십시오 . 입력을 stdin으로 제한하면 일부 언어에서 추가 바이트가 필요하며 많은 어려움을 겪지 않습니다.
Arnauld

1
@digEmAll 방금 추가 한 방법은 +@>#무엇입니까? 나는 또한 사용했다 #.
Artemis는 여전히

답변:


3

루비 -palF\| , 146142 바이트

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

온라인으로 사용해보십시오!

Chas Brown의 Python 답변 . 출력 후 줄 바꿈을 인쇄하지 않습니다.

평소와 같이 Ruby 2.6 버전은 무한 범위 색인 ( i[2..]) 으로 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}

온라인으로 사용해보십시오!

  • @Kirill L. 덕분에 -1
  • @Giuseppe 덕분에 -4

풀린 코드 및 설명 :

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

파이썬 (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 바이트의 아스키 만 .


프로그램 이외의 입력은 질문에 지정된대로 stdin에서 입력해야합니다.
Artemis는 여전히

나는 파이썬 3을 사용하지만, 내가 아는 한, 입력을 사용하려면 필요합니다 raw_input. 내가 틀렸다면 나를 바로 잡으십시오.
Artemis는 여전히

Py 2.7 문서에 따르면 : input([prompt])eval (raw_input (prompt))과 같습니다. 이 기능은 사용자 오류를 포착하지 않습니다. 입력이 구문 상 유효하지 않으면 SyntaxError가 발생합니다.
Artemis는 여전히

따라서 제기중인 문제는 여기 에서 와 같습니다 . 여기서 입력 문자열을 '진정한'표준 상황에서와 같이 인용하지 않고 인용해야합니다. 다시 말하지만, 일반적으로 I / O 규칙은 약간 느슨합니다. 하지만 수정하겠습니다.
Chas Brown

변경해 주셔서 감사합니다. 당신은 +1 어쨌든 ... 파이썬 3으로 변경하고 괄호에 대한 이전 코드 + 3 바이트를 사용하여 몇 바이트를 저장하지만, 수
아르테미스는 여전히 SE 신뢰하지 않는


1

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

온라인으로 사용해보십시오!


1

자바 스크립트, 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이 제대로 작동하지 않습니다 ...
Artemis는 여전히

1
@ArtemisFowl, 감사합니다. 정규식이 제대로 작동하지 않고 split..join으로 전환하면 몇 바이트가 절약되었습니다.
Johan du Toit
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.