Peterのキーボードパターンを表示する


8

次のレイアウトのシンプルなキーボードを想定します。

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

Peterのキーボードパターンは、キーボードの左上から開始して生成でき、最初の3文字と改行を表示します。1文字上にシフトし、2番目、3番目、4番目のキーを表示します。行の終わりに到達すると、次の行の終わりに続き、その行の先頭に到達するまで後退し、次の行に進み、最後の行の先頭に到達するまで続きます。 。

これはピーターのキーボードパターンです。

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

入力を受け入れず、Peterのキーボードパターンを表示するプログラムを記述します。プログラムは152バイト、つまり出力する文字列のサイズよりも小さくなければなりません

これはコードゴルフなので、最短のソリューションが優先されます。


Golfscriptでも、40文字の基本文字列を生成する短い方法を考え出すのに苦労しています。
Peter Taylor

@PeterTaylor私は誰かがのようなリスト内包表記を使うことを期待していました[1..9 0 J..A K..T ! ? , . Z..U]
Peter Olson

echo {1..9} "0" {J..A} {K..T} '!?,.' {Z..U}|sed 's/ //g'bashでも使用できますが、sed-commandを追加して空白を削除するには、すでに13文字必要です。これにより57文字になり、これまでにトリプルは作成されていません。sedのholdコマンドを使用すると、perl-solutionに勝つことは可能ですが、6文字でできますか?
ユーザー不明

152バイトの制限は不要のようです。いずれにしても、圧縮を行わずに出力をハードコーディングすると、ゴルフのパフォーマンスが低下します。また、brainf ** kなどの言語を禁止する可能性もあります。この場合、大規模なプログラムがほとんど常に発生しますが、それでも巧妙なゴルフが行われる可能性があります。
Zwei

回答:


7

Perl、63文字

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

このソリューションはsay関数を使用します(Perl 5.10.0以降、-Eスイッチまたはで使用可能use 5.010)。それがなければ、私ができる最善のことは67文字です(そして出力の最後に余分な改行があります):

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

以前の65文字のソリューション:

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

で置き換えるsay$1print$1.$/、コードが古いperlで実行されますが、5文字余分にかかります。


あなたは私をいくつかのキャラクターで倒した。+1。
Toto

2
63文字のソリューションを直接実行します。メタディスカッション
JB

6

APL、43文字

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

これはDyalog APLで動作します。出力文字列を生成することで、いくつかの文字を保存することができました(すべての後)。時間があれば、説明を書きます!

出力は次のようになります。

      ⍪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

説明、右から左へ:

  • 最初に、他のすべてのエントリに表示される文字列を作成します。
    • 6↑⌽⎕A⎕AAからZまでの大文字のアルファベットの文字列を取得します。次に、それを反転()し、その最初の6文字を取得()して、を取得し'ZYXWVU'ます。(振り返ってみると、このアプローチは文字を保存することにはなりませんが、うまく収まるのでそのままにしておきます。)
    • '!?,.',:前の結果と,文字列を連結()します'!?,.'
    • (10↑10⌽⎕A),:最初に10 10↑回転したアルファベット()の最初の10文字()を取得し、10⌽これを前の結果と連結します。回転の例として、5⌽'abcdef'(文字列が'abcdef'5回回転した)がを与え'cdefab'ます。
    • (⌽10↑⎕A),:アルファベットの最初の10文字を取り、それらを逆にして、これを前の文字列と連結します。
    • (1⌽⎕D),⎕D数字を0から9までの文字列として提供します。次に、この文字列を1だけ回転( '⌽')して、を生成し'1234567890'ます。前と同様に、これを前の結果と連結します。
  • 文字列が作成されたので(引用符で囲まれているため、APL表現から3文字節約されました)、最終的な出力を作成するための魔法をかけます。
    • 3,/:文字列を3文字ずつグループ化して連結します。
    • 最後に、文字列のベクトル(実際には文字ベクトルのベクトル)を最初の次元に沿って解くために使用します。これは、その形状3838 1(38x1マトリックス)からに変更する効果があります。

6

J、66 62 45文字

結局、私は半分ほど利口でした。

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

私がずっと必要だったすべてです

以前は:

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

そして:

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

4

R(75文字)

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

これは何をしますか?

  • strsplit 文字列を部分文字列に分割します。この場合は個別の文字です
  • embed ベクトルを重なり合う要素の配列に変える本当に便利な関数です
  • 残りは、正しい順序で列にインデックスを付けて並べ替えるだけです。

これは、文字の配列を生成して出力します。

> 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 embedは非常に便利な機能です。
Tommy


2

Mathematica、73歳

私は他の皆と同じ方法で独立して到着しました:

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

2

Groovy、73歳

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

私が試したすべての賢いものは、それをばかげたやり方をするよりも長くなることがわかりました。


2

C、98 104文字

まだ誰も行っていないので、昇順と降順の実行になんらかのランレングスエンコーディングを使用して、実際にオンザフライで文字列を生成してみようと思いました。

編集:いくつかの反復の後、最後に、98文字でCの最短の「ダム」ソリューションと結びついた「賢い」ソリューションがあります。

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

コードには、8ビットLatin-1エンコーディング(ISO-8859-1またはWindows-1252)が必要です。これは、一般的に使用されるすべてのプラットフォームで正常に機能しますが、あまり人気のない8ビットコードページまたはUTF- 8は機能しません。

データ文字列は、次のemacs lispによって作成されました。

(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))))))

「twiddle」ビットは、エンコードされたデータ文字列内の印刷不可能なASCII制御文字を回避しi==0、出力の最後でのみ確実にするために使用されます。

C、98文字

ただし、Cの場合でも、元の文字列から連続するトリプレットを出力するだけで、短いプログラムを取得できます。

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

2

ルビー69 65 62

Groovyの例に基づく

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

過去のさまざまな言語での複数の回答に対する慣習は、各言語に対して1つの回答を投稿することでした。
Gareth

2

ハスケル、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
匿名ユーザーは、これを93文字に削減することを提案しました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文字:

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

Perl、66文字:

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

呼び出されたとき:

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




1

Smalltalk 102 99

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

私はSmalltalkをよく知りませんので、少し奇妙です。それはgst他のものでコンパイルされているのでテストされていません。


1
最初のトリック:38とdoの間のスペースを削除:-> 98-別のスペースを削除する2番目のトリック、3to:40からループしてcopyFrom:i-2to:i-> 97-3番目のトリック、変数xを使用しない: = ... show:x、単にshow:( '...' copyFrom:i-2to:i)、つまり-4文字+ 2つの括弧-> 95
aka.nice

1

Q(66 63文字)

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

1

プロローグ、131

これが、Prologエントリが表示されない理由です。改行が必要です(実際には、任意の空白文字で実行できますが、空白文字が必要です)。

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バイト

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

オンラインでお試しください!

もっとゴルフできませんか?これは、ある意味では、<152バイトです。


これは私たちのルールによる深刻な候補ではありません。あなたは最小スコアよりも良いことをする努力をしません。
Mego

できないので、そのまま投稿しました。あなたがもっとうまくできると思うなら、試すことができます。私はもっ​​と短い解決策を知りません、そして実際、私はいくつかの努力をしましたが、これがこれ以上ゴルフにかけられることは決してないことに気づきました。
Erik the Outgolfer 2016年

これが///で完全にゴルフできるとは確信していませんが、仕様では、プログラムは出力する文字列よりも短くする必要があると記載されていますが、ここではそうではありません。
Dennis

@Dennisいいえ、プログラムは152バイトよりも小さくなければならない(151 <152)と述べています。私はそれがエラーだと思います、または私は投稿を別様に読みi.e.ますが、何かの意味を上書きしません、それは私の意味でそれをよりよく理解するのを助けるだけです。また、末尾の改行は含めませんでした。おそらくこれが151バイトです。そして、はい、私はそのセクションを読みました。
Erik the Outgolfer 2016年

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.