원형 키보드 나선


24

이것은 QWERTY 키보드입니다.

Q W E R T Y U I O P
 A S D F G H J K L
  Z X C V B N M

G에서 시작하여이 키보드에서 "나선형"을 그릴 수 있습니다. 나선은 G에서 시작하여 H, Y, T, F, V, B, N, J, U로 시작합니다. , R, D, C, ... 등을 입력하십시오. 숫자 1 ≤ N ≤ 26이 주어지면 이 나선 의 첫 번째 N 문자를 출력해야합니다 . 혼란 스러우면 게시물 끝에있는 그림을 참조하십시오.

캐치? 당신의 프로그램의 점수는 나선 안에서 발견되는 문자의 지수에 비례합니다!

채점

  1. 코드의 모든 문자 (대소 문자 구분)에 대해 나선으로 해당 문자의 색인을 점수에 추가하십시오 (1부터 시작).
  2. 나선형이 아닌 모든 캐릭터에 대해 점수에 10을 더하십시오.
  3. 가장 낮은 점수가 이깁니다.

예를 들어, 프로그램 print("Hello, World!")의 점수는 300입니다.

귀하의 편의를 위해 자동 프로그램 그레이더를 작성했습니다.

다른 규칙

  • 귀하의 제출물은 프로그램 또는 기능 일 수 있습니다.
  • 당신이 걸릴 수 N을 각각 0 또는 1에서 시작하여 25 또는 26에서 끝나는 있지만, 출력은 여전히 "GHYTFVBNJURDCMKIESXLOWAZPQ"와 "G"와 종료로 시작해야합니다.
  • 나선형 으로 문자 를 순서대로 출력해야합니다 .
  • 함수 인 경우 문자열 대신 문자 목록을 반환 할 수 있습니다.
  • 출력 뒤에 하나의 후행 줄 바꿈이있을 수 있습니다.
  • 대문자 대신 소문자를 사용하거나 두 가지를 조합하여 사용할 수 있습니다.

테스트 사례

number -> output
1 -> G
2 -> GH
5 -> GHYTF
12 -> GHYTFVBNJURD
15 -> GHYTFVBNJURDCMK
24 -> GHYTFVBNJURDCMKIESXLOWAZ
26 -> GHYTFVBNJURDCMKIESXLOWAZPQ

영화

일반 키보드

나선은 중첩되었습니다.

나선형 키보드


3
누군가 최근에 Sphere를 시청했습니다 ...
Pureferret

@Pureferret 저를 깨우칠 수 있습니까? 당신이 무엇을 참조하는지 잘 모르겠습니다.
코너 오브라이언

@ ConorO'Brien In Sphere (소설 및 영화 모두)에서 외계인은 두 자리 숫자 코드를 사용하여 인간과 의사 소통합니다. 각 숫자는 키보드의 문자 와 매우 유사한 패턴 입니다.
엔지니어 토스트

답변:


14

JAPT , 304 (264) 162 점

@ ConorO'Brien 덕분에 40 포인트 절약

;î"历锋㫿鮹㿬崴ꨜꎋΞ"csG

온라인으로 테스트하십시오!

가능한 한 많은 포인트를 저장하기 위해 3 개의 문자를 모두 36 자 밑수로 해석 한 다음 코드 포인트로 변환하여 전체 문자열을 9 개의 유니 코드 문자로 압축합니다. 프로그램 자체는이 압축 문자열 (따옴표를 포함하여 110 포인트가 c소요됨)을 취하고 각 하 코드 s를 base-36 의 tring 으로 변환 하여 시작합니다 (시작 부분 G이후 ;). î이것의 첫 번째 {input} 문자를 내포하여 암시 적으로 인쇄합니다.



11

나선 , 점수 :  61921   5127   4715   4655  4191

4.X~>v+^#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v
   X *   X X X X X X X X X X X X X X X X X X X X X X X X X
   ! >   h y t f V b n j u [ ( 1 3 2 ) ] U J N B F T Y H G
0;vgv*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*vvv****v+^v+^v+^v+^*v++4
    X X X X X X X X X X X X X X X X X X X X X X X X X X
    v v v v v v v v v v v v v v v v v v v v v v v v v v
    Y y J F V u t U [ G H B n 3 N 2 j ) h g f ] ( 1 b T

통역사는 여기 에서 찾을 수 있습니다 .

설명:

P.X~ZZ*v+^#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v
   X       X X X X X X X X X X X X X X X X X X X X X X X X X
   !       h y t f V b n j u r d c m k i e s x l o w a z p q
0;vgv*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*****************************************************************vP
    X X X X X X X X X X X X X X X X X X X X X X X X X X
    v v v v v v v v v v v v v v v v v v v v v v v v v v
    z y x w V u t s r q p o n m l k j i h g f e d c b a

프로그램은 0네 번째 줄 의 문자에서 시작 합니다. 실행할 첫 번째 코드는 0;vg입니다. ;숫자를 입력으로 받아 스택에 넣습니다. v레지스터 (제로)에있는 것을 스택에 넣습니다. 카운터로 사용됩니다. g는 레이블에 도달하면 컨트롤 g이 코드 에서 문자의 다른 발생으로 이동 합니다.

여기가 컨트롤이있는 곳입니다.

X
v
g

다른 모든 방향에는 공백이 있으므로 명령 포인터가 위로 이동하기 시작합니다. v스택에 0을 넣고 X스택에서 즉시 팝합니다. 팝된 값이 0이므로 명령 포인터가로 이동합니다 X(그렇지 않으면 공백으로 처리합니다).

기본적으로 제어 흐름은 우회전 모드이므로 정션에 도달하면 명령 포인터가 오른쪽으로 회전합니다. v다시 스택에 0을 넣고 *레지스터를 1 씩 증가시킵니다.

v*v*v
  X
  v
  g

다음 v은 레지스터 (번호 1)에있는 것을 스택에 배치하고 명령 포인터는 다음을 때리면서 오른쪽으로 회전하려고합니다 X. 스택에 추가 된 값이 팝되어 레지스터에 배치됩니다. 0 X이 아니므로 입력하지 않고 IP *가 오른쪽 의 다음 으로 진행 하여 레지스터의 값을 다시 증가시킵니다.

v*v*v*v*v
X X X X X
v v v v v
i h g f e

이것은 우리가이 부분의 끝에 도달하고 *s 의 라인이 시작될 때까지 계속해서 발생합니다 . 이제 레지스터의 값은 6이며 이는 ASCII 문자 g에서 ASCII 문자를 뺀 것 a입니다. 따라서 97 줄로 *레지스터의 값을 103으로 증가시켜 g인쇄하려는 문자와 일치시킵니다 . v그것을 스택 에 넣고 코드의 첫 번째 줄에서 P다른 레이블로 넘어갈 때 다른 레이블 P입니다.

여기서 .스택으로부터 값을 나타나고 문자로 출력한다. 그 후 X스택에서 팝 불필요한 제로하고 ~(값이 카운터의 입력 값이다) 스택의 나머지 두 값을 비교한다. 값이 동일하면 연산자는 스택에 0을 배치합니다 (그렇지 않으면 -1 또는 1). 다시, 컨트롤은 우회전을 시도합니다. X스택에서 비교 값이 0이되면을 입력하고 입력 X한 후 !프로그램을 종료합니다.

P.X~ZZ*v+^
   X
   !

그렇지 않으면 IP Z는이 레이블을 계속 유지합니다. 이 경우 레이블은 오른쪽으로 한 단계 만 이동합니다. 이렇게하는 이유는 점프가 레지스터의 값을 다시 0으로 설정하기 때문입니다. *레지스터를 증가시키고 v결과 1을 스택에 배치합니다. +스택의 맨 위 두 요소 (1과 카운터)를 팝하고 추가 한 다음 결과를 스택에 배치합니다 (효과적으로 카운터가 1 씩 증가 함). ^스택에서 결과를 제거하지 않고 스택에서 레지스터로 결과를 복사합니다.

#레지스터의 값을 1 v씩 감소시키고, 감소 된 값을 스택으로 푸시하고, IP는 오른쪽으로 회전을 시도 X하고 스택에서 값을 팝합니다. 값이 0이 아닌 경우 IP는 계속 동쪽으로 이동하여 0에 도달 할 때까지 레지스터의 값을 감소시키고 IP는 X지점으로 들어갑니다 .

#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v
 X X X X X X X X X X X X X X X X X X X X X X X X X
 h y t f V b n j u r d c m k i e s x l o w a z p q

분기는 카운터 값에 해당하는 레이블로 연결됩니다. 레이블에 도달하면 컨트롤은 레이블로 시작한 섹션에서 레이블의 다른 항목으로 이동하여 g다른 반복을 시작합니다. 와 마찬가지로 g레지스터의 값은 인쇄해야하는 문자의 ASCII 값까지 증가합니다. 그런 다음 문자가 인쇄되고 카운터가 증가하고 다른 레이블이 선택됩니다. 이것은 마지막 반복 이후에 카운터가 입력과 같아지고 프로그램이 종료 될 때까지 발생합니다.

편집하다:

P.X~Zv+^
   X *
   ! Z

같은 것을 달성

P.X~ZZ*v+^
   X
   !

그러나 공백이 적습니다.

편집 2 :

vv****v+^v+^v+^v+^*v++P

다음 대신 사용할 수 있습니다 :

*****************************************************************vP

2
"Spiral"이라는 언어가 나선형 출력 문제에서 그와 같은 높은 점수를 받았다는 것은 아이러니합니다.
Shirkam

6

하스켈 , 471

(`take`"GHYTFVBNJURDCMKIESXLOWAZPQ")

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

이것은 약간의 벤치 마크이며, 더 좋은 방법이 있어야한다고 생각하지만 지금까지 내가 찾은 최고입니다.

설명

나는 Haskell에 대해 잘 모르는 사람들을 위해 이것을 설명해야한다고 가정합니다. 이 함수 take는 목록의 처음 n 개 요소를 가져옵니다. 다음과 같이 호출됩니다.

take n list

우리는 찌르기의 첫 번째 n 요소를 취하고 싶기 "GHYTFVBNJURDCMKIESXLOWAZPQ"때문에 다음과 같은 것을 원합니다.

f n=take n"GHYTFVBNJURDCMKIESXLOWAZPQ"

그래도 더 잘할 수 있고 take백틱을 사용하여 삽입 할 수 있습니다

f n=n`take`"GHYTFVBNJURDCMKIESXLOWAZPQ"

그리고 지금 이것은 무의미하게 만들 수 있습니다

(`take`"GHYTFVBNJURDCMKIESXLOWAZPQ")

partialClojure에서 사용하는 것은 부끄러운 부분 응용 프로그램 입니다. 이것은 내가 가고 있었지만 partial너무 비쌌습니다.
Carcigenicate

3
당신의 점수가 470 아닌가요? 그것이 문제의 스 니펫이 저에게주는 것입니다 ...
단지 학생



4

빌 펀지, 점수 : 531

QPZAWOLXSEIKMCDRUJNBVFTYHG"&\>,# 1#\-# :# _@

결과물이 나선형이어야한다면이 도전이 더 흥미 로웠을 것이라고 생각합니다.


4

TI 기본 (TI-84 Plus CE), 454432 포인트

sub("GHYTFVBNJURDCMKIESXLOWAZPQ",1,Ans

코너 오브라이언 에서 -22 포인트

로 실행하십시오 5:prgmNAME.

반환 / 지문 sub에서 문자열 1Ans(숫자 입력).

TI-Basic은 토큰 화 된 언어 이므로 토큰의 바이트 값으로 점수를 매 깁니다.

sub( 0xbb 0x0c이므로 20

"0x2a *이므로 10 * 2 = 20입니다.

대문자는 바뀌지 않으므로 문자열은 351입니다

,0x2b +이므로 10 * 2 = 20입니다.

10x31 1이므로 10

Ans0x72 r이므로 11입니다.

20 + 20 + 351 + 20 + 10 + 11 = 432


이 점수 규칙을 해석하면 창의적인 장소에서 문자를 찾아 31 바이트를 더 절약 할 수 있습니다. S, A, Z, P를 통계 변수 s, a, z, p (STAT + 5 메뉴에서)로 바꾸십시오. (STAT + 5 메뉴에서) 각 점수는 17 포인트입니다. 첫 바이트가 b에 해당하는 2 바이트 토큰입니다. O, W, Q를 보통 소문자로 바꿉니다 (각 20 점) : 2 바이트 토큰 0xBBBF, 0xBBC7, 0xBBC1입니다.
미샤 라브 로프

3

파이썬 3, 점수 = 762 (753)

1 기반 입력. 37 개의 비 문자를 사용하기 때문에 사소한 접근 방식보다 나쁩니다. 그래도 다소 흥미 롭습니다.

Leo 에게 -9 감사합니다 .

h=lambda g:g and h(g-1)+chr(65+int('GYGGYHGYYGYTGTYHGYGGHGGTGHGYGYGFGHGGYGGHHGGHHYYGHGHGGYFGGYHGGTHGHTGGGGGFGGVHGT'[g*3-3:g*3],35)%26)or''

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


1
나는이 접근법을 좋아한다 :) 그런데 총점을 9 점 낮출 [:g*3][-3:]수있다[g*3-3:g*3]
레오


2

Brainf ** k, 점수 = 2690

에 이르기까지 입력 단일 바이트 0x10x1a.

>>++++>+++>>>>++++++++++[<+<-<+>>>-]<<--<+++>>>++>->+++++++++++>++++++>-------->---->-->>---------->--------->+++++>++++++++>--->+>----------->+++++++++>------->+++++++>++++++++++++>----->------>+>>+++++++[<+++++++++++[<[[+<]+<]>->[[>]>]<<<-]>-]<<[-]>,[[<]<.[-]>+[>]<-]

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




1

클로저, 484 474 포인트

%공백이없는 숫자 뒤에는 분명히 존재 하기 때문에 -10 점 !? 다시 돌아가서 제출물을 개선해야 할 수도 있습니다.

#(subs"ghytfvbnjurdcmkiesxlowazpq"0%)

익명의 기능. 기본적으로 이미 게시 된 Clojure 포트입니다. 멋지게 득점! 나는 이것이 내가 작성한 최초의 Clojure 프로그램이라고 생각한다.

(defn spiral [n]
  ; Substring the hardcoded list, going from index 0 to n
  (subs "ghytfvbnjurdcmkiesxlowazpq" 0 n))



1

껍질 , 293 바이트

↑¨ghytfvb⌋ȷÜdcmkÏexl⁰Λzpq

이것은 내가 찾을 수있는 가장 짧은 것입니다. 다음 ¨gHYtfvB⌋ȷÜdCmkÏex←ẆAzpq¨은 293 점입니다.

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

설명

무차별 대입 검색은 모든 소문자가 가장 높은 점수를 주었다. 압축 문자열 ( ) 의 @Wheat Wizard 솔루션 take( ) 과 기본적으로 동일 ¨합니다.



1

엑셀, 490 포인트

=LEFT("GHYTFVBNJURDCMKIESXLOWAZPQ",A1)

Excel ansers에 대한 규칙은에서 입력을받는 것 A1입니다. 이것을 G122 포인트 (468) 로 잘라냅니다.

=LEFT("GHYTFVBNJURDCMKIESXLOWAZPQ",G1)


1

녹, 443 점

Rust가 코드 골프에 능숙하지는 않지만 종종 많은 언어를 능가합니다

|g|&"GHYTFVBNJURDCMKIESXLOWAZPQ"[..g]


1

자바 스크립트 ES6, 527 포인트

g=>`GHYTFVBNJURDCMKIESXLOWAZPQ`.slice(0,g)

시도 해봐 !

f=g=>`GHYTFVBNJURDCMKIESXLOWAZPQ`.slice(0,g)

input.oninput = function() {
    output.value = f(input.value);
}
textarea { width: 500px; height: 6em; font-style: monospace; }
<textarea id="input"></textarea>
<textarea disabled id="output"></textarea>





0

피스 점수 : 371

<"GHYTFVBNJURDCMKIESXLOWAZPQ

여기에서 시도하십시오.

방법?

<"GHYTFVBNJURDCMKIESXLOWAZPQ"Q   implicit string end, implicit input
<                            Q   first Q(=input) elements ...
 "GHYTFVBNJURDCMKIESXLOWAZPQ"    ... of this string


0

> <> , 558 + 16 = 574 포인트

<;v? : <{"GHYTFVBNJURDCMKIESXLOWAZPQ"
  >$o1-^

-v플래그를 사용하여 입력을 스택으로 푸시합니다.

나선형을 스택에 역순으로 밀고 입력을 상단으로 회전시킵니다. 그런 다음 스택의 상단이 0이 아닌 동안 다음 문자를 인쇄하고 스택의 상단을 줄입니다.

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


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