円形キーボードスパイラル


24

これはQWERTYキーボードです。

Q W E R T Y U I O P
 A S D F G H J K L
  Z X C V B N M

このキーボードでGから「スパイラルアウト」できます。スパイラルはGから始まり、H、Y、T、F、V、B、N、J、Uの順に進みます。 、その後R、次いでD、C、...などあなたの課題はであり、数1≤所与N ≤26、出力第Nのこのスパイラルの文字を。(混乱している場合は、投稿の最後にある写真を参照してください。)

キャッチ?プログラムのスコアは、スパイラル内にあるキャラクターのインデックスに比例します!

得点

  1. コード内のすべての文字(大文字と小文字を区別しない)について、スパイラル内のその文字のインデックスをスコアに追加します(1から開始)。
  2. スパイラルでないすべてのキャラクターについて、スコアに10を加えます。
  3. 最も低いスコアが勝ちます。

たとえば、プログラムprint("Hello, World!")のスコアは300です。

ご参考までに、自動プログラム採点プログラムを作成しました。

その他の規則

  • 提出物はプログラムまたは機能である場合があります。
  • あなたが取ることができるNをそれぞれ、0または1で開始し、25または26で終了するが、出力は依然として「G」で始まり、「GHYTFVBNJURDCMKIESXLOWAZPQ」で終わるべきです。
  • 順番に文字をスパイラル出力する必要があります。
  • 関数の場合、文字列ではなく文字のリストを返すことがあります。
  • 出力の後に1つの末尾の改行がある場合があります。
  • 大文字の代わりに小文字、または両方の組み合わせを使用できます。

テストケース

number -> output
1 -> G
2 -> GH
5 -> GHYTF
12 -> GHYTFVBNJURD
15 -> GHYTFVBNJURDCMK
24 -> GHYTFVBNJURDCMKIESXLOWAZ
26 -> GHYTFVBNJURDCMKIESXLOWAZPQ

ピクチャー

通常のキーボード

重ねられたスパイラル:

スパイラルキーボード


3
誰かが最近Sphereを見ていた
...-Pureferret

@Pureferret教えてください。あなたが何を参照しているかわかりません。
コナーオブライエン

@ ConorO'Brien In Sphere(小説と映画の両方)では、エイリアンは2桁の数字コードを使用して人間と通信します。各数字は、非常によく似たパターンでキーボードの文字に対応します
エンジニアトースト

回答:


14

JAPT304 264 162点

@ ConorO'Brienのおかげで40ポイント節約

;î"历锋㫿鮹㿬崴ꨜꎋΞ"csG

オンラインでテストしてください!

できるだけ多くのポイントを保存するために、3文字の各ランをbase-36番号として解釈し、コードポイントに変換することにより、文字列全体が9個のUnicode文字に圧縮されます。プログラム自体はこの圧縮された文字列(引用符を含めて110ポイントかかります)をc取得し、各sharcodeをbase-36のtringに変換してマップします(先頭のG後に;)。îこれの最初の{input}文字を受け取ります。これは暗黙的に出力されます。



11

スパイラル、スコア: 61921   5127   4715   4655  4191

4.X~>v+^#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v
   X *   X X X X X X X X X X X X X X X X X X X X X X X X X
   ! >   h y t f V b n j u [ ( 1 3 2 ) ] U J N B F T Y H G
0;vgv*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*vvv****v+^v+^v+^v+^*v++4
    X X X X X X X X X X X X X X X X X X X X X X X X X X
    v v v v v v v v v v v v v v v v v v v v v v v v v v
    Y y J F V u t U [ G H B n 3 N 2 j ) h g f ] ( 1 b T

通訳はこちらにあります

説明:

P.X~ZZ*v+^#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v
   X       X X X X X X X X X X X X X X X X X X X X X X X X X
   !       h y t f V b n j u r d c m k i e s x l o w a z p q
0;vgv*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*****************************************************************vP
    X X X X X X X X X X X X X X X X X X X X X X X X X X
    v v v v v v v v v v v v v v v v v v v v v v v v v v
    z y x w V u t s r q p o n m l k j i h g f e d c b a

プログラムは0、4行目の文字から始まります。実行する最初のコードは0;vgです。;入力として数値を受け取り、スタックに配置します。vレジスターにあるもの(ゼロ)をスタックに入れます。カウンタとして使用されます。gラベルです。到達すると、コントロールgはコード内の他の文字の出現箇所にジャンプします。

これがコントロールの場所です:

X
v
g

他のすべての方向に空白があるため、命令ポインターは上方向に移動し始めます。 vスタックにゼロを置き、Xすぐにスタックからポップします。ポップされた値はゼロであるため、命令ポインタは移動しますX(そうでない場合、空白として処理されます)。

デフォルトでは、制御フローは右折モードになっているため、ジャンクションに到達すると、命令ポインターが右折します。vさらにゼロをスタックにプッシュし*、レジスタを1増やします。

v*v*v
  X
  v
  g

次にv、レジスター(番号1)にあるものをスタックに配置し、命令ポインターが右に曲がって、nextをヒットしようとしますX。スタックに追加されたばかりの値がポップされ、レジスタに配置されます。ゼロ以外であるため、X入力さ*れず、代わりにIP が右側の次の値に進み、再びレジスタの値が増加します。

v*v*v*v*v
X X X X X
v v v v v
i h g f e

これは、この部分の終わりに到達して*s の行が始まるまで何度も起こります。現在、レジスタの値は6で、ASCII文字gからASCII文字を引いたものaです。したがって、97 *秒の行で、レジスタの値を103にインクリメントgします。これは、印刷する文字に一致します。vそれをスタックにプッシュし、Pヒットすると別のラベルにPなり、コードの最初の行で他のラベルにジャンプします。

ここで.は、スタックから値をポップし、文字として出力します。その後X、スタックから余分なゼロをポップ~し、スタック内の残りの2つの値(値はカウンターと入力値)を比較します。値が同じ場合、演算子はスタックにゼロを配置します(それ以外の場合は-1または1)。再び、コントロールは右に曲がろうとします。Xスタックから比較の値をポップします(ゼロの場合)。入力されたX!、プログラムを終了します。

P.X~ZZ*v+^
   X
   !

それ以外の場合、IPはに続きZます。この場合、ラベルは1ステップだけ右にジャンプします。これを行う理由は、ジャンプするとレジスタの値がゼロに戻るからです。*レジスタをインクリメントしv、結果の1をスタックに配置します。+スタックの2つの最上位要素(1とカウンター)をポップし、それらを追加して、結果をスタックに配置します(実際には、カウンターが1ずつ増加します)。^結果をスタックから削除せずに、スタックからレジスタにコピーします。

#レジスタ内の値を1ずつv減分し、減分した値をスタックにプッシュし、IPが右に向きを変えようとXし、スタックから値をポップします。値がゼロ以外の場合、IPは東に移動し続け、ゼロになるまでレジスタの値をデクリメントし、IPがXブランチに入ります。

#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v
 X X X X X X X X X X X X X X X X X X X X X X X X X
 h y t f V b n j u r d c m k i e s x l o w a z p q

ブランチは、カウンターの値に対応するラベルにつながります。ラベルにヒットすると、コントロールは、labelで開始したセクション内のラベルの別のオカレンスにジャンプし、g別の反復を開始します。と同様gに、レジスタ内の値は、印刷する必要がある文字のASCII値まで増分されます。次に、文字が印刷され、カウンターがインクリメントされ、別のラベルが選択されます。これは、最後の反復の後、カウンターが入力と等しくなり、プログラムが終了するまで発生します。

編集:

P.X~Zv+^
   X *
   ! Z

と同じことを達成します

P.X~ZZ*v+^
   X
   !

ただし、空白は少なくなります。

編集2:

vv****v+^v+^v+^v+^*v++P

次の代わりに使用できます。

*****************************************************************vP

2
皮肉なことに、「スパイラル」と呼ばれる言語がスパイラル出力の問題で非常に高いスコアを持っています。
シルカム

6

ハスケル、471

(`take`"GHYTFVBNJURDCMKIESXLOWAZPQ")

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

これはちょっとしたベンチマークであり、より良い方法が必要だと感じていますが、これまで見つけた中で最高です。

説明

Haskellにあまり詳しくない人のためにこれを説明すべきだと思います。この関数takeは、リストの最初のn個の要素を取ります。次のように呼び出されます。

take n list

スティングの最初のn個の要素を取得するため、次の"GHYTFVBNJURDCMKIESXLOWAZPQ"ようなものが必要です。

f n=take n"GHYTFVBNJURDCMKIESXLOWAZPQ"

しかし、takeバックティックを使用して修正することもできます。

f n=n`take`"GHYTFVBNJURDCMKIESXLOWAZPQ"

そして今、これはポイントフリーにすることができます

(`take`"GHYTFVBNJURDCMKIESXLOWAZPQ")

partialClojureで使用する必要がある部分的なアプリケーションは残念です。これは私が目指していたものですが、partial高すぎました。
発癌性

3
あなたのスコアは470ではありませんか?とにかくそれは質問のスニペットが私に与えているものです...
ちょうど学生



4

Befunge、スコア:531

QPZAWOLXSEIKMCDRUJNBVFTYHG"&\>,# 1#\-# :# _@

出力もスパイラルでなければならないとしたら、この挑戦​​はもっと面白かったと思う。


4

TI-Basic(TI-84 Plus CE)、454 432ポイント

sub("GHYTFVBNJURDCMKIESXLOWAZPQ",1,Ans

コナー・オブライエンから-22ポイント

で実行し5:prgmNAMEます。

to subから文字列(数値入力)を返す/印刷します。1Ans

TI-Basicはトークン化された言語であるため、トークンのバイト値でスコアを付けています。

sub( 0xbb 0x0cなので、20

"0x2aなので、*10 * 2 = 20

大文字は変更されないため、文字列は351です

,は0x2bなので、+10 * 2 = 20

10x31ですので1、だから10

Ans0x72、つまりr11

20 + 20 + 351 + 20 + 10 + 11 = 432


スコアリングルールのこの解釈により、創造的な場所で文字を探すことで、さらに31バイトを節約できます。S、A、Z、PをSTAT変数s、a、z、p(STAT + 5メニュー内)に置き換えます。これらはそれぞれ17ポイントを獲得します。これらは最初のバイトがbに対応する2バイトのトークンです。O、W、Qをそれぞれ20ポイントの通常の小文字に置き換えます。これらは2バイトのトークン0xBBBF、0xBBC7、0xBBC1です。
ミシャラヴロフ

3

Python 3、スコア= 762 753

1ベースの入力。これは、37個の非文字を使用するため、単純なアプローチよりも悪いです。しかし、それはやや興味深いです。

-9 レオに感謝します。

h=lambda g:g and h(g-1)+chr(65+int('GYGGYHGYYGYTGTYHGYGGHGGTGHGYGYGFGHGGYGGHHGGHHYYGHGHGGYFGGYHGGTHGHTGGGGGFGGVHGT'[g*3-3:g*3],35)%26)or''

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


1
私はこのアプローチが好きです:)ちなみに、合計スコアを9ポイント下げる[:g*3][-3:]ことができます[g*3-3:g*3]
レオ


2

Brainf ** k、スコア= 2690

0x1〜の範囲の1バイトを入力し0x1aます。

>>++++>+++>>>>++++++++++[<+<-<+>>>-]<<--<+++>>>++>->+++++++++++>++++++>-------->---->-->>---------->--------->+++++>++++++++>--->+>----------->+++++++++>------->+++++++>++++++++++++>----->------>+>>+++++++[<+++++++++++[<[[+<]+<]>->[[>]>]<<<-]>-]<<[-]>,[[<]<.[-]>+[>]<-]

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




1

Clojure、484 474ポイント

-10ポイントは、明らかに%スペースのない数字の後に存在する可能性があるためです!?私は戻っていくつかの提出物を改善する必要があるかもしれません。

#(subs"ghytfvbnjurdcmkiesxlowazpq"0%)

無名関数。基本的に、すでに投稿されているもののClojureポートです。うまくスコア!これは、私が書いた最初のClojureプログラムで、単一のスペースが含まれていないプログラムだと思います。

(defn spiral [n]
  ; Substring the hardcoded list, going from index 0 to n
  (subs "ghytfvbnjurdcmkiesxlowazpq" 0 n))



1

、293バイト

↑¨ghytfvb⌋ȷÜdcmkÏexl⁰Λzpq

これは私が見つけることができる最も短いもので、次に近い ¨gHYtfvB⌋ȷÜdCmkÏex←ẆAzpq¨スコア293.にます。

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

説明

ブルートフォース検索では、すべて小文字で最高のスコアが得られました。それは基本的に、@Wheatウィザードの溶液と同じだtake圧縮された文字列上)( ¨)。



1

Excel、490ポイント

=LEFT("GHYTFVBNJURDCMKIESXLOWAZPQ",A1)

Excelアンサーの規則は、から入力を取得することA1です。これを変更してG122ポイントを削減します(468)。

=LEFT("GHYTFVBNJURDCMKIESXLOWAZPQ",G1)


1

さび、スコア443

Rustはコードゴルフが得意なことはあまりありませんが、ここでは多くの言語に勝っています

|g|&"GHYTFVBNJURDCMKIESXLOWAZPQ"[..g]


1

Javascript ES6、527ポイント

g=>`GHYTFVBNJURDCMKIESXLOWAZPQ`.slice(0,g)

それを試してみてください !

f=g=>`GHYTFVBNJURDCMKIESXLOWAZPQ`.slice(0,g)

input.oninput = function() {
    output.value = f(input.value);
}
textarea { width: 500px; height: 6em; font-style: monospace; }
<textarea id="input"></textarea>
<textarea disabled id="output"></textarea>







0

> <>、558 + 16 = 574ポイント

<;v? : <{"GHYTFVBNJURDCMKIESXLOWAZPQ"
  >$o1-^

を使用します -vフラグを入力をスタックにプッシュします。

スパイラルを逆の順序でスタックにプッシュし、入力を最上部に回転します。次に、スタックの最上部がゼロ以外のときに、次の文字を出力し、スタックの最上部をデクリメントします。

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


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