Bàn phím tròn xoắn ốc


24

Đây là bàn phím 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

Chúng ta có thể "xoắn ốc" trên bàn phím này, bắt đầu từ G. Vòng xoắn ốc sẽ bắt đầu tại G, đi đến H, sau đó đến Y, sau đó đến T, rồi F, rồi V, rồi B, rồi J, rồi J, rồi U , rồi R, rồi D, rồi C, ... vv Thử thách của bạn là, đưa ra số 1 ≤ N 26, xuất ra N ký tự đầu tiên trong vòng xoắn ốc này. (Nếu bạn bối rối, hãy tham khảo các hình ảnh ở cuối bài.)

Cuộc đuổi bắt? Điểm số của chương trình của bạn tỷ lệ thuận với chỉ số của các ký tự được tìm thấy trong vòng xoắn ốc!

Chấm điểm

  1. Đối với mỗi chữ cái (không phân biệt chữ hoa chữ thường) trong mã của bạn, hãy thêm chỉ mục của ký tự đó vào hình xoắn ốc vào điểm số của bạn (bắt đầu từ 1).
  2. Đối với mỗi nhân vật không nằm trong vòng xoắn ốc, hãy thêm 10 vào điểm số của bạn.
  3. Điểm thấp nhất sẽ thắng.

Ví dụ, chương trình print("Hello, World!")có số điểm 300.

Để thuận tiện cho bạn, tôi đã viết một chương trình học sinh tự động.

Các quy tắc khác

  • Trình của bạn có thể là một chương trình hoặc chức năng.
  • Bạn có thể lấy N bắt đầu từ 0 hoặc 1 và kết thúc ở 25 hoặc 26, nhưng đầu ra vẫn phải bắt đầu bằng "G" và kết thúc bằng "GHYTFVBNJURDCMKIESXLOWAZPQ".
  • Bạn phải xuất các ký tự theo hình xoắn ốc theo thứ tự .
  • Nếu một hàm, bạn có thể trả về một danh sách các ký tự thay vì một chuỗi.
  • Bạn có thể có một dòng mới theo sau đầu ra.
  • Bạn có thể sử dụng chữ cái viết thường thay vì chữ in hoa hoặc kết hợp cả hai.

Các trường hợp thử nghiệm

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

Những bức ảnh

bàn phím thông thường

Các xoắn ốc chồng lên nhau:

bàn phím xoắn ốc


3
Ai đó đã xem Sphere gần đây ...
Pureferret

@Pureferret Bạn có thể khai sáng cho tôi? Tôi không chắc chắn những gì bạn đề cập đến.
Conor O'Brien

@ ConorO'Brien In Sphere (cả tiểu thuyết và phim), một người ngoài hành tinh giao tiếp với con người bằng cách sử dụng mã số gồm hai chữ số trong đó mỗi số tương ứng với một chữ cái trên bàn phím theo một mẫu rất giống nhau .
Kỹ sư Toast

Câu trả lời:


14

Japt , 304 264 162 điểm

Lưu được 40 điểm nhờ @ ConorO'Brien

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

Kiểm tra nó trực tuyến!

Để lưu càng nhiều điểm càng tốt, toàn bộ chuỗi được cô đọng thành 9 ký tự Unicode bằng cách diễn giải mỗi lần chạy 3 chữ cái dưới dạng số cơ sở 36, sau đó chuyển đổi thành điểm mã. Bản thân chương trình lấy chuỗi nén này (có giá 110 điểm, bao gồm cả dấu ngoặc kép) và ánh xạ từng mã hóa cbằng cách chuyển đổi nó thành một string trong cơ sở-36 ( Gsau ;phần đầu). îlấy ký tự {input} đầu tiên của cái này, được in ngầm.



11

Xoắn ốc , điểm:  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

Một thông dịch viên có thể được tìm thấy ở đây .

Giải trình:

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

Chương trình bắt đầu ở 0nhân vật trên dòng thứ tư. Đoạn mã đầu tiên để chạy là 0;vg. ;lấy một số làm đầu vào và đặt nó vào ngăn xếp. vđặt những gì trong thanh ghi (một số không) vào ngăn xếp. Nó sẽ được sử dụng như là quầy. glà một nhãn, khi nó đạt được, điều khiển nhảy sang sự xuất hiện khác của chữ cái gtrong mã.

Vì vậy, đây là nơi kiểm soát bây giờ:

X
v
g

Vì có khoảng trắng ở tất cả các hướng khác, con trỏ lệnh bắt đầu di chuyển lên trên. vđặt số 0 vào ngăn xếp và Xbật nó ra khỏi ngăn xếp ngay lập tức. Bởi vì giá trị popped bằng 0, con trỏ lệnh di chuyển đến X(nếu không nó sẽ coi nó là khoảng trắng).

Theo mặc định, luồng điều khiển ở chế độ rẽ phải, vì vậy bây giờ khi đến ngã ba, con trỏ lệnh sẽ quay sang phải. vmột lần nữa đẩy số 0 vào ngăn xếp, *tăng thanh ghi lên một.

v*v*v
  X
  v
  g

Tiếp theo vđặt những gì trong thanh ghi (số 1) vào ngăn xếp, con trỏ lệnh cố gắng rẽ sang phải, nhấn tiếp theo X. Giá trị vừa được thêm vào ngăn xếp được bật lên và được đặt trong thanh ghi. Bởi vì nó khác không, Xkhông được nhập và *thay vào đó, IP sẽ chuyển sang bên phải ở bên phải, một lần nữa tăng giá trị trong thanh ghi.

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

Điều này xảy ra lặp đi lặp lại cho đến khi chúng ta kết thúc phần này và dòng *s bắt đầu. Đến bây giờ giá trị trong thanh ghi là 6, đó là chữ gASCII trừ chữ ASCII a. Do đó, với một dòng 97 *giây, chúng tôi tăng giá trị trong thanh ghi lên 103, khớp với chữ cái gchúng tôi muốn in. vđẩy nó vào ngăn xếp và Plà một nhãn khác khi nhấn mà chúng ta nhảy sang cái khác Ptrên dòng đầu tiên của mã.

Ở đây .bật giá trị từ ngăn xếp và in nó dưới dạng ký tự. Sau đó Xbật số 0 không liên tục từ ngăn xếp, sau đó ~so sánh hai giá trị còn lại trong ngăn xếp (các giá trị là bộ đếm và giá trị đầu vào). Nếu các giá trị là như nhau, toán tử đặt số 0 trong ngăn xếp (nếu không -1 hoặc 1). Một lần nữa, kiểm soát cố gắng rẽ phải. Xbật giá trị so sánh từ ngăn xếp, nếu nó bằng 0 Xvà sau khi !được nhập, kết thúc chương trình.

P.X~ZZ*v+^
   X
   !

Mặt khác, IP tiếp tục Zlà nhãn mà trong trường hợp này chỉ nhảy một bước sang phải. Lý do để làm điều này là việc nhảy đặt giá trị trong thanh ghi trở về không. *tăng thanh ghi và vđặt kết quả 1 vào ngăn xếp. +bật hai phần tử trên cùng của ngăn xếp (1 và bộ đếm), thêm chúng và đặt kết quả vào ngăn xếp (thực tế, điều này làm tăng bộ đếm lên một). ^sao chép kết quả từ ngăn xếp vào thanh ghi mà không xóa nó khỏi ngăn xếp.

#giảm giá trị trong thanh ghi theo một, vđẩy giá trị giảm xuống ngăn xếp, IP cố gắng quay sang phải và Xbật giá trị từ ngăn xếp. Nếu giá trị khác không, IP sẽ tiếp tục di chuyển về phía đông, giảm giá trị trong thanh ghi, cho đến khi nó về 0 và IP đi vào một Xnhánh.

#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

Nhánh dẫn đến một nhãn tương ứng với giá trị của bộ đếm. Khi nhấn nhãn, điều khiển nhảy sang sự xuất hiện khác của nhãn trong phần chúng tôi bắt đầu với nhãn g, bắt đầu một lần lặp khác. Cũng như g, giá trị trong thanh ghi được tăng lên đến giá trị ASCII của chữ cái chúng ta cần in. Sau đó, ký tự được in và bộ đếm tăng lên, nhãn khác được chọn. Điều này xảy ra cho đến sau lần lặp cuối cùng, bộ đếm bằng đầu vào và chương trình kết thúc.

Chỉnh sửa:

P.X~Zv+^
   X *
   ! Z

Đạt được điều tương tự như

P.X~ZZ*v+^
   X
   !

nhưng với ít khoảng trắng hơn.

Chỉnh sửa 2:

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

Có thể được sử dụng thay vì:

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

2
Trớ trêu rằng một languaje gọi là "Xoắn ốc" lại có số điểm cao như vậy trong bài toán đầu ra xoắn ốc.
Shirkam

6

Haskell , 471

(`take`"GHYTFVBNJURDCMKIESXLOWAZPQ")

Hãy thử trực tuyến!

Đây là một chút điểm chuẩn, tôi cảm thấy như phải có một cách tốt hơn, nhưng đó là cách tốt nhất tôi đã tìm thấy cho đến nay.

Giải trình

Tôi cho rằng tôi nên giải thích điều này cho những người không quen thuộc với Haskell. Hàm takelấy n phần tử đầu tiên của danh sách. Nó được gọi như thế này:

take n list

Chúng tôi muốn lấy n yếu tố đầu tiên của sting "GHYTFVBNJURDCMKIESXLOWAZPQ", vì vậy chúng tôi muốn một cái gì đó như

f n=take n"GHYTFVBNJURDCMKIESXLOWAZPQ"

Mặc dù vậy, chúng ta có thể làm tốt hơn, chúng ta có thể takesử dụng backticks

f n=n`take`"GHYTFVBNJURDCMKIESXLOWAZPQ"

Và bây giờ điều này có thể được thực hiện miễn phí

(`take`"GHYTFVBNJURDCMKIESXLOWAZPQ")

Đó là một ứng dụng một phần đáng xấu hổ yêu cầu sử dụng partialtrong Clojure. Đây là những gì tôi đã đi, nhưng partialquá đắt.
Carcigenicate

3
Không phải điểm số của bạn là 470? Đó là những gì đoạn trích trong câu hỏi mang lại cho tôi dù sao ...
Chỉ là một học sinh



4

Befunge, Điểm: 531

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

Tôi cảm thấy thử thách này sẽ thú vị hơn nếu đầu ra cũng phải theo hình xoắn ốc.


4

TI-Basic (TI-84 Plus CE), 454 432 điểm

sub("GHYTFVBNJURDCMKIESXLOWAZPQ",1,Ans

-22 điểm từ Conor O'Brien

Chạy với 5:prgmNAME.

Trả về / in subchuỗi từ 1đến Ans(đầu vào số).

TI-Basic là một ngôn ngữ được token hóa , vì vậy tôi đang chấm điểm này bằng các giá trị byte của các mã thông báo.

sub( là 0xbb 0x0c, vì vậy 20

"là 0x2a, vì vậy *, 10 * 2 = 20

Chữ in hoa không thay đổi, vì vậy chuỗi là 351

,là 0x2b, vì vậy +, 10 * 2 = 20

1là 0x31, vì vậy 1, 10

Anslà 0x72, nghĩa là r11

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


Với cách giải thích các quy tắc tính điểm này, bạn có thể tiết kiệm thêm 31 byte bằng cách tìm kiếm các chữ cái ở những nơi sáng tạo. Thay thế S, A, Z, P bằng các biến stat, s, a, z, p (trong menu STAT + 5), mỗi điểm đạt 17 điểm: chúng là các thẻ 2 byte có byte đầu tiên tương ứng với b. Thay thế O, W, Q bằng các chữ cái viết thường, mỗi điểm ghi được 20 điểm: chúng là các thẻ 2 byte 0xBBBF, 0xBBC7, 0xBBC1.
Misha Lavrov

3

Python 3, điểm = 762 753

Đầu vào 1 dựa. Điều này còn tệ hơn cả cách tiếp cận tầm thường, vì nó sử dụng 37 chữ cái không. Nó là một phần thú vị, mặc dù.

-9 cảm ơn Leo .

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

Hãy thử trực tuyến!


1
Tôi thích cách tiếp cận này :) Nhân tiện, [:g*3][-3:]có thể [g*3-3:g*3]giảm tổng số điểm xuống 9 điểm
Leo


2

Brainf ** k, điểm = 2690

Nhập một byte đơn từ 0x1 đến 0x1a.

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

Hãy thử trực tuyến!


2

APL (Dyalog) , điểm: 391

↑∘'GHYTFVBNJURDCMKIESXLOWAZPQ'

Hãy thử trực tuyến!

Việc sử dụng duy nhất cho các chữ cái Latinh trong Dyalog là trong các tên biến và một số chức năng hệ thống. Ngoài ra, chỉ có glyphs và một số chữ cái Hy Lạp được sử dụng.



1

Clojure, 484 474 điểm

-10 điểm vì dường như một con số %có thể tồn tại sau một con số mà không có khoảng cách ngăn cách chúng!? Tôi có thể phải quay lại và cải thiện một số bài nộp.

#(subs"ghytfvbnjurdcmkiesxlowazpq"0%)

Một chức năng ẩn danh. Về cơ bản một cổng Clojure của những gì đã được đăng. Điểm số độc đáo! Tôi nghĩ rằng đây là chương trình Clojure đầu tiên tôi từng viết không chứa một khoảng trống.

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



1

Husk , 293 byte

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

Đây là cái ngắn nhất tôi có thể tìm thấy, tiếp theo gần hơn ¨gHYtfvB⌋ȷÜdCmkÏex←ẆAzpq¨ với số điểm 293 ..

Hãy thử trực tuyến!

Giải trình

Tìm kiếm lực lượng, hóa ra tất cả các trường hợp thấp hơn cho điểm tốt nhất. Về cơ bản, nó giống như giải pháp của @Wheat Wizard, take( ) trên chuỗi nén ( ¨).



1

Excel, 490 điểm

=LEFT("GHYTFVBNJURDCMKIESXLOWAZPQ",A1)

Công ước cho Excel ansers là lấy đầu vào từ A1. Thay đổi điều này để G1cắt giảm 22 điểm (468).

=LEFT("GHYTFVBNJURDCMKIESXLOWAZPQ",G1)


1

Rust, điểm 443

Không phải thường thì Rust giỏi chơi golf nhưng ở đây nó đánh bại nhiều ngôn ngữ

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


1

Javascript ES6, 527 điểm

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

Thử nó !

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>



1

PHP, điểm 584

nghịch một chút với từ điển; thực tế là xending chuỗi cắt nó bị substrlỗi thời.

<?=">1 -?/;73,+=:420<*!56.8#)("^str_repeat(y,$argv[1]);

Hãy thử trực tuyến .



0

Pyth , điểm: 371

<"GHYTFVBNJURDCMKIESXLOWAZPQ

Hãy thử nó ở đây.

Làm sao?

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


0

> <> , 558 + 16 = 574 điểm

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

Sử dụng -v cờ để đẩy đầu vào lên ngăn xếp.

Đẩy xoắn ốc lên ngăn xếp theo thứ tự ngược lại, sau đó xoay đầu vào lên trên cùng. Sau đó, trong khi đỉnh của ngăn xếp khác không, hãy in chữ cái tiếp theo và giảm phần trên cùng của ngăn xếp.

Hãy thử trực tuyến!


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.