プログラマーは怠け者になる傾向があることは誰もが知っています。空き時間を最大化するために、そこに入力されるテキストに対して最小限のキーストロークを出力するプログラムを作成することにします。
入力:キーストロークに変換する必要があるテキスト。テキストの入力方法(STDIN /引数で提供されたファイルからの読み取り)を決定できます。
出力:次の形式の必要なアクション:
- 番号を付ける必要があります
H
it:キーを押してすぐに離すP
ress:キーを押して放さない(これは、キーがR
次のキーストロークとして解除された場合に最適になることはありません)R
elease:再設定されたP
キーのリリース
例:
入力:
Hello!
出力:
素朴な解決策は次のとおりです。
1 P Shift
2 H h
3 R Shift
4 H e
5 H l
6 H l
7 H o
8 P Shift
9 H 1
10 R Shift
これはより効率的です:
1 P Shift
2 H h
3 H 1
4 R Shift
5 H Left
6 H e
7 H l
8 H l
9 H o
環境:
- エディターは等幅フォントを使用します
- テキストは80文字でソフトラップされます
- 上向き矢印と下向き矢印は、間に短い行がある場合でも列を保持します
- クリップボードは空であると想定されます
- Num Lockが有効になっていると想定される
- Caps Lockは無効になっていると想定されます
- Caps Lockは文字に対してのみ機能します(つまり、Shift Lockなし)
ホットキー/ショートカット:
- Home:現在の行の先頭にジャンプします
- End:現在の行の末尾にジャンプします
- Ctrl+ A:すべてをマーク
- Ctrl+ C:コピー
- Ctrl+ X:カット
- Ctrl+ V:貼り付け
- Shift+カーソル移動:マーキング
- Ctrl+ F:検索ダイアログを開きます。
- 愚かなテキストマッチング、正規表現なし
- 大文字と小文字を区別
- 検索はラップアラウンドします
- 検索用の単一行テキスト入力
- 入力には現在の選択が事前に入力されていますが、間に改行がない限り、完全な入力が選択されます
- コピー/貼り付けは通常どおり動作します
- を押すとEnter検索が実行され、現在のカーソル位置の後の最初の一致が選択されます
- F3:最後の検索を繰り返す
- Ctrl+ H:置換ダイアログを開きます
- 愚かなテキストマッチング、正規表現なし
- 大文字と小文字を区別
- すべてを置換、ラップアラウンド
- 単一行のテキスト入力
- 検索入力には現在の選択が事前に入力されますが、間に改行がない限り、完全な入力が選択されます
- 置換入力が空です
- コピー/貼り付けは通常どおり動作します
- Tab 置換入力にジャンプします
- を押すとEnter、すべて置換が実行されます。カーソルは最後の置換の後に置かれます
ルール:
- ソリューションは、追加の変更なしでコンパイル/解析および実行される完全なプログラムである必要があります
- 上に表示されるキーボードは、使用するキーボードです
- 入力できない文字を処理する必要はありません
- すべてのキーは最後にリリースする必要があります
- カーソルは、ファイルの最後にある必要はありません
得点:
スコアは、次のテキストを入力するために必要なアクションの合計です。勝者は最低スコアのソリューションです。私の素朴なソリューションを使用すると、私は得る1371 + 833 + 2006 = 4210
。失せろ!2週間後に勝者を選びます。
1私の素朴な解決策
number = 1
H = (char) -> console.log "#{number++} H #{char}"
P = (char) -> console.log "#{number++} P #{char}"
R = (char) -> console.log "#{number++} R #{char}"
strokes = (text) ->
shiftActive = no
for char in text
if /^[a-z]$/.test char
if shiftActive
R "Shift"
shiftActive = no
H char
else if /^[A-Z]$/.test char
unless shiftActive
P "Shift"
shiftActive = yes
H char.toLowerCase()
else
table =
'~': '`'
'!': 1
'@': 2
'#': 3
'$': 4
'%': 5
'^': 6
'&': 7
'*': 8
'(': 9
')': 0
'_': '-'
'+': '='
'|': '\\'
'<': ','
'>': '.'
'?': '/'
':': ';'
'"': "'"
'{': '['
'}': ']'
if table[char]?
unless shiftActive
P "Shift"
shiftActive = yes
H table[char]
else
H switch char
when " " then "Space"
when "\n" then "Enter"
when "\t" then "Tab"
else
if shiftActive
R "Shift"
shiftActive = no
char
R "Shift" if shiftActive
input = ""
process.stdin.on 'data', (chunk) -> input += chunk
process.stdin.on 'end', -> strokes input
2簡単な繰り返し
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG
HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ
KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK
LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
3より複雑な繰り返し
We're no strangers to love
You know the rules and so do I
A full commitment's what I'm thinking of
You wouldn't get this from any other guy
I just wanna tell you how I'm feeling
Gotta make you understand
Never gonna give you up
Never gonna let you down
Never gonna run around and desert you
Never gonna make you cry
Never gonna say goodbye
Never gonna tell a lie and hurt you
We've known each other for so long
Your heart's been aching but
You're too shy to say it
Inside we both know what's been going on
We know the game and we're gonna play it
And if you ask me how I'm feeling
Don't tell me you're too blind to see
Never gonna give you up
Never gonna let you down
Never gonna run around and desert you
Never gonna make you cry
Never gonna say goodbye
Never gonna tell a lie and hurt you
Never gonna give you up
Never gonna let you down
Never gonna run around and desert you
Never gonna make you cry
Never gonna say goodbye
Never gonna tell a lie and hurt you
(Ooh, give you up)
(Ooh, give you up)
(Ooh)
Never gonna give, never gonna give
(Give you up)
(Ooh)
Never gonna give, never gonna give
(Give you up)
We've know each other for so long
Your heart's been aching but
You're too shy to say it
Inside we both know what's been going on
We know the game and we're gonna play it
I just wanna tell you how I'm feeling
Gotta make you understand
Never gonna give you up
Never gonna let you down
Never gonna run around and desert you
Never gonna make you cry
Never gonna say goodbye
Never gonna tell a lie and hurt you
Never gonna give you up
Never gonna let you down
Never gonna run around and desert you
Never gonna make you cry
Never gonna say goodbye
Never gonna tell a lie and hurt you
Never gonna give you up
Never gonna let you down
Never gonna run around and desert you
Never gonna make you cry
Never gonna say goodbye
Never gonna tell a lie and hurt you
私が作成したリプレイプログラムを使用して、ソリューションをテストできます(注:まだ検索/置換をサポートしていません。他のすべてが機能するはずです)。