Mẫu bàn phím hiển thị của Peter


8

Giả sử một bàn phím đơn giản với bố cục này:

1 2 3 4 5 6 7 8 9 0
A B C D E F G H I J
K L M N O P Q R S T
U V W X Y Z . , ? !

Mẫu bàn phím của Peter có thể được tạo bằng cách bắt đầu ở phía trên bên trái của bàn phím và hiển thị ba ký tự đầu tiên và một dòng mới. Nó thay đổi một ký tự và hiển thị khóa thứ hai, thứ ba và thứ tư. Khi nó đến cuối hàng, nó tiếp tục ở cuối hàng tiếp theo và đi lùi, cho đến khi đến đầu hàng đó và sau đó đi tiếp vào hàng tiếp theo, và cứ thế cho đến khi đến đầu hàng cuối cùng .

Đây là mẫu bàn phím của Peter:

123
234
345
456
567
678
789
890
90J
0JI
JIH
IHG
HGF
GFE
FED
EDC
DCB
CBA
BAK
AKL
KLM
LMN
MNO
NOP
OPQ
PQR
QRS
RST
ST!
T!?
!?,
?,.
,.Z
.ZY
ZYX
YXW
XWV
WVU

Viết chương trình không chấp nhận đầu vào và hiển thị kiểu bàn phím của Peter. Chương trình phải nhỏ hơn 152 byte , tức là kích thước của chuỗi mà nó xuất ra.

Đây là mã golf, vì vậy giải pháp ngắn nhất sẽ thắng.


Ngay cả trong Golfscript, tôi đang vật lộn để đưa ra một cách ngắn hơn để tạo chuỗi cơ sở 40 ký tự.
Peter Taylor

@PeterTaylor Tôi đang mong đợi ai đó sẽ sử dụng một số cách hiểu danh sách, như thế nào [1..9 0 J..A K..T ! ? , . Z..U].
Peter Olson

Bạn có thể sử dụng echo {1..9} "0" {J..A} {K..T} '!?,.' {Z..U}|sed 's/ //g'trong bash, nhưng cần 13 ký tự để thêm lệnh sed, để xóa khoảng trống. Điều này làm cho 57 ký tự, và cho đến nay không có bộ ba nào được xây dựng. Với lệnh giữ của sed, điều đó có thể xảy ra, nhưng trong 6 ký tự, để đánh bại giải pháp perl?
người dùng không xác định

Giới hạn 152 byte dường như không cần thiết - mã hóa đầu ra mà không nén bất cứ điều gì là dù sao chơi golf xấu. Nó cũng có khả năng là các ngôn ngữ thanh như brainf ** k, trong đó các chương trình lớn hầu như luôn luôn là sự xuất hiện nhưng vẫn có thể có một số hoạt động đánh gôn thông minh đang diễn ra.
Zwei

Câu trả lời:


7

Perl, 63 ký tự

say for"1234567890JIHGFEDCBAKLMNOPQRST!?,.ZYXWVU"=~/(?=(...))/g

Giải pháp này sử dụng saychức năng (khả dụng kể từ Perl 5.10.0 với công -Etắc hoặc với use 5.010). Không có nó, điều tốt nhất tôi có thể làm là 67 ký tự (và một dòng mới bổ sung ở cuối đầu ra):

print"1234567890JIHGFEDCBAKLMNOPQRST!?,.ZYXWVU"=~/(?=(...))/g,$,=$/

Giải pháp 65-char trước đó:

s//1234567890JIHGFEDCBAKLMNOPQRST!?,.ZYXWVU/;s!(?=(...))!say$1!eg

Thay thế say$1bằng print$1.$/cho phép mã chạy trên các perls cũ hơn, với chi phí thêm 5 ký tự.


bạn đánh tôi vài ký tự +1.
Toto

2
Đi cho giải pháp 63-char trực tiếp. thảo luận meta
JB

6

APL, 43 ký tự

⍪3,/(1⌽⎕D),(⌽10↑⎕A),(10↑10⌽⎕A),'!?,.',6↑⌽⎕A

Điều này hoạt động trên Dyalog APL . Tôi quản lý để lưu một vài ký tự bằng cách tạo chuỗi đầu ra (mọi thứ sau ). Tôi sẽ viết một lời giải thích khi tôi có thời gian!

Đây là cách đầu ra trông như thế nào:

      ⍪3,/(1⌽⎕D),(⌽10↑⎕A),(10↑10⌽⎕A),'!?,.',6↑⌽⎕A
 123 
 234 
 345 
 456 
 567 
 678 
 789 
 890 
 90J 
 0JI 
 JIH 
 IHG 
 HGF 
 GFE 
 FED 
 EDC 
 DCB 
 CBA 
 BAK 
 AKL 
 KLM 
 LMN 
 MNO 
 NOP 
 OPQ 
 PQR 
 QRS 
 RST 
 ST! 
 T!? 
 !?, 
 ?,. 
 ,.Z 
 .ZY 
 ZYX 
 YXW 
 XWV 
 WVU

Giải thích, từ phải sang trái:

  • Đầu tiên, chúng tôi xây dựng chuỗi nhìn thấy trong tất cả các mục khác:
    • 6↑⌽⎕A: ⎕Acung cấp cho chúng tôi một chuỗi của bảng chữ cái viết hoa, từ A đến Z. Sau đó chúng tôi đảo ngược nó ( ) và lấy ( ) 6 ký tự đầu tiên của nó, cho chúng tôi 'ZYXWVU'. (Nhìn lại, cách tiếp cận này cuối cùng không lưu bất kỳ ký tự nào, nhưng tôi sẽ bỏ nó vì nó phù hợp hơn.)
    • '!?,.',: Chúng tôi nối ( ,) chuỗi '!?,.'với kết quả trước đó.
    • (10↑10⌽⎕A),: Chúng tôi lấy 10 ký tự đầu tiên ( 10↑) của bảng chữ cái, lần đầu tiên được xoay mười lần ( 10⌽) và kết hợp điều này với kết quả trước đó. Như một ví dụ về phép quay, 5⌽'abcdef'(chuỗi 'abcdef'xoay 5 lần) cho chúng ta 'cdefab'.
    • (⌽10↑⎕A),: Lấy 10 ký tự đầu tiên của bảng chữ cái và đảo ngược chúng, và nối chuỗi này với chuỗi trước đó.
    • (1⌽⎕D),: ⎕Dcung cấp cho chúng tôi các chữ số dưới dạng một chuỗi, từ 0 đến 9, đã bao gồm. Sau đó, chúng tôi xoay ('⌽') chuỗi này bằng 1, cho năng suất '1234567890'. Như trước đây, chúng tôi kết hợp điều này với kết quả trước đó.
  • Bây giờ chúng tôi đã xây dựng chuỗi của chúng tôi (đã lưu chúng tôi 3 ký tự từ đại diện APL, do các trích dẫn xung quanh), chúng tôi thực hiện một số phép thuật để xây dựng đầu ra cuối cùng của chúng tôi:
    • 3,/: Chúng tôi lấy chuỗi, theo nhóm ba ký tự và nối chúng.
    • Để hoàn thành nó, chúng ta sử dụng để xâu chuỗi vectơ của chúng ta (thực sự là một vectơ của vectơ ký tự) dọc theo chiều thứ nhất. Đây có tác dụng thay đổi hình dạng của nó từ 38đến 38 1(một ma trận 38x1).

6

J, 66 62 45 ký tự

Hóa ra tôi đã quá thông minh một nửa.

3]\'1234567890JIHGFEDCBAKLMNOPQRST!?,.ZYXWVU'

là tất cả những gì tôi cần

Trước đây:

_2}.|:>(];1&|.;2&|.)'1234567890JIHGFEDCBAKLMNOPQRST!?,.ZYXWVU'

và:

38 3$($:@}.,~3$])^:(3<#)'1234567890JIHGFEDCBAKLMNOPQRST!?,.ZYXWVU'

4

R (75 ký tự)

embed(strsplit("1234567890JIHGFEDCBAKLMNOPQRST!?,.ZYXWVU","")[[1]],3)[,3:1]

Cái này làm gì

  • strsplit chia một chuỗi thành chuỗi con, trong trường hợp này là các ký tự riêng lẻ
  • embed là một hàm thực sự hữu ích, biến một vectơ thành một mảng các phần tử chồng chéo
  • Phần còn lại chỉ là lập chỉ mục và sắp xếp các cột theo đúng thứ tự.

Điều này tạo ra và in một mảng các ký tự:

> embed(strsplit("1234567890JIHGFEDCBAKLMNOPQRST!?,.ZYXWVU","")[[1]],3)[,3:1]
      [,1] [,2] [,3]
 [1,] "1"  "2"  "3" 
 [2,] "2"  "3"  "4" 
 [3,] "3"  "4"  "5" 
 [4,] "4"  "5"  "6" 
 [5,] "5"  "6"  "7" 
 [6,] "6"  "7"  "8" 
 [7,] "7"  "8"  "9" 
 [8,] "8"  "9"  "0" 
 [9,] "9"  "0"  "J" 
[10,] "0"  "J"  "I" 
[11,] "J"  "I"  "H" 
[12,] "I"  "H"  "G" 
[13,] "H"  "G"  "F" 
[14,] "G"  "F"  "E" 
[15,] "F"  "E"  "D" 
[16,] "E"  "D"  "C" 
[17,] "D"  "C"  "B" 
[18,] "C"  "B"  "A" 
[19,] "B"  "A"  "K" 
[20,] "A"  "K"  "L" 
[21,] "K"  "L"  "M" 
[22,] "L"  "M"  "N" 
[23,] "M"  "N"  "O" 
[24,] "N"  "O"  "P" 
[25,] "O"  "P"  "Q" 
[26,] "P"  "Q"  "R" 
[27,] "Q"  "R"  "S" 
[28,] "R"  "S"  "T" 
[29,] "S"  "T"  "!" 
[30,] "T"  "!"  "?" 
[31,] "!"  "?"  "," 
[32,] "?"  ","  "." 
[33,] ","  "."  "Z" 
[34,] "."  "Z"  "Y" 
[35,] "Z"  "Y"  "X" 
[36,] "Y"  "X"  "W" 
[37,] "X"  "W"  "V" 
[38,] "W"  "V"  "U" 

+1 embedthực sự là chức năng rất hữu ích!
Tommy


2

Toán học, 73

Tôi độc lập đến cùng một phương pháp như mọi người khác:

Grid@Partition[Characters@"1234567890JIHGFEDCBAKLMNOPQRST!?,.ZYXWVU",3,1]

2

Groovy, 73

(0..37).each{println"1234567890JIHGFEDCBAKLMNOPQRST!?,.ZYXWVU"[it..it+2]}

Tất cả những thứ thông minh mà tôi đã thử hóa ra lại dài hơn làm theo cách ngu ngốc.


2

C, 98 104 ký tự

Vì chưa có ai làm như vậy, tôi nghĩ rằng tôi sẽ thử thực sự tạo ra chuỗi khi đang sử dụng, sử dụng một số loại mã hóa độ dài chạy để tăng dần và giảm dần.

EDIT: Sau một số lần lặp lại, cuối cùng đây là một giải pháp "thông minh" có liên quan đến giải pháp "ngu ngốc" ngắn nhất trong C với 98 ký tự:

char*s="0º.ÿK»Jº ü=ÿ*ø[×",a[99],*p=a,i;main(j){for(;i-=i<8?j=*s++,*s++:8;puts(p++))p[2]=j+=i%4-1;}

Mã này yêu cầu mã hóa 8 bit Latin-1 (ISO-8859-1 hoặc Windows-1252), hoạt động tốt trên tất cả các nền tảng được sử dụng phổ biến, nhưng lưu nguồn với một số trang mã 8 bit ít phổ biến hơn hoặc UTF- 8 sẽ không hoạt động.

Chuỗi dữ liệu được tạo bởi đoạn emacs sau đây:

(require 'cl)
(apply 'concat
  (let ((last-remainder 0))
    (loop for (begin count step twiddle)
          in '((?1 9 +1 4) (?0 1 +2 4) (?J 10 -1 4) (?K 10 +1 0)
               (?! 1 +1 4) (?? 1 +2 4) (?, 2 +2 4) (?Z 6 -1 8))
          append (prog1 (list (char-to-string (- begin step))
                              (char-to-string 
                               (logand 255 (- last-remainder
                                              (+ (* 8 (- count 1)) (+ step 1)
                                                 twiddle)))))
                   (setq last-remainder (+ (logand twiddle 7) step 1))))))

Bit "twiddle" được sử dụng để tránh các ký tự điều khiển ASCII không thể in được trong chuỗi dữ liệu được mã hóa và để đảm bảo rằng i==0chỉ ở cuối đầu ra.

C, 98 ký tự

Tuy nhiên, ngay cả trong C, bạn có thể nhận được một chương trình ngắn bằng cách in các bộ ba liên tiếp từ chuỗi gốc:

main(){char s[]="12,34567890JIHGFEDCBAKLMNOPQRST!?,.ZYXWVU",*p=s+2;for(;*p=p[1];puts(p-3))*++p=0;}

2

Ruby 69 65 62

Dựa trên ví dụ Groovy

38.times{|i|p"1234567890JIHGFEDCBAKLMNOPQRST!?,.ZYXWVU"[i,2]}

Tôi nghĩ rằng quy ước ở đây trong quá khứ cho nhiều câu trả lời bằng các ngôn ngữ khác nhau đã được đăng một câu trả lời cho mỗi ngôn ngữ.
Gareth

2

Haskell, 80

mapM_(putStrLn.take 3.(`drop`"1234567890JIHGFEDCBAKLMNOPQRST!?,.ZYXWVU"))[0..37]

1

Javascript, 103

for(a='1234567890JIHGFEDCBAKLMNOPQRST!?,.ZYXWVU';a.length>2;a=a.substring(1))console.log(a.substr(0,3))

2
Một người dùng ẩn danh đề nghị giảm số này xuống còn 93 ký tự nhưfor(a='1234567890JIHGFEDCBAKLMNOPQRST!?,.ZYXWVU';a[3];a=a.slice(1))console.log(a.slice(0,3))
Peter Taylor

1

Haskell, 94

main=putStr.unlines.take 38$take 3`map`iterate tail"1234567890JIHGFEDCBAKLMNOPQRST!?,.ZYXWVU"

1

Perl, 73 ký tự:

print substr('1234567890JIHGFEDCBAKLMNOPQRST!?,.ZYXWVU',$_,3),$/for 0..37

Perl, 66 ký tự:

say substr"1234567890JIHGFEDCBAKLMNOPQRST!?,.ZYXWVU",$_,3for 0..37

khi được gọi bởi:

perl -E 'say substr"1234567890JIHGFEDCBAKLMNOPQRST!?,.ZYXWVU",$_,3for 0..37'

1

D ký tự 124

import std.stdio;void main(){enum s="1234567890JIHGFEDCBAKLMNOPQRST!?,.ZYXWVU";
foreach(i;3..s.length){writeln(s[i-3..i)]);}}



1

Smalltalk 102 99

1to:38 do:[:i|x:='1234567890JIHGFEDCBAKLMNOPQRST!?,.ZYXWVU'copyFrom:i to:i+2.Transcript cr show:x]

Tôi không biết rõ về Smalltalk nên nó hơi lạ đối với tôi. Nó biên dịch với gstnhững người khác không được thử nghiệm.


1
Thủ thuật thứ nhất: xóa khoảng trắng giữa 38 và thực hiện: -> 98 - mẹo thứ hai để xóa khoảng trắng khác, lặp từ 3to: 40 và copyFrom: i-2to: i -> 97 - lừa thứ ba, không sử dụng biến x: = ... hiển thị: x, chỉ hiển thị: ('...' copyFrom: i-2to: i) trực tiếp, đó là -4 ký tự + 2 dấu ngoặc đơn -> 95
aka.nice

1

Q ( 66 63 ký tự)

(((!)38),'3)sublist\:"1234567890JIHGFEDCBAKLMNOPQRST!?,.ZYXWVU"

1

Prolog, 131

Đây có lẽ là lý do tại sao bạn không bao giờ thấy các mục Prolog. Dòng mới là bắt buộc (thực ra, bất kỳ khoảng trắng nào cũng được nhưng phải có khoảng trắng).

z(S,L):-append(_,X,L),append(S,_,X),length(S,3).
:-forall(z(X,"1234567890JIHFEDCBAKLMNOPQRST!?,.ZYXWVU"),writef("%s\n",[X])),halt.

0

Q, 63

{(x;3)sublist"1234567890JIHGFEDCBAKLMNOPQRST!?,.ZYXWVU"}'[(!)38]

0

/// , 151 byte

123
234
345
456
567
678
789
890
90J
0JI
JIH
IHG
HGF
GFE
FED
EDC
DCB
CBA
BAK
AKL
KLM
LMN
MNO
NOP
OPQ
PQR
QRS
RST
ST!
T!?
!?,
?,.
,.Z
.ZY
ZYX
YXW
XWV
WVU

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

Không thể đánh gôn nhiều hơn? Điều này, theo một nghĩa nào đó, <152 byte.


Đây không phải là một ứng cử viên nghiêm trọng bởi các quy tắc của chúng tôi . Bạn không nỗ lực để làm tốt hơn điểm tối thiểu.
Mego

Tôi không thể, đó là lý do tại sao tôi đăng nó như hiện tại. Nếu bạn nghĩ rằng bạn có thể làm tốt hơn, bạn có thể thử. Tôi không biết về bất kỳ giải pháp ngắn hơn nào, và trên thực tế, tôi đã nỗ lực hết sức, nhưng nhận ra rằng điều này sẽ không bao giờ bị đánh gôn thêm nữa.
Erik the Outgolfer

Tôi không tin rằng điều này hoàn toàn có thể được chơi trong ///, nhưng thông số kỹ thuật nói rằng chương trình phải ngắn hơn [...] chuỗi mà nó tạo ra , không phải là trường hợp ở đây.
Dennis

@Dennis Không, nó nói chương trình phải nhỏ hơn 152 byte (151 <152). Tôi nghĩ đó là một lỗi, hoặc tôi đọc bài viết khác nhau, nhưng i.e.không ghi đè lên ý nghĩa của một cái gì đó, nó chỉ giúp bạn hiểu rõ hơn về nó, theo ý nghĩa của tôi. Ngoài ra, tôi không bao gồm một dòng mới, có thể đó là lý do tại sao đây là 151 byte. Và vâng, tôi đọc phần đó.
Erik the Outgolfer

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.