Tampilkan pola keyboard Peter


8

Asumsikan keyboard sederhana dengan tata letak ini:

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 . , ? !

Pola keyboard Peter dapat dihasilkan dengan mulai dari kiri atas keyboard, dan menampilkan tiga karakter pertama dan baris baru. Ini bergeser lebih dari satu karakter dan menampilkan kunci kedua, ketiga, dan keempat. Setelah mencapai akhir baris, ia berlanjut di akhir baris berikutnya dan berjalan mundur, hingga mencapai awal baris itu dan kemudian maju ke depan pada baris berikutnya, dan seterusnya hingga mencapai awal baris terakhir. .

Ini adalah pola keyboard 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

Tulis program yang tidak menerima input dan menampilkan pola keyboard Peter. Program harus lebih kecil dari 152 byte , yaitu ukuran string yang dihasilkannya.

Ini kode golf, jadi solusi terpendek menang.


Bahkan dalam Golfscript saya berjuang untuk menghasilkan cara yang lebih pendek untuk menghasilkan string dasar 40 karakter.
Peter Taylor

@ PeterTaylor Saya mengharapkan seseorang untuk menggunakan semacam pemahaman daftar, seperti [1..9 0 J..A K..T ! ? , . Z..U].
Peter Olson

Anda dapat menggunakan echo {1..9} "0" {J..A} {K..T} '!?,.' {Z..U}|sed 's/ //g'dalam bash, tetapi harus sudah 13 karakter untuk menambahkan perintah sed, untuk menghapus yang kosong. Ini menghasilkan 57 karakter, dan sejauh ini belum ada triple. Dengan perintah hold sed, seharusnya mungkin, tetapi dalam 6 karakter, untuk mengalahkan solusi perl?
pengguna tidak diketahui

Batas 152 byte sepertinya tidak perlu - hardcoding output tanpa kompresi apa pun golf buruk. Ini juga bisa berpotensi membatasi bahasa seperti brainf ** k, di mana program besar hampir selalu terjadi tetapi masih ada beberapa permainan golf yang pintar.
Zwei

Jawaban:


7

Perl, 63 karakter

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

Solusi ini menggunakan sayfungsi (tersedia sejak Perl 5.10.0 dengan -Eswitch, atau dengan use 5.010). Tanpa itu, yang terbaik yang bisa saya lakukan adalah 67 karakter (dan baris baru tambahan di akhir output):

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

Solusi 65-char sebelumnya:

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

Mengganti say$1dengan print$1.$/memungkinkan kode berjalan pada perl yang lebih lama, dengan biaya 5 karakter tambahan.


Anda mengalahkan saya untuk beberapa karakter. +1.
Toto

2
Pilih solusi 63-char secara langsung. meta discussion
JB

6

APL, 43 karakter

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

Ini berfungsi pada Dyalog APL . Saya berhasil menyelamatkan beberapa karakter dengan menghasilkan string output (semuanya setelah ). Saya akan menulis penjelasan ketika saya punya waktu!

Begini tampilannya:

      ⍪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

Penjelasan, dari kanan ke kiri:

  • Pertama, kami membuat string yang terlihat di semua entri lainnya:
    • 6↑⌽⎕A: ⎕Amemberi kami string alfabet huruf besar, dari A ke Z. Kami kemudian membalikkan ( ) dan mengambil ( ) 6 karakter pertama dari itu, memberi kami 'ZYXWVU'. (Dalam retrospeksi, pendekatan ini tidak berakhir dengan menyelamatkan karakter apa pun, tetapi saya akan membiarkannya karena lebih cocok.)
    • '!?,.',: Kami menyatukan ( ,) string '!?,.'dengan hasil sebelumnya.
    • (10↑10⌽⎕A),: Kami mengambil 10 karakter pertama ( 10↑) dari alfabet, yang diputar pertama kali sepuluh kali ( 10⌽), dan menyatukan ini dengan hasil sebelumnya. Sebagai contoh rotasi, 5⌽'abcdef'(string 'abcdef'diputar 5 kali) memberi kita 'cdefab'.
    • (⌽10↑⎕A),: Ambil 10 karakter pertama dari alfabet dan balikkan, dan gabungkan ini dengan string sebelumnya.
    • (1⌽⎕D),: ⎕Dmemberi kami digit sebagai string, dari 0 hingga 9, inklusif. Kami kemudian memutar ('⌽') string ini dengan 1, menghasilkan '1234567890'. Seperti sebelumnya, kami menggabungkan ini dengan hasil sebelumnya.
  • Sekarang setelah kami membuat string kami (yang menyelamatkan kami 3 karakter dari representasi APL, karena tanda kutip di sekitarnya), kami melakukan beberapa keajaiban untuk membangun hasil akhir kami:
    • 3,/: Kami mengambil string, dalam kelompok tiga karakter, dan menyatukannya.
    • Untuk menyelesaikannya, kita gunakan untuk mengubah vektor string (benar-benar vektor vektor karakter) di sepanjang dimensi pertama. Ini memiliki efek mengubah bentuknya dari 38ke 38 1(matriks 38x1).

6

J, 66 62 45 karakter

Ternyata saya terlalu pintar setengahnya.

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

semua yang saya butuhkan selama ini.

Sebelumnya:

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

dan:

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

4

R (75 karakter)

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

Apa fungsinya?

  • strsplit membagi string menjadi substring, dalam hal ini karakter individu
  • embed adalah fungsi yang sangat berguna yang mengubah vektor menjadi array elemen yang tumpang tindih
  • Sisanya hanya mengindeks dan menyortir kolom dalam urutan yang benar.

Ini menghasilkan dan mencetak array karakter:

> 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 embedmemang fungsi yang sangat berguna!
Tommy


2

Mathematica, 73

Saya secara mandiri sampai pada metode yang sama dengan orang lain:

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

2

Groovy, 73

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

Semua hal pintar yang saya coba ternyata lebih lama daripada melakukannya dengan cara bodoh.


2

C, 98 104 karakter

Karena belum ada orang lain yang melakukannya, saya pikir saya akan benar-benar mencoba membuat string dengan cepat, menggunakan semacam pengkodean run-length untuk berjalan naik dan turun.

EDIT: Setelah sejumlah iterasi, inilah akhirnya solusi "pintar" yang terkait dengan solusi "bodoh" terpendek di C pada 98 karakter:

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;}

Kode membutuhkan 8-bit Latin-1 encoding (ISO-8859-1 atau Windows-1252), yang seharusnya bekerja dengan baik pada semua platform yang umum digunakan, tetapi menyimpan sumber dengan beberapa halaman kode 8-bit yang kurang populer, atau UTF- 8 tidak akan berfungsi.

String data dibuat oleh potongan emacs lisp berikut:

(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" digunakan untuk menghindari karakter kontrol ASCII yang tidak diinginkan dalam string data yang disandikan, dan untuk memastikan bahwa i==0hanya di akhir output.

C, 98 karakter

Namun, bahkan di C Anda bisa mendapatkan program pendek hanya dengan mencetak triplet berturut-turut dari string asli:

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

2

Ruby 69 65 62

Berdasarkan contoh Groovy

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

Saya pikir konvensi di sini di masa lalu untuk beberapa jawaban dalam berbagai bahasa telah memposting satu jawaban untuk setiap bahasa.
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
Seorang pengguna anonim menyarankan untuk mengurangi ini menjadi 93 karakter sebagaifor(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 karakter:

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

Perl, 66 karakter:

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

saat dipanggil oleh:

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

1

D 124 karakter

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

1

JavaScript, 83 karakter

for(i=0;i<38;)console.log('1234567890JIHGFEDCBAKLMNOPQRST!?,.ZYXWVU'.substr(i++,3))

Memutuskan untuk melihat apakah saya bisa mengalahkan solusi stephencarmody . Inilah yang saya pikirkan.



1

Smalltalk 102 99

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

Saya tidak mengenal Smalltalk dengan baik sehingga agak aneh bagi saya. Itu kompilasi dengan gstorang lain tidak diuji.


1
Trik pertama: hapus spasi antara 38 dan lakukan: -> 98 - trik kedua untuk menghapus spasi lain, loop dari 3to: 40 dan copyFrom: i-2to: i -> 97 - trik ketiga, jangan gunakan variabel x: = ... tunjukkan: x, tunjukkan saja: ('...' copyFrom: i-2to: i) secara langsung, itu -4 karakter + 2 tanda kurung -> 95
aka. bagus

1

Q ( 66 63 karakter)

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

1

Prolog, 131

Ini mungkin mengapa Anda tidak pernah melihat entri Prolog. Baris baru diperlukan (sebenarnya, spasi apa pun akan dilakukan tetapi harus ada spasi putih).

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

Cobalah online!

Tidak bisakah golf lebih banyak? Ini, dalam arti tertentu, <152 byte.


Ini bukan pesaing serius menurut aturan kami . Anda tidak berusaha melakukan lebih baik dari skor minimum.
Mego

Saya tidak bisa, itu sebabnya saya memposting apa adanya. Jika Anda pikir Anda bisa melakukan yang lebih baik, Anda dapat mencoba. Saya tidak tahu solusi yang lebih pendek, dan, pada kenyataannya, saya memang berusaha, tetapi menyadari bahwa ini tidak akan pernah lebih jauh lagi.
Erik the Outgolfer

Saya tidak yakin ini bisa di-golf sama sekali di ///, tetapi speknya mengatakan programnya harus lebih pendek dari [...] string yang dihasilkannya , yang tidak terjadi di sini.
Dennis

@ Dennis Tidak, katanya program harus lebih kecil dari 152 byte (151 <152). Saya pikir ini adalah kesalahan, atau saya membaca posting secara berbeda, tetapi i.e.tidak mengabaikan arti dari sesuatu, itu hanya membantu Anda untuk lebih memahaminya, dalam pengertian saya. Juga, saya tidak memasukkan baris tambahan, mungkin itu sebabnya ini adalah 151 byte. Dan ya, saya membaca bagian itu.
Erik the Outgolfer

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.