울퉁불퉁 한 끈 그리기 o

( 이 도전에서 영감을 얻었습니다 .)

string이 있다고 가정 해 봅시다 ABBCBA. 우리는 사이 상승이 있음을 말할 수 AB를 들어, B다음과 A; 우리는 사이에 실행이 있다고 말할 수 BB아무것도 변경; 그리고 마지막으로 우리는 사이에 가을이 말할 수 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음수 / 하강, 00 / 계속, 1양수 / 상승)

Insert[{,},0,2-#]&

상승하는 경우 첫 번째 위치, 계속 진행중인 경우 중간, 떨어지는 경우 세 번째 위치 0에 2 Nulls 목록에 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 은 목록 이해와 domax대신 표기법 을 사용하여 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"));