Một bàn phím thật đến nỗi bạn gần như có thể BẮT ĐẦU nó


126

... Không phải là bạn sẽ làm, phải không? Nhiệm vụ rất đơn giản, xuất văn bản sau:

 ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ________ 
||` |||1 |||2 |||3 |||4 |||5 |||6 |||7 |||8 |||9 |||0 |||- |||= |||BS    ||
||__|||__|||__|||__|||__|||__|||__|||__|||__|||__|||__|||__|||__|||______||
|/__\|/__\|/__\|/__\|/__\|/__\|/__\|/__\|/__\|/__\|/__\|/__\|/__\|/______\|
 ________ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ 
||TAB   |||Q |||W |||E |||R |||T |||Y |||U |||I |||O |||P |||[ |||] |||\ ||
||______|||__|||__|||__|||__|||__|||__|||__|||__|||__|||__|||__|||__|||__||
|/______\|/__\|/__\|/__\|/__\|/__\|/__\|/__\|/__\|/__\|/__\|/__\|/__\|/__\|
 _________ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ________ 
||CAPS   |||A |||S |||D |||F |||G |||H |||J |||K |||L |||; |||' |||ENTER ||
||_______|||__|||__|||__|||__|||__|||__|||__|||__|||__|||__|||__|||______||
|/_______\|/__\|/__\|/__\|/__\|/__\|/__\|/__\|/__\|/__\|/__\|/__\|/______\|
 ___________ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ___________ 
||SHIFT    |||Z |||X |||C |||V |||B |||N |||M |||, |||. |||/ |||SHIFT    ||
||_________|||__|||__|||__|||__|||__|||__|||__|||__|||__|||__|||_________||
|/_________\|/__\|/__\|/__\|/__\|/__\|/__\|/__\|/__\|/__\|/__\|/_________\|

Đây là bàn phím của tương lai vì trong không gian tương lai là không liên quan, tàu vũ trụ cũng vậy.


Để làm cho mọi thứ dễ dàng hơn một chút về bạn:

  1. 0123456789ABC...XYZ-=[]\;',./ - Các ký tự này nằm trên các phím có độ dài 6 (bao gồm cả phần đệm).
  2. TAB / BS / ENTER - Các phím này có độ dài 10 (bao gồm cả phần đệm).
  3. CAPS - Phím này có độ dài 11 (bao gồm cả phần đệm).
  4. SHIFT - Phím này có độ dài 13 (bao gồm cả đệm, ở cả hai bên).

Mỗi khóa riêng lẻ trông ít nhiều như thế này:

 ____ 
||* ||
||__||
|/__\|

Tuy nhiên, bạn cần lưu ý rằng hai khóa liên tiếp không phải là:

 ____  ____ 
||* ||||* ||
||__||||__||
|/__\||/__\|

Nhưng chúng "dính liền":

 ____ ____ 
||* |||* ||
||__|||__||
|/__\|/__\|

Thử thách này không nên quá tệ, chúc bạn may mắn; đừng bỏ lỡ việc lạm dụng sự lặp lại! Nhưng đừng đánh giá thấp các phím "đặc biệt";).


Chiến thắng?

Mã ngắn nhất sẽ thắng vì đó là mà bạn biết.


49
Phải thừa nhận rằng tôi rất ngạc nhiên khi không có nhiều người lo ngại về bàn phím tương lai không chứa khoảng trống ...
Bạch tuộc ma thuật Urn

97
Tôi đoán không gian không phải là biên giới cuối cùng.
Greg Martin

48
"TASTE" là từ tiếng Đức có nghĩa là "chìa khóa" :)
QBrute

31
"TASTE" là từ tiếng Na Uy có nghĩa là "đánh máy" :)
Stewie Griffin

32
Nhưng đó là từ tiếng Anh có nghĩa là "hương vị". Đây .
Ông Lister

Câu trả lời:


117

V , 189, 179, 175, 164, 161, 157, 155, 149, 145, 141 , 135 byte

¬19É`A0-=BS´ 
TAB³ qwertyuiop[]\
CAPS³ asdfghjkl;'ENTER 
SHIFT´ ÄJizxcvbnm,./Í„A-Z ]/Õ& 
ÍÓ«ü$/|||&
òÙÓ„|]/_
ÙÓ׫/Ü|¯
kkPÓ/_ _
kòÎx$x

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

Câu trả lời này bây giờ là tweet!


Xem nó chạy! Đây là một phiên bản sửa đổi một chút, cập nhật khi nó chạy để bạn có thể sắp xếp xem nó hoạt động như thế nào. Đây là một phiên bản lỗi thời kể từ khi tôi chưa quay lại để ghi lại nó, nhưng cách tiếp cận chung là giống hệt nhau.

Đây có lẽ là câu trả lời V dài nhất từng được viết. Nó chắc chắn đã không giúp người phiên dịch của V cực kỳ chậm. Tôi mất khoảng một giờ để viết bản sửa đổi đầu tiên, nhưng tôi đã nhiều lần quay lại để sửa một vài byte mỗi lần. Vì bàn phím đầy đủ là 1215 byte, hiện tại câu trả lời này ngắn hơn 91% so với đầu ra, vì vậy tôi khá hài lòng với kết quả.

Vì phần này chứa một số ký tự không thể in được và rất nhiều phần không phải ASCII, nên đây là một hexdump:

00000000: ac31 39c9 6041 302d 3d42 53b4 200a 5441  .19.`A0-=BS. .TA
00000010: 42b3 2071 7765 7274 7975 696f 705b 5d5c  B. qwertyuiop[]\
00000020: 0a43 4150 53b3 2061 7364 6667 686a 6b6c  .CAPS. asdfghjkl
00000030: 3b27 454e 5445 5220 0a53 4849 4654 b420  ;'ENTER .SHIFT. 
00000040: 1bc4 4a69 7a78 6376 626e 6d2c 2e2f 1bcd  ..Jizxcvbnm,./..
00000050: 8441 2d5a 205d 2fd5 2620 0acd d3ab fc24  .A-Z ]/.& .....$
00000060: 2f7c 7c7c 260a f2d9 d384 7c5d 2f5f 0ad9  /|||&.....|]/_..
00000070: d3d7 ab2f dc7c af0a 6b6b 50d3 2f5f 205f  .../.|..kkP./_ _
00000080: 0a6b f2ce 7824 78                        .k..x$x

Làm thế quái nào nó hoạt động?

Được rồi, lời giải thích này sẽ là một doozy. Bạn sẵn sàng chưa? Trước hết, chúng ta cần nhập các chữ cái để chúng ta có thể xây dựng các phím xung quanh chúng. Đây là

¬19É`A0-=BS´ 
TAB³ qwertyuiop[]\
CAPS³ asdfghjkl;'ENTER 
SHIFT´ <esc>ÄJizxcvbnm,./<esc>

Mà chèn:

`1234567890-=BS    
TAB   qwertyuiop[]\
CAPS   asdfghjkl;'ENTER 
SHIFT    zxcvbnm,./SHIFT  

Nó đi vào nó khá đơn giản, nhưng có một vài thủ thuật mà chúng tôi sử dụng để lưu các ký tự. Ví dụ: ¬19nhập "123456789", ³nhập ba khoảng trắng và chúng tôi nhân đôi ca làm việc để không cần nhập nhiều lần.

Lưu ý cách các chữ cái viết thường ở đây. Điều này là để chúng ta có thể dễ dàng phân biệt giữa các phím chữ hoa như "ENTER" và các chữ cái đơn. Viết chúng theo cách này giúp dễ dàng hơn trong việc cho biết các ký tự đặt thanh trước và chỉ thêm một byte để chuyển đổi chúng thành chữ thường sau đó. Vì vậy, chúng tôi thực hiện một lệnh thay thế để chuyển đổi chúng thành chữ hoa và thêm một khoảng trắng sau mỗi chúng:

Í               " Globally replace
 [^A-Z ]        " Anything but a uppercase alphabet character or a space
        /       " with
         Õ&     " The matched pattern made uppercase, followed by a space

Bây giờ, chúng tôi lấy từng chuỗi khóa (bất kỳ lần chạy không phải khoảng trắng nào) và đặt ba thanh trước và sau chúng:

Í           " Globally replace
 Ó«         "   Any number of non-space characters
   ü        "   or
    $       "   an end of line
     /      " with
      |||   "    Three bars 
         &  "    And the matched pattern

Tại thời điểm này, bộ đệm trông như thế này:

|||` |||1 |||2 |||3 |||4 |||5 |||6 |||7 |||8 |||9 |||0 |||- |||= |||BS    |||
|||TAB   |||Q |||W |||E |||R |||T |||Y |||U |||I |||O |||P |||[ |||] |||\ |||
|||CAPS   |||A |||S |||D |||F |||G |||H |||J |||K |||L |||; |||' |||ENTER |||
|||SHIFT    |||Z |||X |||C |||V |||B |||N |||M |||, |||. |||/ |||SHIFT    |||

Có ba thanh trên cột đầu tiên và cuối cùng thực sự rất thuận tiện và cuối cùng sẽ tiết kiệm được nhiều byte trong thời gian dài.

Và đây là nơi chúng ta chạy một vòng lặp khổng lồ. Điều này sẽ chuyển đổi một cái gì đó như thế này:

|||SHIFT    |||Z |||X |||C |||V |||B |||N |||M |||, |||. |||/ |||SHIFT    |||

vào một cái gì đó như thế này:

 ___________ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ___________ 
||SHIFT    |||Z |||X |||C |||V |||B |||N |||M |||, |||. |||/ |||SHIFT    ||
||_________|||__|||__|||__|||__|||__|||__|||__|||__|||__|||__|||_________||
|/_________\|/__\|/__\|/__\|/__\|/__\|/__\|/__\|/__\|/__\|/__\|/_________\|

Mọi thứ giữa hai trường hợp òsẽ chạy cho đến khi xảy ra lỗi, điều này sẽ xảy ra khi chúng ta cố gắng đi vào một dòng tồn tại. Vì chúng tôi vừa chạy một lệnh thay thế toàn cầu , con trỏ của chúng tôi nằm ở dòng cuối cùng và chúng tôi sẽ chuyển đổi các lệnh này theo cách của chúng tôi.

ò         " Recursively:
 Ù        "   Duplicate this line
  Ó       "   Substitute all on this line:
   [^|]   "     Anything but a bar
       /  "   With:
        _ "     An underscore

Đây là

|||_________|||__|||__|||__|||__|||__|||__|||__|||__|||__|||__|||_________|||

hàng.

Ù         "   Duplicate this line
 Ó        "   Subsitute all on this line:
  ׫      "     A run of *non-word characters* (that is, [^0-9A-Za-z_])
    /     "   With:
     Ü|¯  "     '\|/'

Đây là

\|/_________\|/__\|/__\|/__\|/__\|/__\|/__\|/__\|/__\|/__\|/__\|/_________\|/

Hàng.

kk        "   Move up two lines (to the original text with "SHIFT")
  P       "   Paste the last line we duplicated (the one with all the underscores)
   Ó      "   Substitute:
          "     Since we don't give any regex here, it re-uses the last one 
          "     (a run of *non-word* characters)
    /     "   With:
     _ _  "     '_ _'

Đây là:

_ ___________ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ___________ _

Hàng.

k         "   Move up a line (this will throw an error, breaking the loop when we're done)
 ò        " Endwhile

Bây giờ chúng ta có bàn phím đầy đủ, nhưng mỗi dòng chứa một thanh phụ, dấu gạch chéo phụ (tiến hoặc lùi) hoặc dấu gạch dưới phụ. Sửa siêu dễ

Î             " On every line:
 x            "   Delete a character
  $           "   Move to the end of the line
   x          "   and delete another character

Sau tất cả sự điên rồ đó, bộ đệm được in ngầm.


1
Có vẻ như có thêm 4 dấu gạch dưới trong khoảng trống bên phải của đầu ra?
ErikE

7
Bạn đánh giá thấp làm thế nào golfy câu trả lời này thực sự là lol.
Bạch tuộc ma thuật Urn

1
@carusocomputing Haha, tôi đoán bạn đúng. Tôi rất tự hào về câu trả lời này ngôn ngữ của tôi là câu trả lời duy nhất đánh bại bubblegum. :)
DJMcMayhem

2
@DJMcMayhem Đánh dấu bạn là người chiến thắng nếu không ai đánh bại bạn trước 1/3/2017;).
Bạch tuộc ma thuật Urn

7
Đây vẫn là câu trả lời yêu thích của tôi trên trang web. Tôi không thể đếm được bao nhiêu lần tôi đã xem GIF.
Bạch tuộc ma thuật Urn

41

Lua 5.3, 416 394 byte.

k="` 1 2 3 4 5 6 7 8 9 0 - = BS|TAB Q W E R T Y U I O P [ ] \\|CAPS A S D F G H J K L ; ' ENTER|SHIFT Z X C V B N M , . / SHIFT"S={TAB=6,BS=6,ENTER=6,CAPS=7,SHIFT=9}for v in k:gmatch"[^|]+"do for i=1,4 do for s in v:gmatch"%S+"do l=S[s]or 2j=("_"):rep(l)io.write(i==1 and" _"..j.."_"or i==2 and"||"..s..(" "):rep(l-#s).."|"or i==3 and"||"..j.."|"or"|/"..j.."\\")end print(i>1 and"|"or"")end end

Ungolfed và với ý kiến.

keys="` 1 2 3 4 5 6 7 8 9 0 - = BS|TAB Q W E R T Y U I O P [ ] \\|CAPS A S D F G H J K L ; ' ENTER|SHIFT Z X C V B N M , . / SHIFT" -- Define a keyboard. Separated with |'s, there's probably a nicer way to do this, but I'm not sure about how to yet.
special_keys={TAB=6,BS=6,ENTER=6,CAPS=7,SHIFT=9} -- Special keys get special definitions
for v in keys:gmatch"[^|]+" do -- For each row on the keyboard...
    for i=1, 4 do -- Each of the 4 rows per key...
        for s in v:gmatch"%S+" do -- Match each individual key.
            l=special_keys[s]or 2 j=("_"):rep(l) -- l is the length of the key, j is "_" repeated length times, which is used a bit.
            io.write(i==1 and -- Lua needs Switch Statements!
                     " _"..j.."_" -- The top of the key is a Space, then j with two _'s around it.
                     or
                     i==2 and
                     "||"..s..(" "):rep(l - #s).."|" -- Second row is || then the key, then the remaining whitespace, and then one more |, which chains together.
                     or
                     i==3 and
                     "||"..j.."|" -- Third row is like the second, but without the key. Instead of whitespace, uses j, which is the underlines.
                     or
                     "|/"..j.."\\") -- Last row is like the third row, but with "|/" and "\" instead of "||" and "|"
        end
        print(i>1 and"|"or"") -- First line is the only line that doresn't need a "|", everything else gets a "|" before the newline.

    end
end

Đầu ra

 ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ________
||` |||1 |||2 |||3 |||4 |||5 |||6 |||7 |||8 |||9 |||0 |||- |||= |||BS    ||
||__|||__|||__|||__|||__|||__|||__|||__|||__|||__|||__|||__|||__|||______||
|/__\|/__\|/__\|/__\|/__\|/__\|/__\|/__\|/__\|/__\|/__\|/__\|/__\|/______\|
 ________ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____
||TAB   |||Q |||W |||E |||R |||T |||Y |||U |||I |||O |||P |||[ |||] |||\ ||
||______|||__|||__|||__|||__|||__|||__|||__|||__|||__|||__|||__|||__|||__||
|/______\|/__\|/__\|/__\|/__\|/__\|/__\|/__\|/__\|/__\|/__\|/__\|/__\|/__\|
 _________ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ________
||CAPS   |||A |||S |||D |||F |||G |||H |||J |||K |||L |||; |||' |||ENTER ||
||_______|||__|||__|||__|||__|||__|||__|||__|||__|||__|||__|||__|||______||
|/_______\|/__\|/__\|/__\|/__\|/__\|/__\|/__\|/__\|/__\|/__\|/__\|/______\|
 ___________ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ___________
||SHIFT    |||Z |||X |||C |||V |||B |||N |||M |||, |||. |||/ |||SHIFT    ||
||_________|||__|||__|||__|||__|||__|||__|||__|||__|||__|||__|||_________||
|/_________\|/__\|/__\|/__\|/__\|/__\|/__\|/__\|/__\|/__\|/__\|/_________\|

Tôi sẽ bị phá hủy bởi các langau khác, nhưng tôi nghĩ tôi sẽ bắn nó. Mức độ phức tạp cao, và ít nhất nó ngắn hơn bàn phím!


15
Nói cách khác, bạn là người đầu tiên trong một ngôn ngữ hiếm! Thật ấn tượng, mặc dù tôi chắc chắn rằng bạn chắc chắn không cần đặt các đường ống làm dấu phân cách trên mỗi chữ cái. Lưu ý cách các phím "đặc biệt" chỉ ở đầu và cuối dòng. Tôi chắc chắn rằng gợi ý đó có thể giúp bạn tiết kiệm byte quý giá bằng cách nào đó.
Bạch tuộc ma thuật Urn

Bạn đang sử dụng phiên bản nào của Lua? Trên Lua 5.1, nó cho tôi một lỗi cú pháp: stdin: 1: số không đúng định dạng gần '2j'
brianush1

5
@ Brianush1 Lua 5.3, Nó cho phép các hằng số ngồi cạnh bất kỳ chữ cái nào không phải là chữ số thập lục phân hoặc 'x' trong trường hợp 0.
ATaco

29

Bubblegum , 191 byte

0000000: ad d2 35 7a c6 30 10 06 e1 5e a7 50 15 66 fe 99  ..5z.0...^.P.f..
0000010: c1 8c 61 50 0e b2 87 8f 27 24 f7 eb af 78 2b e3  ..aP....'$...x+.
0000020: 3c b2 ae 99 1a 66 8d c8 a7 15 91 73 b8 80 4b b8  <....f.....s..K.
0000030: 82 6b b8 81 5b b8 83 1e 9c c1 31 8c 60 5e d9 66  .k..[.....1.`^.f
0000040: 22 46 c4 39 d1 c2 78 d6 a9 73 6f 5a d8 9b 18 ff  "F.9..x..soZ....
0000050: bb 5a e8 55 cf e6 fc ae 48 01 8f b0 82 12 6a 78  .Z.U....H.....jx
0000060: 86 7b 08 20 83 1c 5e e1 1d de e8 e5 7f 57 b4 d0  .{. ..^......W..
0000070: 8b a9 9b f9 5e 5d 9d af c5 2c af 7e 82 cd a0 82  ....^]...,.~....
0000080: 25 ac 61 03 5b 08 21 82 18 06 b0 0b ab b4 5e 95  %.a.[.!.......^.
0000090: ad 5e 5d 9d 2f d6 e9 f9 d2 c4 f2 bd aa 6d b0 ae  .^]./........m..
00000a0: ed 4f b1 17 78 82 05 3c c0 1c 52 48 e0 08 4e e0  .O..x..<..RH..N.
00000b0: 14 5a 77 fb 5e aa 58 be 97 aa 98 bf db 7c 01     .Zw.^.X......|.

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


1
Bubblegum không công bằng.
Joshua

7
@Joshua thật tốt khi đặt đường cơ sở cho các giải pháp. và nếu không có gì có thể đánh bại bubblegum, đó là vấn đề.
Sange Borsch

19

Haskell, 263 ký tự (353 byte UTF-8)

import Data.List
main=mapM_ putStrLn$transpose.foldr k[g]=<<
 [s"`1234567890-="%"   ←"
 ,"↹   ":s"𝑄𝑊𝐸𝑅𝑇𝑌𝑈𝐼𝑂𝑃[]\\"
 ,"⇩    ":s"𝐴𝑆𝐷𝐹𝐺𝐻𝐽𝐾𝐿;'"%"     ↵"
 ,"⇧       ":s"𝑍𝑋𝐶𝑉𝐵𝑁𝑀,./"%"       ⇧"]
r%e=r++[e]
g=" |||"
k s r=g:"_||/":['_':c:"__"|c<-s]%"_||\\"++r
s=map(:" ")

ảnh chụp màn hình của bàn phím đó

Vì đã có rất nhiều cuộc thảo luận về điểm số trong ánh sáng của các ký tự unicode này ... đây là cùng một chương trình, được giảm xuống thành tất cả - ASCII:

Haskell, 263 ký tự (263 byte UTF-8)

import Data.List
main=mapM_ putStrLn$transpose.foldr k[g]=<<
 [s"`1234567890-="%"BS  "
 ,"TAB ":s"QWERTYUIOP[]\\"
 ,"CAPS ":s"ASDFGHJKL;'"%"ENTER "
 ,"SHIFT   ":s"ZXCVBNM,./"%"SHIFT   "]
r%e=r++[e]
g=" |||"
k s r=g:"_||/":['_':c:"__"|c<-s]%"_||\\"++r
s=map(:" ")

3
Bàn phím Unicode? Lựa chọn thú vị (chữ cái toán đẹp mắt ở đó), nhưng tôi nghĩ nó vi phạm các quy tắc cạnh tranh.
Mario Carneiro

@MarioCarneiro Công bằng mà nói, nó hoàn toàn không ảnh hưởng đến thời lượng của chương trình.
pydsigner

1
@pydsigner Nó có, vì các từ như ENTERdài hơn các ký tự như ↩︎.
timothymh

5
Nhưng bạn đang so sánh ENTER ↩︎ , phần đệm khoảng trắng làm cho nó có cùng độ dài.
CodeMonkey

2
Trên thực tế, tôi hy vọng unicode sẽ làm cho chương trình dài hơn theo số byte, vì unicode cao có nhiều byte trong UTF8 hơn ASCII.
Mario Carneiro

18

PHP, 303 byte

Lười nhưng hiệu quả. :)

<?=gzinflate(base64_decode('rdO5DoJAEIDhnqegs/G+jbEAvA88wBuzPsg8vPyLZo3tOMUXmt1k/iy+ycfXYj88kacvIg1oQgva0IEu9KAPA6hDBUYQJn4+IvldxogWhrtqxmRamEw8t66afMc0CO26soczTOAAKVzhCAvYwg7u8IDs06tYVx3Oc+uqw7lef3lfUbBLimABJDCGKcxgDktYwRqGULJ143Ry+O71r/elDvb7vnSx3r2S+WKaFn+U3OACEZzs7wYxbKAMVajZvO6066WK9dNLFcuefgE'));

1
Đẹp. Khó chịu, tôi không thể có cùng mức nén với nén / gzip / bzip2 / 7z, nếu không phiên bản Bash sẽ ngắn hơn một cách tầm thường. Khi nó đứng, thay vào đó là 318 ký tự.
Konrad Rudolph

14
Tôi khá chắc chắn rằng việc sử dụng thuật toán nén bên ngoài không có trong chương trình của bạn bị cấm hoặc ít nhất là nhăn mặt. Nó đánh bại mục đích của câu hỏi.
Không ai là

1
@KonradRudolph Theo tôi hiểu, gzdeflate () sử dụng tính năng nén tương tự như dòng lệnh gzip nhưng bỏ qua tiêu đề tệp và tổng kiểm tra nên nó sẽ luôn ngắn hơn một chút.
Alex Howansky

300 byte : <?=gzinflate(base64_decode('rdO5DoJAEIDhnqegs/G+jbHA+0QEvDHrg8zDy79EMbTDFF+3m8yfXdek42phHJG3KyItaEMHutCDPgxgCCNoQg0mMI3cdETSu4wRLQx3NYxJtDCJOL9t1cnSFWNvareVE1xhASHEcIczbOAIATzhBck3V7atupuTb6vulucq43XNvCDKenkQwRyWsII1bGEHexhDxcb140X4n6us16XuVXxdulZZrmi9WcbZd5IH3GAGF/vXwIcDVKEODVs3P53nUrUq5FK1sqc/'));. Trình nén: sandbox.onlinephpfifts.com/code/ Bộ giải nén: sandbox.onlinephpfifts.com/code/iêu
Ismael Miguel

4
@Nobody Không có gì bên ngoài, gz là một phần của trình biên dịch mặc định của PHP và do đó được cho phép hoàn toàn.
Alex Howansky

18

Python 3.5+, 239 byte

s="SHIFT   "
for k in[(*"`1234567890-=","BS   "),("TAB  ",*"QWERTYUIOP[]\\"),("CAPS  ",*"ASDFGHJKL;'","ENTER"),(s,*"ZXCVBNM,./",s)]:
 for f in"{1}__ ,|{} ||,|{1}||,/{1}\|".split(","):print(f[-1]+"".join(f.format(c,"_"*-~len(c))for c in k))

Là Python 3.5+ cần thiết cho splat bên trong các bộ dữ liệu, hay cái gì khác?
mbomb007

1
Bạn có thể lưu một byte nếu bạn đảo ngược cấu trúc của từng khóa và sử dụng "".join(...) + f[0]trong vòng lặp bên trong. Hoán đổi formatthứ tự đối số và giữ chỗ tương ứng trong chuỗi cũng tiết kiệm thêm hai byte.
dfernan

['{1}__ ','|{} ||','|{1}||','/{1}\\|']là ngắn hơn so với việc sử dụng split.
Hội trường Alex

16

Batch, 465 452 byte

@echo off
call:c _ ` 1 2 3 4 5 6 7 8 9 0 - "=" "BS   " _____
call:c _____ "TAB  " Q W E R T Y U I O P [ ] \ _
call:c ______ "CAPS  " A S D F G H J K L ";" ' ENTER _____
call:c ________ "SHIFT   " Z X C V B N M "," . / "SHIFT   " ________
exit/b
:c
set t=%1_
set s=!!%~2 !!!%3 !!
:l
set t=%t%#__
set s=%s%!%~4 !!
shift
if not "%~5"=="" goto l
set t=%t%#%4_
for %%l in (" _%t:#=_ _%_" "%s:!=|%" "||%t:#=|||%||" "|/%t:#=\|/%\|")do echo %%~l

Chương :ctrình con xử lý một dòng các phím. Phím chứa dấu cách thêm cần phải được trích dẫn, như làm =, ;, ,phím, có thể do một lỗi trong shiftlệnh. Các tham số đầu tiên và cuối cùng là các chuỗi có _cùng độ dài với khóa đầu tiên và khóa cuối cùng để hỗ trợ nối. tsau đó kết thúc là _s chung cho hàng đầu tiên, thứ ba và thứ tư, với #s đánh dấu liên kết, được thay thế một cách thích hợp trước khi các ký tự đầu và cuối được thêm vào, trong khi đó slà hàng thứ hai, nhưng |thay đổi thành !s khi chúng giảm số lượng "s mà tôi cần. Chỉnh sửa: Đã lưu 1 byte bằng cách in tất cả bốn dòng trong một câu lệnh và 12 byte bằng cách tối ưu hóa cách tôi đã gán sbiến.


14

Ruby, 226 byte

16.times{|i|puts (([[?`,'TAB  ','CAPS  ',s='SHIFT   '][j=i/4]]+%w{1234567890-= QWERTYUIOP[] ASDFGHJKL;' ZXCVBNM,./}[j].chars+[['BS   ',?\\,'ENTER',s][j]]).map{|e|e.tr('^|'[-i%4/3,2],?_)}*3*"__ _ |||_|||_\\|/"[i%4*4,4])[72,75]}

Những cải tiến như sau:

1.Không có phần tử chuỗi rỗng ở đầu và cuối của mảng. Thay vào đó, mảng được nhân ba thành 3 bàn phím cạnh nhau. Sau khi chuyển đổi thành chuỗi chúng ta có 3 bàn phím bị thiếu cạnh ngoài. Điều này được cắt ngắn để chỉ hiển thị ở giữa, hoàn thành với các cạnh.

2. Phiên bản thay đổi của Ruby. Đã sử dụng Ideone thay vì 1.9.3 được cài đặt trên máy của tôi. Điều này có nghĩa là .chars.to_acó thể được rút ngắn để chỉ .chars.

Ruby, 239 byte

Có thêm một vài byte để giải quyết vấn đề này. Sẽ nhìn vào ngày mai.

16.times{|i|puts ((['']+[[?`,'TAB  ','CAPS  ',s='SHIFT   '][j=i/4]]+%w{1234567890-= QWERTYUIOP[] ASDFGHJKL;' ZXCVBNM,./}[j].chars.to_a+[['BS   ',?\\,'ENTER',s][j]]+['']).map{|e|e.tr('^|'[-i%4/3,2],?_)}*"__ _ |||_|||_\\|/"[i%4*4,4])[2..-2]}

vô dụng

16.times{|i|                                                            #iterate throug 16 lines of output
  puts ((['']+[[?`,'TAB  ','CAPS  ',s='SHIFT   '][j=i/4]]+              #build row from blank element plus left special key
    %w{1234567890-= QWERTYUIOP[] ASDFGHJKL;' ZXCVBNM,./}[j].chars.to_a+ #plus regular keys
   [['BS   ',?\\,'ENTER',s][j]]+['']).map{|e|                           #plus right special key and another blank element
                                      e.tr('^|'[-i%4/3,2],?_)}*         #if i%4 != 1, replace the keytop legend with _ characters 
   "__ _ |||_|||_\\|/"[i%4*4,4])[2..-2]                                 #join the middle parts of the keys with ends. truncate spurious outer ends before printing.
}

13

C #, 357 byte (khi ở trong một dòng và kết hợp hầu hết các đề xuất)


var s="";
foreach(var r in@"`|1|2|3|4|5|6|7|8|9|0|-|=|BS   ~TAB  |Q|W|E|R|T|Y|U|I|O|P|[|]|\~CAPS  |A|S|D|F|G|H|J|K|L|;|'|ENTER~SHIFT   |Z|X|C|V|B|N|M|,|.|/|SHIFT   ".Split('~'))
for(int i=0;i<4;s+=i>0?"|\n":"\n",i++)
foreach(var k in r.Split('|'))
{
var u=new string('_',k.Length+1);
s+=i<1?" "+u+"__"
:i<2
?"||"+k+" |"
:i<3
?"||"+u+"|"
:"|/"+u+@"\";
}
Console.Write(s);

Hoặc, 353 với phép nội suy chuỗi và tất cả các đề xuất khác

var s="";foreach(var r in@"`|1|2|3|4|5|6|7|8|9|0|-|=|BS   ~TAB  |Q|W|E|R|T|Y|U|I|O|P|[|]|\~CAPS  |A|S|D|F|G|H|J|K|L|;|'|ENTER~SHIFT   |Z|X|C|V|B|N|M|,|.|/|SHIFT   ".Split('~'))for(int i=0;i<4;s+=i>0?"|\n":"\n",i++)foreach(var k in r.Split('|')){var u=new string('_',k.Length+1);s+=i<1?$" {u}__":i<2?$"||{k} |":i<3?$"||{u}|":$@"|/{u}\";}Console.Write(s);

Ungolfed (không có nội suy chuỗi):

var solution = "";
foreach (var row in @"`|1|2|3|4|5|6|7|8|9|0|-|=|BS   ~TAB  |Q|W|E|R|T|Y|U|I|O|P|[|]|\~CAPS  |A|S|D|F|G|H|J|K|L|;|'|ENTER~SHIFT   |Z|X|C|V|B|N|M|,|.|/|SHIFT   ".Split('~'))
for (int i = 0; i < 4; solution += i > 0 ? "|\n" : "\n", i++)
foreach (var key in row.Split('|'))
{
   var underscores = new string('_', key.Length + 1);
   solution += i < 1 ? " " + underscores + "__"
                     : i < 2
                     ? "||" + key + " |"
                     : i < 3
                     ? "||" + underscores + "|"
                     : "|/" + underscores + @"\";
}
Console.Write(solution);

5
Bạn có thể lưu rất nhiều byte định dạng mã được đánh gôn thành một dòng:foreach(var r in q){for(int i=0;i<4;i++){foreach...
Mario

1
@Mario Tôi chỉ kiểm tra byte, giá trị đã cho thực sự là số đếm không có dòng mới, vì vậy về mặt kỹ thuật đã được thực hiện
Alfie Goodacre

1
Chơi golf nhẹ xuống 397 byte bằng cách sử dụng phép nội suy và thay thế ==bằng< s+=i<1?$" {u}__":i<2?$"||{k.PadRight(l)}|":i<3?$"||{u}|":$"|/{u}\\";
Alfie Goodacre

Cảm ơn @Alfie Goodacre. Tôi đã thay thế '==' bằng '<' theo đề xuất của bạn. Tôi đã bỏ nội suy ra để làm cho nó ít phiên bản cụ thể hơn.
Klinger

@Klinger Tôi đồng ý, phép nội suy không hoạt động trên bất kỳ trình biên dịch trực tuyến nào vì vậy đó là một lựa chọn tốt!
Alfie Goodacre

10

PowerShell v2 +, 465 byte

($b=($a=' ____')*10)+$a*3+" "+($d='_'*8)
"||``@$(1..9-join'@')@0@-@=@BS    ||
||$(($f=,'__'*10-join'#'))#__#__#__#$(($g='_'*6))||
$(($c=($e='|/__\')*10))$e$e$e|/$g\|
 $d$b$a$a$a
||TAB  @Q@W@E@R@T@Y@U@I@O@P@[@]@\ ||
||$g#$f#__#__#__||
|/$g\$c$e$e$e|
 _$d$b$a $d
||CAPS  @A@S@D@F@G@H@J@K@L@;@'@ENTER ||
||_$g#$f#__#$g||
|/_$g\$c$e|/$g\|
 ___$d$b ___$d
||SHIFT   @Z@X@C@V@B@N@M@,@.@/@SHIFT    ||
||___$g#$f#___$g||
|/___$g\$c|/___$g\|"-replace'@',' #'-replace'#','|||'

Tôi nửa bối rối khi đăng câu trả lời này, cho dù câu trả lời của PHP và Python ngắn đến mức nào, không bao giờ trả lời câu hỏi C #, nhưng tôi không thể rút ngắn phương pháp này. Các phương pháp khác có thể mang lại kết quả tốt hơn.

Về cơ bản, nó chỉ là một chuỗi nhiều dòng khổng lồ, với các biến ( $avà tương tự) thay thế cho các chuỗi con khác nhau và một vài -replacegiây ở cuối để hoàn thành nó. Các khối script $(...)được chèn vào nơi cần thiết để giới thiệu các biến mới.

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


7

Con trăn, 493 458 byte.

k=[['|']*75 for i in [0]*16]
v=' '
w='_'
y=0
def a(s,x,o):k[y+o][x:x+len(s)]=list(s)
def p(s,i,x):a(s+v*(i-len(s)),x+2,1);a(v+w*(i+2)+v,x,0);a(w*i,x+2,2);a(w*i,x+2,3);a('/',x+1,3);a('\\',x+i+2,3);return x+i+3
def q(s,x):return reduce(lambda a,b:p(b,2,a),list(s),x)
p('BS',6,q('`1234567890-=',0))
y=4
q('QWERTYUIOP[]\\',p('TAB',6,0))
y=8
p('ENTER',6,q('ASDFGHJKL;\'',p('CAPS',7,0)))
y=12
p('SHIFT',9,q('ZXCVBNM,./',p('SHIFT',9,0)))
for l in k:print''.join(l)

Chức năng tương đương nhưng có phần dễ đọc hơn:

k=[['|']*75 for i in range(16)]
def a(s,x,y):k[y][x:x+len(s)]=list(s)
def p(s,i,x,y):
    a(s+' '*(i-len(s)),x+2,y+1)
    a(' '+'_'*(i+2)+' ',x,y)
    a('_'*i,x+2,y+2)
    a('_'*i,x+2,y+3)
    k[y+3][x+1]='/'
    k[y+3][x+i+2]='\\'
    return x+i+3
def q(s,x,y):return reduce(lambda a,b:p(b,2,a,y),list(s),x)
p('BS',6,q('`1234567890-=',0,0),0)
q('QWERTYUIOP[]\\',p('TAB',6,0,4),4)
p('ENTER',6,q('ASDFGHJKL;\'',p('CAPS',7,0,8),8),8)
p('SHIFT',9,q('ZXCVBNM,./',p('SHIFT',9,0,12),12),12)
for l in k:print ''.join(l)

Thật không may, nó đã dài hơn câu trả lời được cung cấp trong Lua.


Bạn có thể đặt các dòng trong phàm trên một dòng cách nhau bằng dấu chấm phẩy. Ngoài ra, tôi nghĩ rằng bạn không thể thực hiện dòng đầu tiên k=[['|']*75]*16, bạn có biết tại sao không?
nedla2004

Bạn cũng có thể định nghĩa '_'' 'đến một biến để lưu một số byte.
nedla2004

Cảm ơn vì những lời khuyên! Tôi nghĩ k = [['|'] * 75] * 16 tạo ra mười sáu tham chiếu đến cùng một mảng để thay đổi trong một dòng cũng ảnh hưởng đến các dòng khác.
Cobi

Được rồi, sau đó bạn ít nhất có thể thay đổi range(16)để [0]*16.
nedla2004

Một vấn đề nhỏ là mã của bạn về mặt kỹ thuật không tạo ra đầu ra đúng, nhưng bạn có thể khắc phục điều đó bằng cách thay đổi for l in k:print ' '.join(l)thành for l in k:print''.join(l).
nedla2004

7

PHP, 316 312 byte

foreach([($s=str_split)("`1234567890-=")+[13=>"BS   "],["TAB  "]+$s("_QWERTYUIOP[]\\"),["CAPS  "]+$s("_ASDFGHJKL;'")+[12=>ENTER],[$h="SHIFT   "]+$s("_ZXCVBNM,./")+[11=>$h]]as$r)for($y=-1;$y++<3;)foreach($r as$i=>$k)echo["\n".$a="| "[!$y]][$i],"_||/"[$y],str_pad($y-1?_:$k,strlen($k)+1,$y-1?_:" "),"_||\\"[$y],$a;

Tôi chắc chắn rằng cách tiếp cận này không thể được đánh gôn thêm nữa. Nhưng nếu bất cứ ai tìm thấy thêm 10 byte ...: D
Chạy với -r.

phá vỡ

foreach([                       // loop through rows
    ($s=str_split)("`1234567890-=")+[13=>"BS   "],
    ["TAB  "]+$s("_QWERTYUIOP[]\\"),
    ["CAPS  "]+$s("_ASDFGHJKL;'")+[12=>ENTER],
    [$h="SHIFT   "]+$s("_ZXCVBNM,./")+[11=>$h]
]as$r)
    for($y=-1;$y++<3;)          // loop through lines 0..3
        foreach($r as$i=>$k)    // loop through keys
            echo["\n".$a="| "[!$y]][$i],// first key in row: leading NL + space/pipe
                "_||/"[$y],             // key edges
                str_pad(
                    $y-1?_:$k,          // line 1: key label; else underscore
                    strlen($k)+1,       // pad to length+1
                    $y-1?_:" "),        // with spaces for label, underscores else
                "_||\\"[$y],            // more key edges
                $a                      // joining edges
            ;

6

Bash (trên OSX), 12 8 + 221 + 1 = 234 230 byte

Vâng, tôi biết, nén. Nhưng nó hoạt động, không?

gunzip<f

Yêu cầu một tệp có tên "f" trong thư mục hiện tại với các nội dung sau (được đặt vào base64 để thân thiện với PPCG - trước tiên bạn có thể giải mã tệp này thành tệp "f".):

H4sIAHbPT1gAA63TuQ6CQBCA4Z6noLPxvo2xALwPPMAbsz7IPLz8i2aN7TjFFxo2mT+7vsnH12I/PJGnLyINaEIL2tCBLvSgDwOoQwVGECZ+PiL5WcaIFoazasZkWphMPLeumnzHNAjturKHM0zgAClc4QgL2MIO7vCA7NOrWFcdznPrqsO5Xn+5X1GwS4pgASQwhinMYA5LWMEahlCydeN0cvju9a/7pQ72e790sd69kvlimhYvSm5wgQhO9rlBDBsoQxVqNq/72/VSxfrppYpV9HoBoNfjQcAEAAA=

4
Có thể được thực hiện ngắn hơn tầm thường bằng cách viết gunzip<f.
Konrad Rudolph

@KonradRudolph Điểm tuyệt vời. Cảm ơn.
Addison Crump

Bạn có thể lưu 2 byte với zcat fvà 2 byte bằng cách xóa hai byte null theo sau (gzip phàn nàn nhưng tạo ra đầu ra mong muốn).
Gilles

@Gilles Không thực sự tiết kiệm cho tôi byte - Tôi phải đổi tên tệp "fZ" (ít nhất là trên OSX). Việc xóa các byte null theo dõi không chỉ khiến gzip phàn nàn - nó khiến nó bị lỗi và không in được gì.
Addison Crump

@VoteToC Đóng Oh đúng zcat<frồi. Trên Linux, zcat không có các số 0 ở cuối khiến cho gzip phàn nàn
Gilles

5

JavaScript (ES6), 286

Một hàm ẩn danh không có tham số

_=>[..."`1234567890-=~~QWERTYUIOP[]\\~ASDFGHJKL;'~~ZXCVBNM,./~"].map(x=>(o+=`/${b='_'.repeat(w=x<y?2:' 667699'[x=["BS","TAB","CAPS","ENTER"][p++]||'SHIFT',p])}\\|`,m+=y+(x+'    ').slice(0,w)+y+y,n+=y+b+y+y,l+=' __'+b)[73]&&(k.push(l,m,n,o),l='',m=n=o=y),m=n=o=y='|',p=l=k=[])&&k.join`
`

Ít chơi gôn

_=>[..."`1234567890-=~~QWERTYUIOP[]\\~ASDFGHJKL;'~~ZXCVBNM,./~"]
  .map(x=>
      (
        w = x < y // special chars are marked '~' that is > '|'
            ? 2 // normal key, width 2
            : ( // else special key, set x and width
                // p should be incremented at next step, but I need to make it numeric as it starts as []
                x = ["BS","TAB","CAPS","ENTER"][p++]||'SHIFT',
                ' 667699'[p], // value for w (note p is off by 1)
              ),
        b = '_'.repeat(w), // bottom border (and top, almost)
        o +=`/${b}\\|`, //  line 4
        n += y+b+y+y,   //  line 3
        m += y+(x+'    ').slice(0,w)+y+y, // line 2
        l += ' __'+b    // top line, the border must be longer
      )[70] && // check if at end of row (check position in l)
         (
            k.push(l, m, n, o), // add lines to list
            l = '', // reset all
            m = n = o = y
         )
    , // initial setup
    // y stays fixed to '|', lines 2,3,4 start as '|'
    m = n = o = y ='|',
    // k is the lines array, l will become as string and starts empty
    // p is the index of current special key and will become numeric
    p = l = k = [] 
  ) 
  && k.join`\n` // return lines as a single string

F=_=>[..."`1234567890-=~~QWERTYUIOP[]\\~ASDFGHJKL;'~~ZXCVBNM,./~"].map(x=>(o+=`/${b='_'.repeat(w=x<y?2:' 667699'[x=["BS","TAB","CAPS","ENTER"][p++]||'SHIFT',p])}\\|`,m+=y+(x+'    ').slice(0,w)+y+y,n+=y+b+y+y,l+=' __'+b)[73]&&(k.push(l,m,n,o),l='',m=n=o=y),m=n=o=y='|',p=l=k=[])&&k.join`
`

O.textContent=F()
<pre id=O></pre>


5

Swift, 777 byte

func b(_ c:String,_ d:Int,_ e:Int)->[String]{var f=Array(" __ |||||||||/\\|".characters),g=[String]()
for h in 0..<4{var i="";for j in e..<4{i.append(f[j+h*4])
if j==1{var k="_",l=0;if h==1{k=" ";l=c.characters.count;i += c}
for _ in l..<d{i+=k}}};g.append(i)};return g}
func c(_ d:String)->[(String,Int)]{return Array(d.characters).map{("\($0)",2)}}
func d(_ e:String,_ f:Int)->[(String,Int)]{return [(e,f)]}
var e=[c("`1234567890-=")+d("BS",6),d("TAB",6)+c("QWERTYUIOP[]\\")]
e+=[d("CAPS",7)+c("ASDFGHJKL;'")+d("ENTER",6),d("SHIFT",9)+c("ZXCVBNM,./")+d("SHIFT",9)]
var f="";for g in 0..<e.count{let h=e[g]
var i=[[String]]();for j in 0..<h.count{
let k=h[j],l=b(k.0,k.1,(j>0 ? 1:0));i.append(l)}
for k in 0..<4{if g>0||k>0{f+="\n"}
for l in i{f+=l[k]}}};print(f,separator:"")

Swift nói chung không phải là một ngôn ngữ tuyệt vời để lựa chọn chơi golf, vì vậy, ít hơn gấp đôi câu trả lời nhỏ nhất hiện tại (nhanh) là một thách thức tốt ở đây!

Ung dung:

func createKeyboard() {
    func createKey(_ text: String, _ middleWidth: Int, _ startingColumn: Int) -> [String] {
        var keyTempalte = " __ |||||||||/\\|"
        var keyTemplateCharacters = Array(keyTempalte.characters)

        var output = [String]()

        for y in 0 ..< 4 {
            var line = ""
            for x in startingColumn ..< 4 {
                line.append(keyTemplateCharacters[x + y*4])

                if x == 1 {
                    var spacingCharacter = "_"
                    var startingOffset = 0
                    if y == 1 {
                        spacingCharacter = " "
                        startingOffset = text.characters.count
                        line += text
                    }

                    for _ in startingOffset ..< middleWidth {
                        line += spacingCharacter
                    }
                }
            }
            output.append(line)
        }

        return output
    }

    func stringToCharacterStrings(_ str: String) -> [(String, Int)] {
        return Array(str.characters).map {("\($0)",2)}
    }

    func specialKey(_ str: String, _ middleWidth: Int) -> [(String, Int)] {
        return [(str, middleWidth)]
    }

    var keys = [stringToCharacterStrings("`1234567890-=") + specialKey("BS", 6),
                specialKey("TAB", 6) + stringToCharacterStrings("QWERTYUIOP[]\\")]
    keys += [specialKey("CAPS", 7) + stringToCharacterStrings("ASDFGHJKL;'") + specialKey("ENTER", 6),
                specialKey("SHIFT", 9) + stringToCharacterStrings("ZXCVBNM,./") + specialKey("SHIFT", 9)]

    var output = ""
    for r in 0 ..< keys.count {
        let row = keys[r]
        var rowKeys = [[String]]()
        for i in 0 ..< row.count {
            let elem = row[i]
            let key = createKey(elem.0, elem.1, (i>0 ? 1 : 0))
            rowKeys.append(key)
        }

        for y in 0 ..< 4 {
            if r > 0 || y > 0 {
                output += "\n"
            }

            for key in rowKeys {
                output += key[y]
            }
        }
    }

    print(output)
}

createKeyboard()

2
ít nhất đó không phải là applescript
Addison Crump

1
Bây giờ tôi phải làm Java không phải tôi
CAD97

4

SOGL V0.12 , 131 128 127 byte ( cạnh tranh? )

⅟]y‘9Δø∑"`ŗ0-=”čΚ"TAB  ”QWERTYUIOP[]\”č+"oF«▒Β²‘⁷Ο‘ASDFGHJKL;'”čΚ+"_№K³‘ZXCVBNM,./”č⁴++¹{"^쳑č;{U;"_||/”┼;{"_ŗ__”┼}"Ο  ψ¦℮³‘┼}O

SOGL không có 2*2/2/2*thoái thác, nhưng những người cảm thấy quá nhiều như một built-in cho thách thức này.
Hãy thử nó ở đây!

...‘               push "BS   "                                            ["BS   "]
    9Δ             push an array of numbers up to 9                        ["BS   ", [1,2,3,4,5,6,7,8,9]]
      ø∑           join into a single string (without ø it results to 45)  ["BS   ", "123456789"]
        "`ŗ0-=”    push "`ŗ0-=" with ŗ replaced with the digits            ["BS   ", "`1234567890-="]
               č   chop that into an array of characters                   ["BS   ", ["`","1","2","3","4","5","6","7","8","9","0","-","="]]
                Κ  add the first "BS   " to the end of the array           [["BS   ","`","1","2","3","4","5","6","7","8","9","0","-","="]]

"TAB  ”            push "TAB  "                  [[..], "TAB  "]
       Q..P[]\”    push "QWERTYUIOP[]\"          [[..], "TAB  ", "QWERTYUIOP[]\"]
               č   chop that                     [[..], "TAB  ", ["Q","W","E","R","T","Y","U","I","O","P","[","]","\"]]
                +  prepend to the array "TAB  "  [[..], ["TAB  ","Q","W","E","R","T","Y","U","I","O","P","[","]","\"]]

"...‘             push "caps  "                       [.. , "caps  "]
     ⁷Ο‘          push "enter"                        [.. , "caps  ", "enter"]
        AL;'”     push "ASDFGHJKL;'"                  [.. , "caps  ", "enter", "ASDFGHJKL;'"]
             č    chop that                           [.. , "caps  ", "enter", ["A","S","D","F","G","H","J","K","L",";","'"]]
              Κ   append "enter" to the end of array  [.. , "caps  ", ["A","S","D","F","G","H","J","K","L",";","'","enter"]]
               +  prepend "caps  " to the array       [.. , ["caps  ","A","S","D","F","G","H","J","K","L",";","'","enter"]]

"..‘             push "shift   "                [..., "shift   "]
    ZM,./”       push "ZXCVBNM,./"              [..., "shift   ", "ZXCVBNM,./"]
          č      chop it                        [..., "shift   ", ["Z","X","C","V","B","N","M",",",".","/"]]
           ⁴     duplicate the shift            [..., "shift   ", ["Z","X","C","V","B","N","M",",",".","/"], "shift   "]
            ++   append and prepend the shifts  [..., ["shift   ","Z","X","C","V","B","N","M",",",".","/","shift   "]]
              ¹  get all the arrays into one big array
result: [[["BS   ","`","1","2","3","4","5","6","7","8","9","0","-","="], ["TAB  ","Q","W","E","R","T","Y","U","I","O","P","[","]","\"], ["caps  ","A","S","D","F","G","H","J","K","L",";","'","enter"], ["shift   ","Z","X","C","V","B","N","M",",",".","/","shift   "]]]
 - a 2D array of the keyboard characters

{                                    for each array in the array do
 "...‘                                 push " |||"
      č                                chop to chars
       ;                               get the main array ontop
        {                        }     for each string in the array
         U                               uppercase it (before lowercase was used for better compression)
          ;                              get the chopped array ontop
           "_||/”                        push "_||/"
                 ┼                       append vertically
                  ;                      get the string ontop
                   {       }             for each char in the string do
                    "_ŗ__”                 push "_ŗ__"
                          ┼                append vertically
                            "..‘         push "    _||\ |||"
                                ┼        append vertically-then horizontally
                                  O    output that in a newline

Wow, điều này là siêu ấn tượng! Không ai quản lý để đánh bại tôi về điều này chưa, rất tốt! Tôi có thể cố gắng để có được của tôi chỉ ngắn hơn một chút, nhưng không có lời hứa. ;)
DJMcMayhem

@dzamia mặc dù bây giờ nó đang cạnh tranh, tôi đã chấp nhận câu trả lời khi điều này không xảy ra. Tôi có nên chuyển câu trả lời?
Bạch tuộc ma thuật Urn

@MagicOctopusUrn IMO tùy thuộc vào bạn. Có một lý do mà nó đề nghị không chấp nhận câu trả lời: p
dzaima

Đó là đề nghị không chấp nhận câu trả lời? Ồ ... đủ công bằng. Sau đó, tôi đoán tôi sẽ ngừng chấp nhận câu trả lời trong tương lai và để nguyên như vậy.
Bạch tuộc ma thuật Urn

@MagicOctopusUrn không sao, có thể không chấp nhận câu trả lời là một chút tranh cãi, nhưng vẫn, một tích cực lớn
dzaima

4

Python 2, 394 388 380 byte

k=[4]*13+[8],[8]+[4]*13,[9]+[4]*11+[8],[11]+[4]*10+[11];m='`1234567890-=*','*QWERTYUIOP[]*',"*ASDFGHJKL;'*",'*ZXCVBNM,./*';c,d,e,n,u=0,'','|','\n','_'
for a in 0,1,2,3:
 f=s=t=o='';x=0
 for y in k[a]:g=y-2;f+=' '+u*y;s+=e*2+m[a][x].replace('*','%s')+' |';t+=e*2+u*g+e;o+='|/'+u*g+'\\';x+=1
 d+=f+n+s+e+n+t+e+n+o+e+n
l='SHIFT   ';print d%('BS   ','TAB  ','\\','CAPS  ','ENTER',l,l)

Chỉ cần xây dựng một chuỗi lớn đại diện cho toàn bộ bàn phím, thay thế * bằng% s cho các phím đặc biệt sau đó sử dụng định dạng chuỗi để cập nhật các đặc biệt.

Biên tập

Bây giờ có một dòng mới ở cuối đầu ra nhưng tôi không thấy bất cứ nơi nào không được phép.

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


Tôi nghĩ bạn nên loại bỏ đầu ra, vì nó không thêm bất cứ điều gì liên quan.
sergiol

1
@sergiol - điểm tốt. Không biết đến TIO tại thời điểm đăng. Bây giờ cập nhật.
ElPedro

3

C #, 376 byte (khi trong một dòng)


var s="";foreach(var r in@"`|1|2|3|4|5|6|7|8|9|0|-|=|BS   ~TAB  |Q|W|E|R|T|Y|U|I|O|P|[|]|\~CAPS  |A|S|D|F|G|H|J|K|L|;|'|ENTER~SHIFT   |Z|X|C|V|B|N|M|,|.|/|SHIFT   ".Split('~'))for(int i=0,l;i<4;i++){foreach(var k in r.Split('|')){l=k.Length+1;var u=new string('_',l);s+=i<1?" "+u+"__":i<2?"||"+k.PadRight(l)+"|":i<3?"||"+u+"|":"|/"+u+@"\";}s+=i>0?"|\n":"\n";}Console.Write(s);

Điều này hoàn toàn dựa trên câu trả lời C # của Klinger. Tôi không có đủ đại diện để bình luận về câu trả lời của anh ấy, nếu không tôi sẽ làm thế.

Tôi đã có thể làm giảm mã của Klinger xuống 5 byte, bằng cách sửa đổi vòng lặp foreach ban đầu và loại bỏ các dấu ngoặc không liên quan.

var s="";
foreach(var r in@"`|1|2|3|4|5|6|7|8|9|0|-|=|BS   ~TAB  |Q|W|E|R|T|Y|U|I|O|P|[|]|\~CAPS  |A|S|D|F|G|H|J|K|L|;|'|ENTER~SHIFT   |Z|X|C|V|B|N|M|,|.|/|SHIFT   ".Split('~'))
for(int i=0,l;i<4;i++)
{
foreach(var k in r.Split('|'))
{
l=k.Length+1;
var u=new string('_',l);
s+=i<1?" "+u+"__"
:i<2
?"||"+k.PadRight(l)+"|"
:i<3
?"||"+u+"|"
:"|/"+u+@"\";
}
s+=i>0?"|\n":"\n";
}
Console.Write(s);

Tốt một @Bence Joful. Với đề nghị của bạn, tôi sẽ có thể đưa nó đến 367. Tôi chưa kết hợp với câu trả lời hiện tại.
Klinger

Không thể cưỡng lại. Đề xuất của bạn + một số thay đổi nhỏ bổ sung đưa nó đến 361 (hoặc 358 với phép nội suy chuỗi).
Klinger

@Klinger - vui lòng sử dụng các tinh chỉnh của tôi! Tôi đã được truyền cảm hứng để chơi xung quanh nó dựa trên công việc của bạn. Tôi đã học được một cái gì đó về khởi tạo trong quá trình.
Bence Joful

Bạn có thể bao gồm chương trình một dòng? Bạn sẽ không thực sự mất nhiều khả năng đọc so với hiện tại
Cyoce

@Cyoce, bạn hiểu rồi, cảm ơn vì lời đề nghị. Mặc dù tại thời điểm này, Klinger đã đăng một phiên bản mới, nhỏ hơn kết hợp những thay đổi này.
Bence Joful

3

m4, 456

changequote({,})define(d,{define($@)})d(p,{patsubst($@)})d(a,{{_}p({$1},.,_)_ })d(b,{|$1||})d(c,{|p({$1},.,_)||})d(e,{/p({$1},.,_)\|})d(f,{ifelse(len({$2}),0,,{indir({$1},{$2})f({$1},shift(shift($@)))})})d(g,{ f({a},$@)
|f({b},$@)
|f({c},$@)
|f({e},$@)
})g(` ,1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9 ,0 ,- ,= ,BS    )g(TAB   ,Q ,W ,E ,R ,T ,Y ,U ,I ,O ,P ,[ ,] ,\ )g(CAPS   ,A ,S ,D ,F ,G ,H ,J ,K ,L ,; ,' ,ENTER )g(SHIFT    ,Z ,X ,C ,V ,B ,N ,M ,{,} ,. ,/ ,SHIFT    )

Ung dung:

changequote({,})dnl
define(key1, {{_}patsubst({$1}, ., _)_ })dnl _______ 
define(key2, {|$1||})dnl                     |TAB  ||
define(key3, {|patsubst({$1}, ., _)||})dnl   |_____||
define(key4, {/patsubst({$1}, ., _)\|})dnl   /_____\|
define(rkey, {dnl
ifelse(dnl
len({$2}), 0, ,dnl terminate on empty argument
{dnl
indir({$1}, {$2})dnl
rkey({$1}, shift(shift($@)))dnl
}dnl
)dnl
})dnl
define(row, {dnl
 rkey({key1}, $@)
|rkey({key2}, $@)
|rkey({key3}, $@)
|rkey({key4}, $@)dnl
})dnl
row(` ,1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9 ,0 ,- ,= ,BS    )
row(TAB   ,Q ,W ,E ,R ,T ,Y ,U ,I ,O ,P ,[ ,] ,\ )
row(CAPS   ,A ,S ,D ,F ,G ,H ,J ,K ,L ,; ,' ,ENTER )
row(SHIFT    ,Z ,X ,C ,V ,B ,N ,M ,{,} ,. ,/ ,SHIFT    )

(Đây thực sự là lần đầu tiên tôi vừa chơi golf và thử chơi m4.)


Không tệ cho một câu trả lời đầu tiên. Chào mừng đến với trang web! :)
DJMcMayhem

3

xếp chồng lên nhau , 228 byte

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

[,{a:a size@n(' __' '_'n 1+:@k*LF'||'a' ' '|'LF'||' '_'k*:@o'|'LF'|/'o'\')sum}"!$hcat#/!' |||'hcat out]@:p$chars@:c'`1234567890-='c'BS   'p'TAB  ' 'QWERTYUIOP[]\'c p'CAPS  ' 'ASDFGHJKL;'''c,'ENTER'p'SHIFT   ':@q'ZXCVBNM,./'c,q p

Hoặc, dễ đọc hơn một chút:

{a:a size@n(' __' '_'n 1+:@k*LF'||'a' ' '|'LF'||' '_'k*'|'LF'|/' '_'k*'\')sum}"@:m
[,m$hcat#/!' |||'hcat out]@:p
'`1234567890-='chars'BS   'p
'TAB  ' 'QWERTYUIOP[]\'chars p
'CAPS  ' 'ASDFGHJKL;'''chars,'ENTER'p
'SHIFT   ':@q'ZXCVBNM,./'chars,q p

Điều này hoạt động bằng cách xác định một chức năng ptạo ra một khóa, sau đó hcating nhiều khóa.


2

Haskell, 255

import Data.List;a#b=a++[b];e=" |||";s=map(:" ");k x=[e,"_||/"]++['_':c:"__"|c<-x]#"_||\\";t="SHIFT    ";main=mapM_ putStrLn$transpose.(#e).(k=<<)=<<[s"`1234567890-="#"BS    ","TAB   ":s"QWERTYUIOP[]\\","CAPS   ":s"ASDFGHJKL;'"#"ENTER ",t:s"ZXCVBNM,./"#t]

Nhìn lại, khái niệm tương tự với câu trả lời Haskell này , nhưng sản xuất bàn phím ASCII, và với cách chơi golf hơi khác nhau.

Được định dạng và đổi tên:

import Data.List

main :: IO ()
main = mapM_ putStrLn
  $ concatMap (transpose . (`append` end) . concatMap key)
  [ split "`1234567890-=" `append` "BS    "
  , "TAB   " : split "QWERTYUIOP[]\\"
  , "CAPS   " : split "ASDFGHJKL;'" `append` "ENTER "
  , shift : split "ZXCVBNM,./" `append` shift
  ]

key :: String -> [String]
key x
  = [end, "_||/"]
  ++ ['_' : c : "__" | c <- x]
  `append` "_||\\"

append :: [a] -> a -> [a]
append a b = a ++ [b]

split :: [Char] -> [String]
split = map (: " ")

end :: String
end = " |||"

shift :: String
shift = "SHIFT    "

2

tcl, 368

Như được tính bởi http://textmechanic.com/text-tools/basic-text-tools/count-char character -words-lines / với "Đếm dòng ngắt dưới dạng khoảng trắng." thiết lập để về, nó chiếm 505 496 452 451 439 403 401 396 391 388 385 384 382 379 378 377 369 368

proc N x {split $x @}
proc M a\ b {string map $a $b}
regsub -all \[^@|] [set b [M [N {||||@|||@$@BS   @%@TAB  @&@CAPS @? @ENTER  @*@SHIFT   }] [regsub -all {[^@]} "`1234567890-=$@%QWERTYUIOP\[\]\\@&ASDFGHJKL;'?@*ZXCVBNM,./*" {||& ||}]]] _ f
lmap x [N [M {\\ _ / _ | \ } [set g [M {||_ |/_ _|| _\\|} [M {||| \\|/} $f]]]]] y [N $b] z [N $f] w [N $g] {puts "$x
$y
$z
$w"}

Bản trình diễn: http://rextester.com/live/NTVAV88033

Con linh cẩu:

Hợp tác trực tiếp trên http://rextester.com/live/UDO43692

regsub -all {(\S)} "`1234567890-=←\n%QWERTYUIOP\[\]\\\n⇩ASDFGHJKL;'↵\n⇧ZXCVBNM,./⇧" {||\1 ||} b
set b [string map {|||| |||  ← "BS   " % "TAB  " ⇩ "CAPS  " ↵ "ENTER" ⇧ "SHIFT   "} $b]

regsub -all {[^\n|]} $b _ f

set g [string map {||| \\|/} $f]
set g [string map {||_ |/_  _|| _\\|} $g]
set h [string map {\\ _ / _ | " "} $g]

set H [split $h \n]
set B [split $b \n]
set F [split $f \n]
set G [split $g \n]

lmap x $H y $B z $F w $G {
puts $x
puts $y
puts $z
puts $w
}

Bất cứ ai cũng được miễn phí và hoan nghênh cải thiện phiên bản của tôi trên các trang web hợp tác trực tiếp, nhưng vui lòng: không chỉnh sửa câu trả lời ban đầu của tôi ở đây; chỉ cần nói rằng bạn đã chỉnh sửa trong các bình luận và mọi người sẽ truy cập các liên kết.

CẬP NHẬT 1: Được thay thế forbởi foreachvì sau này tạo ra mã ngắn hơn

CẬP NHẬT 2: Được thay thế foreachbởi lmapvì sau này tạo ra mã ngắn hơn

CẬP NHẬT 3: Cạo một char vì tôi thay thế " "bởi\

CẬP NHẬT 4: Đối với nhận xét đầu tiên, tôi đã thay đổi tất cả các ký tự giữ chỗ Unicode 2 byte dòng 1 thành các ký tự ASCII 1 byte

CẬP NHẬT 5: nhiều putsdòng được tạo thành chỉ một

CẬP NHẬT 6: sử dụng splitcác lệnh trực tiếp trả về giá trị trong lmapcuộc gọi thay vì sử dụng các biến danh sách trung gian

CẬP NHẬT 7:ENTER Không cần trích dẫn xung quanh

CẬP NHẬT 8: string map đủ dài và lặp đi lặp lại một số lần mà nó đáng để gói gọn trong mộtproc

CẬP NHẬT 9: split $x \n đủ dài và lặp đi lặp lại một số lần mà nó đáng để gói gọn trong mộtproc

CẬP NHẬT 10: Trên chuỗi "thay thế" có thể sử dụng &thay thế \1, vì trong trường hợp này cả hai trùng khớp; một hậu quả khác của việc này là nó cho phép loại bỏ ()chuỗi "khớp".

CẬP NHẬT 11: Sử dụng @thay vì \nphân tách dòng để sử dụng thêm theo splithướng dẫn. Mặc dù chuỗi "khớp" kéo dài từ đó \Sthành chuỗi [^@], do số lần lặp lại

CẬP NHẬT 12: Thay thế regsubchuỗi "khớp" đầu tiên {[^@|]}bằng cách \[^@|]tắt một ký tự. Thật không may, không thể làm tương tự với lần thứ hai regsub, bởi vì hướng dẫn nằm trong một cặp []:(

CẬP NHẬT 13: Cạo hai ký tự Enter bằng cách tập trung lmapcơ thể với tiêu đề riêng.

CẬP NHẬT 14: Đã sử dụng một cuộc gọi đến splitthủ tục dựa trên Nthay vì cuộc gọi trực tiếp đến string mapthủ tục dựa trên Ncho phép rút ngắn 3 ký tự

CẬP NHẬT 15: Có một nhân vật không gian không cần thiết . Loại bỏ nó để cạo một char.

CẬP NHẬT 16: set h có thể được nhúng để loại bỏ $h, để loại bỏ một ký tự.

CẬP NHẬT 17: set h tuyên bố thực sự có thể được cạo đi.

CẬP NHẬT 18: puts đối số đã thay đổi từ ...\n...\n...\n...định dạng sang

"...
...
...
..." 

định dạng.

Cảm ơn mọi người đã giúp tôi rút ngắn nó, đặc biệt là evilotto và khía cạnh của kênh IRC tcl!


Câu trả lời hay, và Chào mừng đến với trang web! Tôi đã thực hiện một chỉnh sửa nhỏ cho bài đăng của bạn để số byte sẽ xuất hiện trong tiêu đề, tôi hy vọng bạn không phiền. Để bạn biết, tôi nghĩ rằng đây thực sự là 469 byte vì một số ký tự đó là nhiều byte trong UTF-8. Tôi không biết nhiều về tcl, nó có sử dụng mã hóa tùy chỉnh trong đó là một byte không?
DJMcMayhem

@DJMcMayhem Tôi không biết đó là số byte dựa trên số ký tự nhưng nó không phải là vấn đề vì mọi thứ chỉ là ký hiệu một byte vẫn không được sử dụng có thể là một trình giữ chỗ và tôi vẫn có sẵn nhiều.
sergiol

@DJMcMayhem sau khi chỉnh sửa của tôi, vấn đề không phải bạn báo cáo đã biến mất!
sergiol

@DJMcMayhem Tại sao đầu trên có một nền màu vàng trong một thời gian?
sergiol

2

tcl, 369

Ban đầu dựa trên phiên bản sergiol của tcl.
(Lưu ý rằng nhiều không gian bên trái là một phần của "bản chất" của tcl)

lmap z {S R M} w {set "regsub -all" "string map"} {interp alias {} $z {} {*}$w};lmap x {"`1234567890-=¿BS   ¿" "¿TAB  ¿QWERTYUIOP\[\]\\" "¿CAPS  ¿ASDFGHJKL;'¿ENTER¿" "¿SHIFT   ¿ZXCVBNM,./¿SHIFT   ¿"} {S h [M {\\ _ / _ | \ } [S g [M {||_ |/_  _|| _\\|} [M {||| \\|/} [S f [R {[^\n|]} [S b [M {|||| |||} [R {¿(\S+\s*)¿|(.)} $x {||\1\2 ||}]]] _ ]]]]]];puts $h\n$b\n$f\n$g}

@muddyfish Đã chỉnh sửa và sửa lỗi. Cảm ơn!
Alejandro Muzzachiodi

Bạn có thể rút ngắn nhiều hơn nếu bạn trực tiếp thay thế tất cả các foreachlần xuất hiện bằng cách lmap!
sergiol

Cố gắng sử dụng của bạn interp aliastiếp cận để rút ngắn phiên bản của tôi, nhưng ngắn nhất tôi có thể nhận được khi làm việc đó là 398 :( rextester.com/live/NTVAV88033
sergiol

Lần thử cuối cùng của tôi, tôi đã nhận được 395:lmap z {S R M N} w {set "regsub -all" "string map" split} {interp alias {} $z {} {*}$w};lmap y [N [S b [M [N {||||@|||@$@BS @%@TAB @&@CAPS @? @ENTER @*@SHIFT } @] [R {[^@]} "`1234567890-=$@%QWERTYUIOP\[\]\\@&ASDFGHJKL;'?@*ZXCVBNM,./*" {||& ||}]]] @] z [N [S f [R {[^@|]} $b _]] @] w [N [S g [M {||_ |/_ _|| _\\|} [M {||| \\|/} $f]]] @] x [N [M {\\ _ / _ | \ } $g] @] {puts $x\n$y\n$z\n$w}
sergiol

Bạn có thể lưu một char nếu bạn xóa một khoảng trống không cần thiết như trong bản cập nhật mới nhất của tôi!
sergiol

2

C (gcc) , 378 342 330 byte

-10 byte nhờ vào trần nhà.

Một cú đâm đầu tiên vào nó. Các g () lặp đi lặp lại gợi ý phòng để cải thiện.

Chỉnh sửa: Có chúng tôi đi.

char*k[]={"eZXCVBNM,./e","cASDFGHJKL;'d","bQWERTYUIOP[]\\","`1234567890-=a","BS","TAB","CAPS","ENTER","SHIFT"},*s;f(w,i,j){for(i=4;i--;)for(j=4;j--;puts(""))for(s=k[i];w=*s>96?"FFGFI"[*s-97]-64:2,*s;)printf("%s%s%-*.*s%.2s",L" |"+(s++-k[i]?2:j<3),L"/||"+j,w,j<2?w:j^3?w>2?w:1:w+2,j^2?"___________":w>2?k[*s-93]:s,"\\||||| "+j*2);}

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


1

Python 2, 672 byte

Sử dụng chuỗi zlib đã nén:

print 'x\x9c\xad\xd3\xb9\x0e\x82@\x10\x80\xe1\x9e\xa7\xa0\xb3\xf1\xbe\x8d\xb1\x00\xbc\x0f<\xc0\x1b\xb3>\xc8<\xbc\xfc\x8bf\x8d\xed8\xc5\x17\x9a\xddd\xfe,\xbe\xc9\xc7\xd7b?<\x91\xa7/"\rhB\x0b\xda\xd0\x81.\xf4\xa0\x0f\x03\xa8C\x05F\x10&~>"\xf9]\xc6\x88\x16\x86\xbbj\xc6dZ\x98L<\xb7\xae\x9a|\xc74\x08\xed\xba\xb2\x873L\xe0\x00)\\\xe1\x08\x0b\xd8\xc2\x0e\xee\xf0\x80\xec\xd3\xabXW\x1d\xces\xeb\xaa\xc3\xb9^\x7fy_Q\xb0K\x8a`\x01$0\x86)\xcc`\x0eKX\xc1\x1a\x86P\xb2u\xe3tr\xf8\xee\xf5\xaf\xf7\xa5\x0e\xf6\xfb\xbet\xb1\xde\xbd\x92\xf9b\x9a\x16\x7f\x94\xdc\xe0\x02\x11\x9c\xec\xef\x061l\xa0\x0cU\xa8\xd9\xbc\xee\xb4\xeb\xa5\x8a\xf5\xd3K\x15\xcb\x9e~\x01r\xfc\xb9\xee'.decode('zlib')

2
Đó là 672 byte, không phải 232 byte.
nneonneo

Giải thích thêm, tôi không hiểu bạn. @nneonneo
Bất kể

1
Nếu bạn dán mã của mình vào một tệp, tệp đó sẽ dài 672 byte. Dường như bạn đã đếm mã của mình len("print 'x\x9c...'")sẽ không hiển thị \xs, dẫn đến số byte không chính xác . Bạn có thể có được số đếm chính xác bằng cách đếm với len(r"print 'x\x9c...'")nhưng giải pháp đơn giản nhất, như mọi khi, là để xem trình soạn thảo văn bản hoặc hệ thống tệp của bạn nói gì.
nneonneo

1

Powershell, 249 242 byte

"``1234567890-=Bs   
Tab  QWERTYUIOP[]\
Caps  ASDFGHJKL;'Enter
Shift   ZXCVBNM,./Shift   "-split'
'|%{($u=($r=,''+($_-csplit'(.[a-z ]*)'-ne''|% t*per)+'')-replace'.','_')-join'__ _'
$r-join' |||'
$u-join'_|||'
$u-join'_\|/'}|%{-join$_[2..76]}

Giải thích & giải thích

Người trung gian ·sử dụng thay vào đó là khoảng trắng để làm rõ chuỗi nguồn.

"``1234567890-=Bs···
Tab··QWERTYUIOP[]\
Caps··ASDFGHJKL;'Enter
Shift···ZXCVBNM,./Shift···"-split"`n"|%{        # split the string with rows by new line
$r=,''+($_-csplit'(.[a-z ]*)'-ne''|% t*per)+''  # split each row by key labels (any char plus small letters or spaces), 't*per' is shortcut for toUpper method
$u=$r-replace'.','_'                            # replace any char to _ to take an upper 
$u-join'__ _'                                   # join labels and push 4 strings to pipe
$r-join' |||'
$u-join'_|||'
$u-join'_\|/'
}|%{
    -join$_[2..76]                              # return substring for each string
}

# $r =
# ["","`","1","2","3","4","5","6","7","8","9","0","-","=","BS   ",""]
# ["","TAB  ","Q","W","E","R","T","Y","U","I","O","P","[","]","\",""]
# ["","CAPS  ","A","S","D","F","G","H","J","K","L",";","'","ENTER",""]
# ["","SHIFT   ","Z","X","C","V","B","N","M",",",".","/","SHIFT   ",""]
# $u =
# ["","_","_","_","_","_","_","_","_","_","_","_","_","_","_____",""]
# ["","_____","_","_","_","_","_","_","_","_","_","_","_","_","_",""]
# ["","______","_","_","_","_","_","_","_","_","_","_","_","_____",""]
# ["","________","_","_","_","_","_","_","_","_","_","_","________",""]
# before substring:
# __ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ________ _
#  |||` |||1 |||2 |||3 |||4 |||5 |||6 |||7 |||8 |||9 |||0 |||- |||= |||BS    |||
# _|||__|||__|||__|||__|||__|||__|||__|||__|||__|||__|||__|||__|||__|||______|||
# _\|/__\|/__\|/__\|/__\|/__\|/__\|/__\|/__\|/__\|/__\|/__\|/__\|/__\|/______\|/
# __ ________ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ _
#  |||TAB   |||Q |||W |||E |||R |||T |||Y |||U |||I |||O |||P |||[ |||] |||\ |||
# _|||______|||__|||__|||__|||__|||__|||__|||__|||__|||__|||__|||__|||__|||__|||
# _\|/______\|/__\|/__\|/__\|/__\|/__\|/__\|/__\|/__\|/__\|/__\|/__\|/__\|/__\|/
# __ _________ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ________ _
#  |||CAPS   |||A |||S |||D |||F |||G |||H |||J |||K |||L |||; |||' |||ENTER |||
# _|||_______|||__|||__|||__|||__|||__|||__|||__|||__|||__|||__|||__|||______|||
# _\|/_______\|/__\|/__\|/__\|/__\|/__\|/__\|/__\|/__\|/__\|/__\|/__\|/______\|/
# __ ___________ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ___________ _
#  |||SHIFT    |||Z |||X |||C |||V |||B |||N |||M |||, |||. |||/ |||SHIFT    |||
# _|||_________|||__|||__|||__|||__|||__|||__|||__|||__|||__|||__|||_________|||
# _\|/_________\|/__\|/__\|/__\|/__\|/__\|/__\|/__\|/__\|/__\|/__\|/_________\|/
# final output:
#  ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ________
# ||` |||1 |||2 |||3 |||4 |||5 |||6 |||7 |||8 |||9 |||0 |||- |||= |||BS    ||
# ||__|||__|||__|||__|||__|||__|||__|||__|||__|||__|||__|||__|||__|||______||
# |/__\|/__\|/__\|/__\|/__\|/__\|/__\|/__\|/__\|/__\|/__\|/__\|/__\|/______\|
#  ________ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____
# ||TAB   |||Q |||W |||E |||R |||T |||Y |||U |||I |||O |||P |||[ |||] |||\ ||
# ||______|||__|||__|||__|||__|||__|||__|||__|||__|||__|||__|||__|||__|||__||
# |/______\|/__\|/__\|/__\|/__\|/__\|/__\|/__\|/__\|/__\|/__\|/__\|/__\|/__\|
#  _________ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ________
# ||CAPS   |||A |||S |||D |||F |||G |||H |||J |||K |||L |||; |||' |||ENTER ||
# ||_______|||__|||__|||__|||__|||__|||__|||__|||__|||__|||__|||__|||______||
# |/_______\|/__\|/__\|/__\|/__\|/__\|/__\|/__\|/__\|/__\|/__\|/__\|/______\|
#  ___________ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ___________
# ||SHIFT    |||Z |||X |||C |||V |||B |||N |||M |||, |||. |||/ |||SHIFT    ||
# ||_________|||__|||__|||__|||__|||__|||__|||__|||__|||__|||__|||_________||
# |/_________\|/__\|/__\|/__\|/__\|/__\|/__\|/__\|/__\|/__\|/__\|/_________\|

Thêm: bàn phím có thanh không gian và nhãn được căn phải, 278 byte

Tôi đã thêm một vài byte vào biểu thức chính quy để xử lý thanh không gian (regrec cũ (.[a-z ]*), mới ~|(.[a-z ]*)). Đó là một bước nhỏ cho regrec, một bước nhảy vọt cho giải pháp: giờ đây bạn có thể hiển thị thanh không gian và nhãn khóa được căn bên phải (xem SHIFT, CTRL và BS ở bên phải bàn phím).

"``1234567890-=~   bs
Tab  QWERTYUIOP[]\
Caps  ASDFGHJKL;'Enter
Shift   ZXCVBNM,./~   shift
Ctrl  Alt ~$(' '*34)Alt ~  ctrl"-split'
'|%{($u=($r=,''+($_-csplit'~|(.[a-z ]*)'-ne''|% t*per)+'')-replace'.','_')-join'__ _'
$r-join' |||'
$u-join'_|||'
$u-join'_\|/'}|%{-join$_[2..76]}

Đầu ra:

 ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ________
||` |||1 |||2 |||3 |||4 |||5 |||6 |||7 |||8 |||9 |||0 |||- |||= |||   BS ||
||__|||__|||__|||__|||__|||__|||__|||__|||__|||__|||__|||__|||__|||______||
|/__\|/__\|/__\|/__\|/__\|/__\|/__\|/__\|/__\|/__\|/__\|/__\|/__\|/______\|
 ________ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____
||TAB   |||Q |||W |||E |||R |||T |||Y |||U |||I |||O |||P |||[ |||] |||\ ||
||______|||__|||__|||__|||__|||__|||__|||__|||__|||__|||__|||__|||__|||__||
|/______\|/__\|/__\|/__\|/__\|/__\|/__\|/__\|/__\|/__\|/__\|/__\|/__\|/__\|
 _________ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ________
||CAPS   |||A |||S |||D |||F |||G |||H |||J |||K |||L |||; |||' |||ENTER ||
||_______|||__|||__|||__|||__|||__|||__|||__|||__|||__|||__|||__|||______||
|/_______\|/__\|/__\|/__\|/__\|/__\|/__\|/__\|/__\|/__\|/__\|/__\|/______\|
 ___________ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ___________
||SHIFT    |||Z |||X |||C |||V |||B |||N |||M |||, |||. |||/ |||   SHIFT ||
||_________|||__|||__|||__|||__|||__|||__|||__|||__|||__|||__|||_________||
|/_________\|/__\|/__\|/__\|/__\|/__\|/__\|/__\|/__\|/__\|/__\|/_________\|
 _________ _______ _____________________________________ _______ _________
||CTRL   |||ALT  |||                                   |||ALT  |||  CTRL ||
||_______|||_____|||___________________________________|||_____|||_______||
|/_______\|/_____\|/___________________________________\|/_____\|/_______\|

0

/// , 360 byte

/f/!!//e/SHIFT   //d/\/\///c/ "db/ 
\|\|da/\\\|d@/#####d?/__d>/?\\\\a
c"d</aa
ad:/fffff!d&/ccccd%/ aaad#/?aaa?aaad"/??d!/?\\\\a\\\d&&&cc"b`%1%2%3%4%5%6%7%8%9%0%-%=%BS    <|@#?|||"?<\/:f">&&&cbTAB  %Q%W%E%R%T%Y%U%I%O%P%[%]%\\ <|"@#?|||?<\/":f>_&&&"bCAPS  %A%S%D%F%G%H%J%K%L%;%'%ENTER <|"_@#"?<\/"_:!">?_&&ccc"?_be%Z%X%C%V%B%N%M%,%.%\/%e <|""_|||@""_<\/"?_:""_\a

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


0

Toán học 323 byte

Uncompress@"1:eJyt00luwjAUgGE2vUdYsWGeEeoiUGYIEKcTTWXEBXqBd3jy26CUYWe/xads8iT/sounv1gFL4VCoLNxxnyk9UZT5BiISAOa0II2dKALPejDAOpQgVcYqSAbEbtOa3GFuayraZ2mPmWyL5bnIZyxR0/CkQkhe/iECcSQwDe8wwK2sIMf+IV/IW0H56LXkJej+016E9LXlRyHO2VLhqDgDaYwgzksYQVrGELJZI+SSXxX0uOV9Jry2Y10q5iHVPPFNLGvUw7wBWP4ME8XIthAGapQM93zv29COlV8DOkrol10BmvF28U="

Nhàm chán và không sáng tạo. Chuỗi chỉ là đầu ra của Compresslệnh tích hợp được áp dụng cho đầu ra mong muốn.


@Downvote vui lòng cho biết có gì không ổn với chương trình của tôi.
Ian Miller

0

Ngôn ngữ Wolfram (Mathicala) , 293 byte

c=##&@@(#|2&/@Characters@#)&
r=StringRiffle
p=StringPadRight
Print/@{j=p["",#2,"_"]&@@@#;(" __"<>#&/@j)<>" ",r[p@@@#,i={l="||","|||",l}],j~r~i,j~r~{"|/","\|/","\|"}}&/@{{c@"`1234567890-=","BS"|6},{"TAB"|6,c@"QWERTYUIOP[]\\"},{"CAPS"|7,c@"ASDFGHJKL;'","ENTER"|6},{h="SHIFT"|9,c@"ZXCVBNM,./",h}}

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

Tương đối đơn giản: mã hóa các hàng khóa dưới dạng danh sách (key name)|(key width)

c=##&@@(#|2&/@Characters@#)&    (*converts a string into (key)|2 s*)
r=StringRiffle
p=StringPadRight
 Print/@
  {j=p["",#2,"_"]&@@@#;
   (" __"<>#&/@j)<>" ",         (*top of the keys*)
   r[p@@@#,i={l="||","|||",l}], (*key names*)
   j~r~i,                       (*space under key names*)
   j~r~{"|/","\|/","\|"}            (*bottom of the keys*)
  }
 &/@
{
 {c@"`1234567890-=","BS"|6},
 {"TAB"|6,c@"QWERTYUIOP[]\\"},
 {"CAPS"|7,c@"ASDFGHJKL;'","ENTER"|6},
 {h="SHIFT"|9,c@"ZXCVBNM,./",h}
}

0

Perl 5 -MList::Util=pairmap , 313 byte

pairmap{$_=$b;s/\|{3}/|-|/g;y/-/_/c;y/-/ /;s/./ /;chop;say;$_=$b;for$r($a=~/./g){s/\| /|$r/}say;y/|/_/c;say;s,\|_,/_,g;s/_\|/_\\/g;say}"`1234567890-=",($;="||  |")x13 ."||BS    ||","QWERTYUIOP[]\\",'||TAB   |'.$;x13 .'|',"ASDFGHJKL;'","||CAPS   |".$;x11 ."||ENTER ||","ZXCVBNM,./",($s='||SHIFT    |').$;x10 ."$s|"

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.