간단한 골프 통역


13

도전:

당신의 임무는 간단한 골프 언어를위한 간단한 통역사를 만드는 것입니다.


입력:

입력은 공백으로 구분 된 문자열 형식입니다.

공간 분리를 원하는 것으로 바꿀 수 있습니다


산출:

모든 작업을 수행 한 후 얻은 결과 (숫자 또는 문자열)를 출력합니다. 둘 이상의 출력이있는 경우 함께 결합하여 단일 결과를 제공합니다 (구분자 없음). 변수의 초기 값은 항상 0입니다. 즉 : 그것은 시작0


언어 구문 :

이 언어에는 다음과 같은 연산자가 있습니다.

inc  ---> add one to variable
dec  ---> remove one from variable
mult ---> multiply variable by 2
half ---> divide the variable by 2
Pri  ---> print the variable to console (or whatever your language has)
exit ---> end the program (anything after this is ignored)

예 :

inc inc inc dec Pri exit                 ---> 2
dec inc mult inc inc Pri                 ---> 2
inc inc inc mult half Pri exit inc       ---> 3
inc Pri inc Pri inc Pri exit half mult   ---> 123
Pri exit                                 ---> 0
inc half Pri exit                        ---> 0.5 

제한:

이것은 코드 골프이므로 각 언어마다 가장 짧은 바이트 코드가 이길 것입니다.


노트 :

  • 입력은 항상 유효합니다. (공백으로 구분 된 연산자 문자열)
  • 소수점 이하 자릿수를 원하지 않으면 가장 가까운 정수로 내림 할 수 있습니다.

3
문자열 목록을 가져올 수 있습니까? 다른 대문자를 사용할 수 있습니까?
user202729

이탈 사례를 추가 하시겠습니까? 출구는 중요합니다
l4m2

1
@ 칼도 : 당신은 새로운 라인을 사용하여 분리 할 수 ​​있습니다
Muhammad Salman

3
흠, 나는 그 언어를 "골프 언어"라고 부르지 않을 것이다.
Paŭlo Ebermann

1
이것은 정사각형과 더 긴 명령 이름 대신에 두 배와 반을 가진 Deadfish 입니다
Jo King

답변:


8

배쉬 , 61 바이트

sed '1i0
s/.//2g;y"idmhe"+-*/q";/+\|-/i1
/*\|\//i2
/P/cdn'|dc

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

프로그램을 dc 프로그램으로 변환 한 다음 dc 코드로 평가합니다. 이것은 개행으로 구분 된 입력을받습니다. dc는 스택 기반이며 역 광택 표기법을 사용합니다.

입력은 먼저 sed로 파이프됩니다

1i0 입력의 첫 번째 줄에서 0을 삽입 (앞에 추가)하면 누산기가됩니다.

s/.//2g 각 줄의 첫 번째 문자를 제외한 모든 것을 제거하십시오.

y"idmhe"+-*/q"음역 idmhe+-*/q각각 + - * / 산술 명령은 q는 프로그램 종료

/+\|-/+ 또는-를 포함하는 모든 행 i1에 1을 삽입하십시오.

/*\|\//* 또는 /를 포함하는 모든 행 i2에 2를 삽입하십시오.

/P/P를 포함하는 모든 행에서로 cdn변경하고 dndc에서 줄 바꿈없이 출력과 동일하게 변경하십시오.

이제 이것은 dc 표현식으로 평가됩니다.


2
sed골프가 시작될 때 이전에 생각했던 것보다 구문이 훨씬 더 외계인이 될 것으로 기대하는 것은 부당하지 않다고 생각합니다.
Mateen Ulhaq

6

젤리 , 21 바이트

ḲḢ€O%11ị⁾’‘j“IȮḤH”¤VI

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


첫 문자 ( idmhPe) 모듈로 11 의 ASCII 값 은 고유 모듈로 6입니다.


모듈로 16 사용 :

젤리 , 21 바이트

ḲḢ€O%⁴ị“ḢwġḞkz’ṃØJ¤VI

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

ḤH‘’IȮ이 경우 색인에 사용되는 문자열 이 있습니다. 는 ‘’더 이상 경계에 없습니다.


6 바이트 문자열을 나타내는 데 11 바이트를 사용하는 것은 너무 나쁩니다. 그러나 ... “”2 바이트, ¤1 바이트, 데이터 자체는 6 바이트, 2 바이트가 남아 있습니다. 현재 그건 j하지만, ịØJ또는 ṃØJ훨씬 더, 그리고 (유니 코드 때문에) 일을하지 않습니다.
user202729

jli의 문자열 개념 ( "문자열은 인쇄에 영향을주는 특수 플래그가있는 정수 목록")이 훌륭합니다.
user202729

5

R , 128 , 125 바이트

Reduce(function(x,y)switch(y,i=x+1,d=x-1,m=x*2,h=x/2,P={cat(x);x}),substr(el(strsplit(gsub("e.*$","",scan(,""))," ")),1,1),0)

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

source(echo=FALSE)반환 값이 자동으로 인쇄되지 않도록하려면 호출해야합니다 . 대안은 모든 것을 감싸는invisible 것이지만 훨씬 덜 골프입니다 (그리고 여전히 멋진 바이트 수를 망칩니다).



2

빨강 , 121 바이트

func[s][v: 0 parse s[any[["i"(v: v + 1)|"d"(v: v - 1)|"m"(v: v * 2)|"h"(v: v / 2.0)|"P"(prin v)|"e"(exit)]thru" "| end]]]

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

읽을 수있는 :

f: func [s] [
    v: 0
    parse s [
        any [
            [ "i" (v: v + 1)
            | "d" (v: v - 1)
            | "m" (v: v * 2)
            | "h" (v: v / 2.0)
            | "P" (prin v)
            | "e" (exit)]
            thru [" " | end]
        ]
    ]
] 

2

파이썬 (2) , 131 (125) 122 121 118 117 115 바이트

v=0;o=""
for x in input().split("x")[0].split():
 if"Q">x:o+=`v`
 else:v+=(1,-1,v,-v/2.)['idmh'.find(x[0])]
print o

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

@Rod 덕분에 -6과 -3

@etene 덕분에 -3과 -2

로 교체 "Pri"==x하여 -1"P"in x


4 바이트절약 하는 대신 첫 번째 블록 을 사용할 수 있습니다 split."exit"break
Rod

1
당신은 주위에 괄호를 제거하고 대신 'idmh'사용할 수 있습니다 , 그러면 몇 바이트가 절약됩니다findindex
etene

@로드-실제로 그것을 조금 더 가져갈 수 있고 ex다른 2를 저장하기 위해 나눌 수 있습니다.
ElPedro

당신은 대체 할 수 v=(v+1,v-1,v*2,v/2.)와 함께 v+=(1,-1,v,-v/2.)작동해야하지만 테스트하지 않았다
로드

@로드-그것에 대해 생각했지만 어떻게 해야할지 모르겠습니다 half. 너무 간단합니다! 감사.
ElPedro

2

파이썬 3 , 110 91 82 바이트

exit 프로그램이 오류와 함께 종료됩니다.

x=0
for c in input():c=='P'==print(x,end='');x+=(1,-1,x,-x/2,c,0)['ndmhx'.find(c)]

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


변수 이름을 줄여 9 바이트를 절약하십시오. i='x+=1';d='x-=1';...다음에 exec호출로 변경exec(eval(c[0]))
mypetlion

@ mypetlion 감사하지만 더 나은 방법을 찾았습니다.
mbomb007

나는 이것이 유효하다고 생각한다 : 82 bytes
Lynn

@ 린 좋은! 나는 print성명서 를 단락시키는 좋은 방법을 생각할 수 없었다 !
mbomb007

2

자바 스크립트 (ES6), 83 79 바이트

@ l4m2 덕분에 4 바이트 절약

명령을 출력 또는 빈 문자열로 반복해서 바꿉니다.

s=>s.replace(/\S+./g,w=>m<s?'':w<{}?m:(m+={d:-1,e:w,i:1,m}[w[0]]||-m/2,''),m=0)

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

댓글

s =>                       // given the input string s
  s.replace(/\S+./g, w =>  // for each word w in s:
    m < s ?                //   if m is a string:
      ''                   //     ignore this instruction
    :                      //   else:
      w < {} ?             //     if w is 'Pri' ({} is coerced to '[object Object]'):
        m                  //       output the current value of m
      : (                  //     else:
          m +=             //       add to m:
            { d: -1,       //         -1 if w is 'dec'
              e: w,        //         w  if w is 'exit' (which turns m into a string)
              i: 1,        //         1  if w is 'inc'
              m            //         m  if w is 'mult'
            }[w[0]]        //       using the first character of w to decide
            || -m / 2,     //       or add -m/2 (for 'half') if the above result was falsy
        ''),               //       do not output anything
    m = 0                  //   m = unique register of our mighty CPU, initialized to 0
  )                        // end of replace()

s=>s.replace(/\S+./g,w=>k<s?'':w<{}?k:(k+={d:-1,e:w,i:1,m:k}[w[0]]||-k/2,''),k=0)
l4m2

@ l4m2 이것은 w<{}순수한 악이다 : p
Arnauld

s=>s.replace(/\S+./g,e=>m<s?'':e<{}?m:(m+={d:-1,e,i:1,m}[e[0]]||-m/2,''),m=0)또한 작동
l4m2

2

, 37 35 바이트

≔⁰ηF⎇№θx…θ⌕θxθ≡ιn≦⊕ηd≦⊖ηm≦⊗ηh≦⊘ηrIη

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. @RickHitchcock의 답변에서 영감을 얻었습니다. 설명:

≔⁰η

변수를 지우십시오.

F⎇№θx…θ⌕θxθ≡ι

입력이있는 x경우 입력을 자른 다음 입력 의 나머지 문자를 반복하여 켭니다.

n≦⊕η

nN 변수 시킬지.

d≦⊖η

d d 는 변수를 증가시킵니다.

m≦⊗η

m m 은 변수를 2만큼 곱한다 (즉, 2 배).

h≦⊘η

h H는 변수 알베스.

rIη

rp r 은 변수를 문자열로 캐스트합니다.


1
@RickHitchcock 죄송합니다. 충분히 테스트하지 않았습니다. 해결 방법을 찾았지만 바이트가 필요했습니다.
Neil

2

자바 스크립트 (ES6), 77 75 바이트

@Arnauld가 변수 이름 으로 사용하여 2 바이트를 절약하는 트릭을 훔쳤습니다 ( stole ) m.

f=([c,...s],m=0)=>c<'x'?(c=='P'?m:'')+f(s,m+({h:-m/2,d:-1,n:1,m}[c]||0)):''

문자열을 재귀 적으로 걸어 가면서 명령 당 고유 한 문자를 찾고 나머지는 무시합니다.

  • n : Inc
  • d : 12 월
  • m : 복수
  • h : 반
  • P : Pri
  • x : 이탈

사실을 이용한다 undefined보다도 이하도 큰 'x'문자열의 끝에서 중지에 재귀가 발생, 또는 가 발생하는 경우 'x'종료 .


1
물론 더 이상 응답 할 수없는 삭제 된 주석에 이어 수정 된 코드 (d' oh!)에 대한 링크를 붙여 넣는 것을 잊어 버렸지 만 어쨌든 원래 시도보다 2 바이트 짧은 새로운 접근법을 발견했습니다.
Neil


1

자바 스크립트 (Node.js) , 91 바이트

_=>_.split` `.map(o=>o<{}>!_?S+=+i:o<"e"?i--:o<"f"?++_:o<"i"?i/=2:o<"j"?i++:i*=2,i=S="")&&S

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

자바 스크립트 (Node.js) , 96 바이트

_=>_.split` `.map(o=>F?0:o<"Q"?S+=i:o<"e"?i--:o<"f"?F=1:o<"i"?i/=2:o<"j"?i++:i*=2,F=i=0,S="")&&S

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

JavaScript (Node.js) , 99 바이트

s=>s.split` `.map(_=>eval('++i7--i7++e7u+=+i7i*=27i/=2'.split(7)[Buffer(e+_)[0]%11%6]),e=i=u='')&&u

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


1

자바 스크립트, 107 바이트

s=>eval('x=0;x'+(s.split` `.map(v=>({i:"++",d:"--",m:"*=2",h:"/=2",P:";alert(x)",e:"//"})[v[0]]).join`;x`))


1

루아, 207 바이트

s=0;n=0;for a in io.read():gmatch'.'do if s==0 then s=1;n=a=='i'and n+1 or a=='d'and n-1 or a=='m'and n*2 or a=='h'and n/2 or n;if a=='P'then print(n)elseif a=="e"then break end elseif a==' 'then s=0 end end

1

파이썬 (3) , 114 (110) 109 116 바이트

실제로는 exec명령문 이므로 괄호가 필요하지 않기 때문에 Python 2에서 실제로 2 바이트를 덜 사용했을 것입니다 ...

  • @ElPedro 덕분에 4 바이트 추가 저장

  • find오류시 -1 을 반환 한다는 사실을 이용하여 추가 바이트를 절약 한 후 인덱스로 사용할 수 있습니다.

  • 줄 바꿈 없음 규칙을 알지 못했기 때문에 +7 바이트 :(

i=0;exec(";".join("i+=1 i-=1 i*=2 i/=2 print(i,end='') exit()".split()["idmhP".find(h[0])]for h in input().split()))

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

모든 입력 단어의 첫 문자를 Python 코드에 매핑합니다. 그런 다음 이들은 연결되고 exec편집됩니다.

꽤 간단한 접근 방식으로, 아마도 조금 더 골프를 칠 수 있습니다. 어려움은 대부분 가능한 많은 것 중에서 가장 짧은 형태를 찾는 데 있습니다 ...


112 온라인으로 사용해보십시오! 공백으로 분리 된 문자열로 명령이 있으면 분할하십시오.
ElPedro

1
실제로 브라켓으로 갈 수있는 110 건 온라인
ElPedro

이것은 올바른 출력을 제공하지 않습니다. 질문은 구분 기호없이 인쇄해야하므로 필요합니다 print(i,end=''). 네 번째 테스트 사례를 참조하십시오.
mbomb007

나는 눈치 채지 못했고, 고칠 것이다. 감사 !
etene

당신이 그것을 고쳤을 때 @etene 코멘트 그리고 내 downvote를 제거합니다.
mbomb007

1

루비 + -na, 81 73 65 바이트

x=0;$F.map{|w|eval %w{x+=1 x-=1 1/0 $><<x x*=2 x/=2}[w.ord%11%6]}

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

꽤 직설적 인. 각 단어의 첫 글자에 해당하는 명령 문자열과 해당 문자열을 찾으 eval십시오. 정수 나누기를 사용하고 exits를 던집니다 ZeroDivisionError.

-5 바이트 : .ord%11%6문자열 조회 대신 사용하십시오 . 신용은 사용자에게 간다

-3 바이트 : .ord문자열의 첫 번째 문자 만 고려하므로 a를 건너 뛸 수 있습니다 [0].

-8 바이트 : Kirill L-a 덕분에 플래그를 사용 하여 입력을 자동 분할합니다 .


1
당신은 추가하여 더 많은 바이트를 저장할 수 있습니다 -a처럼, 당신을 위해 자동 구분을 할 옵션
키릴 L.를

1

이모티콘 코드 , 270 바이트

🐖🔥🍇🍮c 0🔂j🍡💣🐕🔟 🍇🍊😛j🔤inc🔤🍇🍮c➕c 1🍉🍋😛j🔤dec🔤🍇🍮c➖c 1🍉🍋😛j🔤mult🔤🍇🍮c✖️c 2🍉🍋😛j🔤half🔤🍇🍮c➗c 2🍉🍋😛j🔤Pri🔤🍇👄🔡c 10🍉🍓🍇🍎🍉🍉🍉

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

🐋🔡🍇
🐖🔥🍇
🍮c 0
🔂j🍡💣🐕🔟 🍇
🍊😛j🔤inc🔤🍇🍮c➕c 1🍉
🍋😛j🔤dec🔤🍇🍮c➖c 1🍉
🍋😛j🔤mult🔤🍇🍮c✖️c 2🍉
🍋😛j🔤half🔤🍇🍮c➗c 2🍉
🍋😛j🔤Pri🔤🍇👄🔡c 10🍉
🍓🍇🍎🍉🍉🍉🍉

🏁🍇
 🔥🔤inc inc inc dec Pri exit🔤
😀🔤🔤
 🔥🔤dec inc mult inc inc Pri🔤
😀🔤🔤
 🔥🔤inc inc inc mult half Pri exit inc🔤
😀🔤🔤
 🔥🔤inc Pri inc Pri inc Pri exit half mult🔤
😀🔤🔤
 🔥🔤Pri exit🔤
😀🔤🔤
 🔥🔤inc half Pri exit🔤
🍉

0

SNOBOL4 (CSNOBOL4) , 165 바이트

	P =INPUT ' exit ' 
	x =0
S	P LEN(1) $ L ARB ' ' REM . P	:S($L)F(end)
i	X =X + 1	:(S)
d	X =X - 1	:(S)
P	O =O X		:(S)
m	X =X * 2	:(S)
h	X =X / 2.	:(S)
e	OUTPUT =O
END

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

심한.

	P =INPUT ' exit ' 				;* append ' exit ' to the input to guarantee that the program will stop
	x =0						;* initialize x to 0 else it won't print properly if the program is 'Pri'
S	P LEN(1) $ L ARB ' ' REM . P	:S($L)F(end)	;* set L to the first letter of the word and goto the appropriate label
i	X =X + 1	:(S)
d	X =X - 1	:(S)
P	O =O X		:(S)				;* append X to the output string
m	X =X * 2	:(S)
h	X =X / 2.	:(S)				;* divide by 2. to ensure floating point
e	OUTPUT =O					;* print whatever's in O, which starts off as ''
END

0

C # (. NET 코어), 186 바이트

class P{static void Main(string[]a){int v=0;foreach(var s in a){var i=s[0];if(i=='i')v++;if(i=='d')v--;if(i=='m')v*=2;if(i=='h')v/=2;if(i=='P')System.Console.Write(v);if(i=='e')break;}}}

당신은 선언과 같은 몇 가지 간단한 일을 수행하여이 떨어져 26bytes를 면도 할 수 i와 함께 v, 당신은 작은 숫자를 사용할 수 있도록 ASCII 테이블 컨설팅의 정리 if: S를하고 원계 사용하여 class Z{static void Main(string[]a){int v=0,i;foreach(var s in a){i=s[0]%'d';if(i==1)break;if(i>9)System.Console.Write(v);else v=i<1?v-1:i<5?v/2:i<6?v+1:v*2;}}}사용 (PS 작동 방법에 대한 설명을하는 방법 그것은 (예를 들어 명령 줄 인수를 기대합니다) 항상 감사합니다!)
VisualMelon

(아, 그건 창피하다 ... %50대신에 사용해야한다 %'d')
VisualMelon

0

펄 5 -a , 61 바이트

eval'$,'.qw(++ -- ;exit ;print$,||0 *=2 /=2)[(ord)%11%6]for@F

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

@ user202729의 ord%11%6속임수

어떻게?

-a            # split the input by whitespace, store in @F
eval          # Execute the string that results from:
'$,'          # $, (the accumulator)
.             # appending:
qw(           # create an array for the following whitespace separated values:
++ --            # operators for inc & dec
;exit            # exit
;print$,||0      # Pri  (||0 ensures that 0 is output if accumulator is null
*=2 /=2)         # mult div
[(ord)%11%6] # @user202729's trick selects one of the preceding operations
for@F        # for every term input

0

피 이스, 44 바이트

Vmx"idmhPe"hdcwd=Z@[hZtZyZcZ2ZZ)NIqN4pZIqN6B

테스트 스위트

설명

Vmx"idmhPe"hdcwd=Z@[hZtZyZcZ2ZZ)NIqN4pZIqN6B   ## full program
             cwd                               ## split input on space
Vmx"idmhPe"hd                                  ## iterate through list of numbers corresponding to operators
                =Z@[hZtZyZcZ2ZZ)N              ## assign the variable Z (initialliy Zero) it's new value
                                 IqN4pZ        ## print Z if the current operator is "Pri" (4)
                                       IqN6B   ## break if the current operator is "exit" (5)

0

TI-BASIC, 112 바이트

이것은 AFAIK가 완전히 수용 가능한 일부 가정을 이용합니다. 첫 번째는 모든 변수가 실행 전에 0으로 초기화된다는 것입니다. 두 번째 입력은를 통해 이루어 Ans집니다.

Ans+" E→Str1
While 1
I+4→I
sub(Str1,I-3,1→Str2
A+(Ans="I")-(Ans="D
If inString("MH",Str2
Then
I+1→I
2AAns+A/2(1-Ans
End
If Str2="P
Disp A
If Str2="E
Stop
Ans→A
End

0

자바 (OpenJDK 8) 164 바이트

a->{int c=0;for(String g:a.split(" ")){char b=g.charAt(0);if(b==105)c++;if(b==100)c--;if(b==109)c*=2;if(b==104)c/=2;if(b==80)System.out.print(c);if(b==101)return;}}

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

위는 정수로 반올림하는 솔루션이지만 아래는 소수를 처리하는 솔루션입니다. 자바가 두 배로 인쇄하는 독창적 인 방법은 점수에 55 바이트를 더 추가합니다. 두 번째 제출에서 코드를 더 읽기 쉽도록 새 줄을 남겼습니다. 하나의 추가 명령과 import 문이있는 본질적으로 동일한 솔루션이기 때문입니다.

자바 (OpenJDK 8) , 219 바이트

a->{
double c=0;
for(String g:a.split(" ")){
char b=g.charAt(0);
if(b==105)c++;
if(b==100)c--;
if(b==109)c*=2;
if(b==104)c/=2;
if(b==80)System.out.print(new DecimalFormat("0.#").format(c));
if(b==101)return;}}

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


0

C (GCC) , 120 (114) 111 바이트

ceilingcat 덕분에 -6 바이트

x,d;f(char*s){for(x=0;s>1;s=index(d^1?s:"",32)+1)d=*s-100,x+=d?d==5:-1,x*=d^9?d^4?1:.5:2,d+20||printf("%d",x);}

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

124 바이트

부동 소수점 버전 :

d;f(char*s){for(float f=0;s>1;s=strchr(s,32)+1)d=*s-80,f+=d==25,f-=d==20,f*=d^29?d^24?1:.5:2,s=d^21?s:"",d?:printf("%f",f);}

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

나는 반올림하는 버전을 귀찮게하지 않았지만 주석 체인을 올바르게 이해하면 허용되는 0을 제외합니다.


0

33 , 62 바이트

s'i'{1a}'d'{1m}'m'{2x}'h'{2d}'P'{o}'e'{@}It[mzsjk""ltqztItn1a]

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

이 프로그램은 줄 바꿈으로 구분 된 지시 사항을 따릅니다.

설명:

It[mzsjk""ltqztItn1a]
  [mz            n1a] | Forever
It    jk       It     | - Get the first character of the next instruction
            qz        | - Call the function declared previously
     s  ""lt  t       | - Make sure we don't lose track of the variable

해당 세그먼트 앞의 코드는 모든 기능을 정의합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.