이 도전은 나의 첫 비의 언어 인 백핸드 를 축하하기 위해 만들어졌습니다 !
백핸드는 비선형 포인터 흐름이있는 1 차원 언어입니다. 포인터는 한 번에 세 단계 씩 이동하며 세 번째 명령마다 실행됩니다.
프로그램 1..1..+..O..@
은 종료하기 전에 1 + 1을 추가하고 2를 출력합니다. 중간 명령어는 건너 뛰므로 1<>1()+{}O[]@
정확히 같은 프로그램입니다.
포인터가 테이프 끝에서 떨어지려고 할 때 대신 방향을 바꾸고 다른 방향으로 1.@1.O+.
갑니다. 같은 프로그램도 마찬가지입니다. 종료 명령은 한 번만 계산합니다. 이를 통해 다음과 같이 대부분의 선형 프로그램을 압축 할 수 있습니다1O+1@
여기서 과제는 문자열을 취하는 프로그램이나 함수를 작성하고 프로그램이 백핸드와 같이 해석 될 때 실행될 명령을 출력하는 것입니다 (실제 백핸드 명령을 처리 할 필요는 없습니다). 포인터가 문자열의 마지막 문자에 도달 할 때까지만 출력해야합니다 (이 시점에서 실행은 일반적으로 뒤로 이동합니다).
그러나 기다려라 , 그게 전부가 아니다! 프로그램 자체가 이러한 방식으로 해석되면 결과 코드는 다음 중 하나를 출력해야합니다.
(Mostly) works
Turing complete
'Recreational'
(따옴표는'
또는 중 하나"
일 수 있지만 둘 다일 수는 없습니다)Perfectly okay
Only a few bugs
예를 들어, 소스 코드가 code 2 backhand
인 경우 프로그램 ce cankb od2ahd
은 다음 구문 중 하나를 출력해야합니다.
테스트 사례 :
"1 1 + O @" -> "11+O@"
"1O+1@" -> "11+O@"
"HoreWll dlo!" -> "Hello World!"
"abcdefghijklmnopqrstuvwxyz" -> "adgjmpsvyxurolifcbehknqtwz"
"0123456789" -> "0369" (not "0369630369")
"@" -> "@"
"io" -> "io" (Cat program in Backhand)
"!?O" -> "!?O" (Outputs random bits forever in Backhand)
"---!---!" -> "-!-----!"
그리고 물론 백핸드로 작성된 참조 프로그램 ( 이것은 약간 버그가있을 수 있습니다. 알겠습니다.
규칙.
- 표준 허점 은 금지되어 있습니다
- 첫 번째 프로그램의 입력 (바이트이며, 인쇄 가능한 ASCII 줄 바꿈이 포함됩니다
0x20
–0x7E
뿐만 아니라 0x0A로) - 두 번째 프로그램을 첫 번째 바이트에서 UTF-8 문자로 변환할지 여부를 선택할 수 있습니다.
- 두 번째 프로그램 :
- 대소 문자는 중요 하지 않으므로
pErFectLy OKay
원하는 경우 출력이 될 수 있습니다 . - 후행 / 선행 공백 (줄 바꿈, 탭, 공백)도 괜찮습니다.
- 두 번째 프로그램은 첫 번째와 같은 언어 여야하지만 반드시 같은 형식 일 필요는 없습니다 (프로그램 / 기능)
- 여분의 문구에 대한 의견 제안이 너무 짧지 않은 한 기쁘다.
- 대소 문자는 중요 하지 않으므로
- 이것이 code-golf 이므로 귀하의 목표는 귀하의 언어에 대한 최단 답변을 얻는 것입니다!
- 2 주 안에 최단 백핸드 답변에 200 개의 현상금을 수여합니다.
답변
R 187 바이트
# c a t ( ' P e r f e c t l y o k a y ' ) #
g=function(x,n=nchar(x),i=c(1:n,(n-1):1,2:n),j=seq(1,3*n-2,3),k=i[j][1:which(i[j]==n)[1]])cat(substring(x,k,k),sep='')
마지막에 단일 공간이 필요하므로 \n
프로그램을 적용 할 때 인쇄되지 않습니다.
설명
1 부:
언 골프 드 :
# c a t ( ' P e r f e c t l y o k a y ' ) #
g <- function(x) {
n <- nchar(x) # number of characters in string
i <- c(1:n, (n - 1):1, 2:n) # index: 1 to n, n-1 back to 1, 2 to n
j <- seq(1, 3 * n - 2, 3) # every third element of i
k <- i[j][1:which(i[j] == n)[1]] # the elements of i at indices j, up to the first appearance of n
cat(substring(x, k, k), sep = "") # extract from x the characters at indices k, and paste them together
}
2 부:
이 함수는 전체 프로그램에서 작동 할 때이를 생성합니다.
cat('Perfectly okay')#=ni(ncr)=1,-:2)=q,n,,i]:i(j=[]assi(k)e'
답변
파이썬 (2) , 163 (130) 127 (121) 115 99 96 바이트
i=input() ###
print(i+i[-2:0:-1]+i)[:len(i)*(len(i)%3%2or 3):3]
#'p lr+yi n'ottk(ca'eyPf'er)
출력 :
int #rt+-01i:n)l(%2 :
print('Perfect' + # 33o3ie*(l)]:2i(i
#(p=iu)#pni[:-+[ei(n)%r)]
'ly okay')
답변
펄 6 , 101 86 바이트
와우, 첫 번째 프로그램을 대폭 개선하여 nwellnhof 덕분에 -25 바이트
##
{S:g/(.).?.?/$0/}o{.comb%3-1??.chop~.flip~S/.//!!$_} #
#}{ "" s( kM ro os wt l )y.
더 많은 사람들이 이와 같은 반등을 활용하기를 바랍니다. 백핸드 프로그램은
#{g.?//{o%1.o.iS/!}
{"(Mostly) works"}#_!.~l~h?-bco0?.(:
#S/).$}.m3?cpfp//$ # .
어떤 의견에 대한 의견 {"(Mostly) works"}
.
답변
05AB1E , 43 40 38 37 바이트
@Emigna 덕분에 -2 바이트 (40 → 38) .
„€€Ã€„Ѐ€µ'€Ý)\[ûDN3*©è ?®IgD#<ÖNĀ*#
온라인으로 사용해보십시오 . (추신 :에서 언어를 전환 05AB1E (레거시) 에 05AB1E 테스트 케이스에 대해 0123456789
. 레거시 버전은 빠른이지만, 앞에 0이 번호 입력에 대한 잘못된 결과를 보여줍니다.)
‘백핸드’프로그램은 다음과 같습니다.
„ÃеÝ[N© I#N#
perfectly okay
전체 소문자로 출력 됩니다.
기본 프로그램 설명 :
„€€Ã€ # Push the string "the pointed"
„Ѐ€µ # Push the string "dm one"
'€Ý '# Push the string "been"
) # Wrap the entire stack in a list
\ # And remove that list from the stack again
[ # Start an infinite loop
û # Palindromize the string at the top of the stack
# i.e. "1O+1@" becomes "1O+1@1+O1" the first iteration,
# and "1O+1@1+O1O+1@1+O1" the next iteration, etc.
D # Duplicate the palindromized string
N3* # 0-indexed index of the loop multiplied by 3
© # Save it in the register (without popping)
è? # Index into the string and print the character
Ig # If the length of the input is exactly 1:
# # Stop the infinite loop
® D <Ö # If the value from the register is divisible by the length - 1
* # And
NĀ # The 0-indexed index of the loop is NOT 0:
# # Stop the infinite loop
‘백핸드’프로그램 설명 :
„ÃÐµÝ # Push the string "perfectly okay"
[ # Start an infinite loop
N© # Push the index, and store it in the register (without popping)
I # Push the input (none given, so nothing happens)
# # If the top of the stack is 1, stop the infinite loop
N # Push the index again
# # If the top of the stack is 1, stop the infinite loop
단계별로 다음이 발생합니다.
„ÃеÝ
: 스택이됩니다["perfectly okay"]
[
: 무한 루프 시작- (첫 번째 루프 반복)
N©
: STACK이["perfectly okay", 0]
- (첫 번째 루프 반복)
I
:["perfectly okay", 0]
입력이 없으므로 STACK이 유지됩니다. - (첫 번째 루프 반복)
#
: STACK이되고["perfectly okay"]
루프는 계속됩니다 - (첫 번째 루프 반복)
N
: STACK이["perfectly okay", 0]
- (첫 번째 루프 반복)
#
: STACK이되고["perfectly okay"]
루프는 계속됩니다 - (두 번째 루프 반복)
N©
: STACK이["perfectly okay", 1]
- (두 번째 루프 반복)
I
:["perfectly okay", 1]
입력이 없으므로 STACK이 유지됩니다. - (두 번째 루프 반복)
#
: STACK이되고 (truthy)["perfectly okay"]
때문에 루프가 중단됩니다.1
- 스택 맨 위를 STDOUT에 내재적으로 인쇄합니다.
perfectly okay
TIO의 디버거가 활성화 된 단계는 여기를 참조하십시오.
내이 05AB1E 팁을 참조하십시오 (섹션 어떻게 사전을 사용하는 방법을? ) 이유를 이해 할 수 „€€Ã€„Ѐ€µ'€Ý
있는 the pointed
, dm one
그리고 been
하고 „ÃеÝ
있다 perfectly okay
.
이전 38 바이트 버전 :
„€€Ã€„Ѐ€µ'€Ý)\ giqë¬?[ûDN>3*©è?®Ig<Ö#
온라인으로 사용해보십시오 . (추신 :에서 언어를 전환 05AB1E (레거시) 에 05AB1E 테스트 케이스에 대한 0123456789
및 @
레거시 버전은 빠르고이지만, 앞의 0 또는 단일 문자 입력과 번호 입력에 대한 잘못된 결과를 보여줍니다.).
‘백핸드’프로그램은 다음과 같습니다.
„ÃÐµÝ q?D3èIÖ<®©>û¬i\€€„€€€€')gë[N*?g#
( q
종료점은 프로그램을 종료하고 다른 모든 것을 운영하지 않는 곳)
답변
파이썬 2 , 130 바이트
p='r'#i n t ' P e r f e c t l y o k a y ' #
s=input();S=s+s[-2:0:-1]+s
print S[:len(~-len(s)%3and S or s):3]
답변
자바 스크립트 (ES6), 130 바이트
조기 시도. 매우 만족스럽지 않습니다.
f =/*> " P e r f e c t l y o k a*/y=>""+/**/(g=p=>(c=y[p])?m++%3?g(p+d):y[p+1]?c+g(p+d):c:g(p-d-d,d=-d))(m=0,d=1)
코드 자체가 처리되면 다음 문자가 분리됩니다.
f =/*> " P e r f e c t l y o k a*/y=>""+/**/…
^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^
이것은 다음을 제공합니다.
f=>"Perfectly okay"//…
답변
젤리 , 34 바이트
JŒḄȧ`ȯ“”NNŒḄ2¡3s@”]ȧZỴḢḢ»`Qị⁸ȧ@11€
(각각) 인쇄하거나 출력하는 문자 목록을 허용하는 전체 프로그램 또는 모나 딕 링크.
온라인으로 사용해보십시오! 또는 테스트 스위트를 참조하십시오.
백핸드 구문 분석 코드는 다음과 같습니다.
Jȧ“N2s]Ỵ»ị@€
전체 프로그램 또는 닐라 딕 링크 인쇄 또는 (각각) 튜링 완료 .
어떻게?
JŒḄȧ`ȯ“”NNŒḄ2¡3s@”]ȧZỴḢḢ»`Qị⁸ȧ@11€ - Main Link: list of characters e.g. 'abcd'
J - range of length [1,2,3,4]
ŒḄ - bounce [1,2,3,4,3,2,1]
` - use as both arguments of:
ȧ - logical AND [x AND x = x]
“” - literal empty list of characters
ȯ - logical OR [when x is truthy: x OR y = x]
N - negate }
N - negate } together a no-op
¡ - repeat this...
2 - ... two times:
ŒḄ - bounce [1,2,3,4,3,2,1,2,3,4,3,2,1,2,3,4,3,2,1,2,3,4,3,2,1]
3 - literal three
s@ - split into (threes) [[1,2,3],[4,3,2],[1,2,3],[4,3,2],[1,2,3],[4,3,2],[1,2,3],[4,3,2],[1]]
”] - literal ']' character
ȧ - logical AND [']' is truthy so a no-op]
Z - transpose [[1,4,1,4,1,4,1,4,1],[2,3,2,3,2,3,2,3],[3,2,3,2,3,2,3,2]]
Ỵ - split at new lines [no newline characters exist in this list of ints so effectively wrap in a list]
Ḣ - head [undo that wrap]
Ḣ - head [get the first of the transposed split indices]
- [1,4,1,4,1,4,1,4,1]
` - use as both arguments of:
» - maximum [max(x, x) = x]
Q - de-duplicate [1,4]
⁸ - chain's left argument (the input)
ị - index into it "ad"
11€ - literal eleven for €ach (of input)
ȧ@ - logical AND with swapped args [[11,11,...,11] is truthy]
- "ad"
- (as a full program implicit print)
백핸드 구문 분석 코드는 다음과 같습니다.
Jȧ“N2s]Ỵ»ị@€ - Main Link: no arguments
J - range of length (of an implicit 0, treated as [0]) -> [1]
“N2s]Ỵ» - compression of "Turing complete"
ȧ - logical AND [[1] is truthy] -> "Turing complete"
€ - for each character in the list of characters:
@ - with swapped arguments (an implicit 0 is on the right, so f(0, "Turing complete"))
ị - index into
- (as a full program implicit print)