작업 : 정확히 하나의 문자로 구성된 입력이 주어지면 <>^v
화살표 방향의 인쇄 가능한 ASCII 문자 (공백에서 물결표까지)로 구성된 두 번째 입력을 출력합니다.
프로그램에 대한 두 번째 입력이이라고 가정 해 봅시다 ABC
. 이것이해야 할 일입니다.
- 입력
>
: 인쇄ABC
. - 입력
<
: 인쇄CBA
. - 입력
^
: 인쇄C\nB\nA
또는 입력이 -90 ° 회전했습니다. - 입력
v
: 인쇄A\nB\nC
또는 입력이 90 ° 회전했습니다.
테스트 사례
input => \n output
---
">", "thanks!" =>
thanks!
---
"<", "Hello, World!" =>
!dlroW ,olleH
---
"^", "This is text." =>
.
t
x
e
t
s
i
s
i
h
T
---
"v", "Tokyo" =>
T
o
k
y
o
---
"<", ">>>" =>
>>>
이것은 code-golf 이므로 바이트 단위의 가장 짧은 프로그램이 승리합니다.
답변
MATL , 10 6 바이트
Martin 덕분에 4 바이트가 절약되었습니다!
19\qX!
19\ % implicitly take input (a character) and compute mod-19 of its ASCII code
q % subtract 1. Gives 17, 2, 3, 4 for the characters '^<v>' respectively.
% These numbers correspond to 1, 2, 3, 4 modulo 4, and so are the numbers
% of 90-degree rotations required by each character
X! % implicitly take input (string). Rotate the computed number of times
% in steps of 90 degrees. Implicitly display
모듈로 연산이없는 이전 버전 : 10 바이트
'^<v>'=fX!
'^<v>' % push string
= % implicitly take input (a char) and test for equality
f % find index of matching character
X! % implicitly take input (string). Rotate that number of times
% in steps of 90 degrees. Implicitly display
답변
파이썬 3, 64 51 48 바이트
xnor 덕분에 6 바이트를 절약했습니다.
Lynn 덕분에 7 바이트가 절약되었습니다.
저장된 3에서 DSM 모건 덕분 바이트 정도 파이썬.
lambda c,s:'\n'[c<'?':].join(s[::1|-(c in'<^')])
이 함수는 다음 문자 중 하나를 허용합니다. <>^v
첫 번째 인수로 를, 두 번째 인수로 회전해야하는 문자열을 허용합니다.
더 읽기 쉬운 버전은 다음과 같습니다.
lambda c, s: ('\n' if c in '^v' else '').join(s[::-1 if c in'<^' else 1])
답변
하스켈, 57 바이트
f">"=id
f"<"=reverse
f"v"=init.((:"\n")=<<)
f _=f"<".f"v"
사용 예 : f "v" "ABC"
-> "A\nB\nC"
.
방향 >
의 idendity 기능입니다 <
그것의 인수를 반전 v
문자열의 각 문자에 줄 바꿈을 추가하고 마지막을 삭제하고 ^
있다 v
다음 <
.
답변
apt, 9 바이트
VzUc %B+1
@DonMuesli의 답변에서 영감을 얻었지만 CJam이 정확히 동일한 기술을 사용하는 것을 보았습니다. 온라인으로 테스트하십시오!
작동 원리
// Implicit: U = arrow char, V = text
Uc %B // Take the char code of U, mod 11.
// This converts ">", "v", "<", and "^" to 7, 8, 5, and 6, respectively.
Vz +1 // Add one and rotate V by 90° clockwise that many times.
답변
CJam, 13 바이트
l(iB%{W%z}*N*
입력은 회전 할 문자열 바로 뒤에 오는 방향 문자입니다.
설명
모듈로 마술을 위해 예. 4 개의 문자 modulo 11을 취하면 다음과 같이 매핑됩니다.
> 7
v 8
< 5
^ 6
이들은 모두 별개의 모듈로 4이며 더 중요하게는 깔끔하게 증가하고 3, 0, 1, 2
있습니다. 즉, 우리는 mod 11
회전 결과를 사용하여 얼마나 자주 회전해야하는지 결정할 수 있습니다 ( mod 4
어쨌든 네 번의 회전이 작동하지 않기 때문에 명시적인 필요 없음). 우리는 일반적으로 이러한 숫자를 1만큼 오프셋해야합니다. >
실제로 산출 8
하고 no-op가됩니다. 그러나 숫자를 회전시키는 방식은 실제로 첫 번째 응용 프로그램의 문자열을 뒤집어 항상 하나의 회전을 무료로 얻습니다.
l e# Read input.
(i e# Pull off the first character and convert to its character code.
B% e# Modulo 11.
{ e# That many times...
W% e# Reverse... on the first iteration this reverses the string. Afterwards
e# we'll have an Nx1 or 1xN grid of characters on the stack, where
e# this reverses the rows instead.
z e# Transpose. On the first iteration, this simply wraps the string in
e# array, turning it into a grid without changing its orientation further
e# beyond the reversal that just happened. On subsequent iterations, a
e# transpose combined with reversing the rows rotates the grid 90 degrees
e# clockwise.
}*
N* e# Join with linefeeds.
답변
피스, 17 15
jWgz\^_W}z"<^"w
여기에서 시도 하거나 Test Suite를 실행하십시오.
Jakube 덕분에 2 바이트가 절약되었습니다!
또는 모드 트릭을 사용하십시오.
@s_MBjBz)h%Cw11
답변
줄리아, 51 바이트
f(d,s)=join(d∈"<^"?reverse(s):s,d∈"^v"?"\n":"")
이것은 a Char
와 문자열 을 받아들이고 문자열을 반환 하는 함수입니다 .
하자 d
방향을 나타내는 문자를하고 s
문자열합니다. 경우 d
왼쪽 또는까지, 우리는의 반대를 사용 s
그렇지 않으면 우리가 사용하기 s
로 주어진. d
왼쪽이나 오른쪽 이면 구분 기호를 빈 문자열로, d
위쪽이나 아래쪽 이면 줄 바꾸기 를 구성합니다. 문자열과 구분 기호를로 전달하면 문자열의 join
각 문자 사이에 구분 기호가 삽입되고 문자열이 반환됩니다.