( 이 도전에서 영감을 얻었습니다 .)
string이 있다고 가정 해 봅시다 ABBCBA
. 우리는 사이 상승이 있음을 말할 수 A
와 B
를 들어, B
다음과 A
; 우리는 사이에 실행이 있다고 말할 수 B
와 B
아무것도 변경; 그리고 마지막으로 우리는 사이에 가을이 말할 수 C
와는 B
. 다음과 같이 그래프를 그릴 수 있습니다.
A B B C B A
Rising: o o
Continuing: o
Falling: o o
레이블이없고 공백을 최소화합니다.
o o
o
oo
이것은 입력에 대한 예상 출력입니다 ABBCBA
.
공백이 아닌 문자를 사용 o
하여 출력 을 바꿀 수 있습니다 . 또한 각 열은 선택적으로 다음과 같이 여분의 공간을 가질 수 있습니다.
o o
o
o o
입력은 3 자 이상으로 구성됩니다. 문자열은 모두 대문자로 구성되지만 대신 소문자를 사용할 수 있습니다.
테스트 사례
TEST CASE
LINE 1
LINE 2
LINE 3
HELLOWORLD
o oo o
o
o o oo
TESTCASE
oo o
o oo o
EXAMINATION
o o o o o
o o o o o
ZSILENTYOUTH
o ooo o
oo o o oo
ABC
oo
ABCBA
oo
oo
답변
젤리 , 11 바이트
OIṠ“ o ”ṙZY
온라인으로 사용해보십시오! 또는 모든 테스트 사례를 확인하십시오 .
작동 원리
OIṠ“ o ”ṙZY Main link. Argument: s (string)
O Ordinal; replace all characters with their code points.
I Increments; compute the differences of consecutive code points.
Ṡ Sign function.
“ o ”ṙ Rotate that string -1, 0, or 1 unit(s) to the left.
Z Zip; transpose rows and columns.
Y Join, separating by linefeeds.
답변
매스 매 티카, 93 83 68 64 바이트
(가 0
아닌 사용 O
)
Row[Column@Insert[{,},0,2-#]&/@Sign@Differences@LetterNumber@#]&
설명
LetterNumber@#
입력의 각 문자의 알파벳 위치를 가져옵니다.
Sign@Differences@
각 연속 요소 간의 차이를 취하고 부호를받습니다 ( -1
음수 / 하강, 0
0 / 계속, 1
양수 / 상승)
Insert[{,},0,2-#]&
상승하는 경우 첫 번째 위치, 계속 진행중인 경우 중간, 떨어지는 경우 세 번째 위치 0
에 2 Null
s 목록에 a를 삽입합니다 .
Row[Column@ ... ]
출력을 형식화합니다.
출력이 문제의 출력과 다르게 보일 수 있으면 위의 코드가 41 바이트로 단축 될 수 있습니다.
ListPlot@*Sign@*Differences@*LetterNumber
… “ABBCBA”의 경우 다음과 같이 생성됩니다.
답변
MATL , 15 , 14 바이트
dZSqtQtQv~79*c
설명:
그들은 그림이 천 단어의 가치가 있다고 말합니다. 따라서 베타 온라인 인터프리터 가 스택의 가치를 업데이트 할 때 실시간으로 보여줍니다. 아직 베타 버전이므로 여러 번 실행해야 할 수도 있습니다.
먼저을 호출 dZS
합니다. d
각 연속 요소의 차이를 제공하고 각 요소 ZS
의 부호 (-1, 0 또는 1)를 제공합니다. 따라서 ‘HELLOWORLD’를 입력으로 사용하면 첫 번째 단계 후에 다음을 얻게됩니다.
-1 1 0 1 1 -1 1 -1 -1
이제 우리는 q
이것을 줄이고 다음을 얻습니다.
-2 0 -1 0 0 -2 0 -2 -2
그런 다음 스택의 상단을 복제하고 배열을 증가시킵니다 ( tQ
).
-2 0 -1 0 0 -2 0 -2 -2
-1 1 0 1 1 -1 1 -1 -1
0 2 1 2 2 0 2 0 0
이제 모든 ‘0’은 문자를 출력하려는 위치입니다. 따라서이 세 배열을 행렬로 결합 v
하고 ( ~
) 논리적으로 부정합니다 ( ). 그런 다음 행렬의 모든 값에 ASCII 값 ‘O'(( 79*
))를 곱하고을 사용하여 문자열로 표시합니다 c
.
답변
하스켈, 63 바이트
f w=[do(e,y)<-zip w$tail w;max" "['o'|b e y]|b<-[(<),(==),(>)]]
출력 라인을 나타내는 세 개의 문자열 목록을 리턴합니다. 잠재 메시지가 없습니다.
dianne 은 목록 이해와 do
및 max
대신 표기법 을 사용하여 3 바이트를 절약했습니다 last
.
답변
CJam , 19 바이트
l2ew{:-g)S3*0t}%zN*
0
대신에 사용 합니다 o
.
설명
l e# Read input.
2ew e# Get all pairs of consecutive letters.
{ e# Map this block over the pairs...
:- e# Compute the difference between the two letters.
g e# Signum. Gives -1 for rises, 1 for falls, 0 otherwise.
) e# Increment. Gives 0 for rises, 2 for falls, 1 otherwise. Call this i.
S3* e# Push a string with three spaces.
0t e# Replace the i'th space (zero-based) with a zero.
}%
z e# Transpose.
N* e# Join with linefeeds.
답변
파이썬 2, 76 71 바이트
lambda s:[''.join(' o'[cmp(*x)==n]for x in zip(s,s[1:]))for n in-1,0,1]
문자열 목록을 반환 할 수 있음을 알려주는 @xnor에게 감사합니다.
Ideone에서 테스트하십시오 .
답변
자바 스크립트 (ES6), 96 95 89 87 82 바이트
Conor O’Brien이 제안한대로 2 0
대신에 o
2 바이트를 절약했습니다. ETHproduction 덕분에 6 바이트가 절약되었습니다.
let f =
s=>[1,0,-1].map(k=>s.replace(/./g,(c,i)=>i--?(c>s[i])-(c<s[i])-k&&' ':'')).join`
`
console.log(f("HELLOWORLD"));
console.log(f("EXAMINATION"));