圆形键盘螺旋


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≤ ñ ≤26,输出第一ñ在此螺旋字符。(如果您感到困惑,请参阅文章末尾的图片。)

抓住?您的程序的分数与螺旋内发现的字符的索引成正比!

计分

  1. 对于代码中的每个字母(不区分大小写),将螺旋中该字符的索引添加到分数中(从1开始)。
  2. 对于不在螺旋中的每个字符,将其分数加10。
  3. 最低分获胜。

例如,该程序print("Hello, World!")的分数为300。

为了您的方便,我写了一个自动程序分级器。

其他规定

  • 您提交的内容可能是程序或功能。
  • 您可以将N分别从0或1开始,以25或26结束,但输出仍应以“ G”开头,以“ GHYTFVBNJURDCMKIESXLOWAZPQ”结尾。
  • 您必须按顺序输出字符。
  • 如果是函数,则可以返回字符列表而不是字符串。
  • 您可能在输出之后有一个尾随换行符。
  • 您可以使用小写字母代替大写字母,或同时使用两者的组合。

测试用例

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

图片

普通键盘

螺旋叠加:

螺旋键盘


3
最近有人看过Sphere ...
Pureferret

@Pureferret你能启发我吗?我不确定您指的是什么。
科纳·奥布莱恩

@ ConorO'Brien在Sphere(小说和电影)中,外星人使用两位数字代码与人类进行交流,其中每个数字都以非常相似的方式对应于键盘上的一个字母。
Engineer Toast

Answers:


14

Japt304个 264 162点

@ ConorO'Brien节省了40点

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

在线测试!

为了节省尽可能多的点,通过将每3个字母的运行解释为以36为底的数字,然后将其转换为代码点,将整个字符串压缩为9个Unicode字符。程序本身会使用这个压缩的字符串(包括引号在内,它的价格为110点),并c通过将每个harcode转换为sbase-36中的tring 来映射每个harcode (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第四行的字符开始。运行的第一段代码是0;vg;将数字作为输入并将其放置在堆栈中。v将寄存器中的内容(零)放入堆栈。它将用作计数器。g是一个标签,到达该标签时,控件跳至g代码中字母的另一处。

所以这是控件现在所在的位置:

X
v
g

由于在所有其他方向上都有空格,因此指令指针开始向上移动。 v将零放入堆栈,然后X立即将其从堆栈中弹出。因为弹出的值为零,所以指令指针移至X(否则它将视为空白)。

默认情况下,控制流处于向右转模式,因此现在到达控制点时,指令指针将向右转。v再次将0压入堆栈,*将寄存器加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 *s 为一行,我们将寄存器中的值增加到103,这与g我们要打印的字母匹配。v将其压入堆栈,P是命中时的另一个标签,我们P在代码的第一行跳至另一个标签。

在这里.从堆栈中弹出值并将其打印为字符。之后,X从堆栈中弹出无关的零,然后~比较堆栈中的两个剩余值(这些值是计数器和输入值)。如果值相同,则运算符将零放在堆栈中(否则为-1或1)。再次,控件尝试向右转。X如果比较的值为零,则从堆栈中弹出比较的值X,然后在!输入之后,终止程序。

P.X~ZZ*v+^
   X
   !

否则,IP继续到Z,这是一个标签,在这种情况下,该标签仅向右跳一步。这样做的原因是,跳转会将寄存器中的值设置回零。*递增寄存器并将v结果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

分支指向对应于计数器值的标签。击中标签后,控件将跳转到我们从标签开始的部分中标签的g另一次出现,开始另一个迭代。与一样g,寄存器中的值递增到我们需要打印的字母的ASCII值。然后打印字符,计数器增加,选择另一个标签。直到最后一次迭代后计数器等于输入,程序终止。

编辑:

P.X~Zv+^
   X *
   ! Z

实现与

P.X~ZZ*v+^
   X
   !

但空白较少。

编辑2:

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

可以代替:

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

2
具有讽刺意味的是,一个名为“ Spiral”的语言在螺旋输出问题中得分如此之高。
Shirkam '17

6

哈斯克尔(471)

(`take`"GHYTFVBNJURDCMKIESXLOWAZPQ")

在线尝试!

这是一个基准,我觉得必须有一个更好的方法,但这是迄今为止找到的最好的方法。

说明

我想我应该为那些不太熟悉Haskell的人解释这一点。该函数take采用列表的前n个元素。它的名称如下:

take n list

我们想要获取sting的前n个元素"GHYTFVBNJURDCMKIESXLOWAZPQ",所以我们想要类似

f n=take n"GHYTFVBNJURDCMKIESXLOWAZPQ"

我们可以做得更好,但可以take使用反引号

f n=n`take`"GHYTFVBNJURDCMKIESXLOWAZPQ"

现在,这可以变得毫无意义

(`take`"GHYTFVBNJURDCMKIESXLOWAZPQ")

partial在Clojure中使用部分应用程序是一种遗憾。这就是我想要的,但是partial太贵了。
Carcigenicate's

3
你的分数不是470吗?这就是问题中的片段正反正给我的东西
只是一名学生,



4

Befunge,得分:531

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

我认为,如果输出也必须呈螺旋形,那么这个挑战本来会更有趣。


4

TI基础(TI-84 Plus CE),454432

sub("GHYTFVBNJURDCMKIESXLOWAZPQ",1,Ans

来自Conor O'Brien的 -22点

用运行5:prgmNAME

返回/打印sub1到的字符串Ans(数字输入)。

TI-Basic是标记化的语言,因此我通过标记的字节值对其进行评分。

sub( 是0xbb 0x0c,所以20

"是0x2a,所以*,所以10 * 2 = 20

大写字母不变,因此字符串为351

,是0x2b,所以+,所以10 * 2 = 20

1是0x31,所以1,所以10

Ans是0x72,即r,所以11

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


通过这种对评分规则的解释,您可以通过在创意位置查找字母来节省31个字节。用STAT变量s,a,z,p(在STAT + 5菜单中)替换S,A,Z,P,该变量分别获得17分:它们是2字节令牌,其第一个字节对应于b。将O,W,Q替换为普通的小写字母,每个字母得分20分:它们是2字节令牌0xBBBF,0xBBC7、0xBBC1。
Misha Lavrov

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
我喜欢这种方法:)顺便说一句,[:g*3][-3:]可以[g*3-3:g*3]将总得分降低9分
Leo


2

Brainf ** k,得分= 2690

输入一个字节,范围从0x10x1a

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

在线尝试!



1

Python 3、522

lambda g:"GHYTFVBNJURDCMKIESXLOWAZPQ"[:g]

在线尝试!

利用Python的字符串切片的匿名lambda("asdf"[:i]获取的第一个i字符"asdf"


1

Clojure,484 474点

-10点,因为显然a %可以存在于数字后,而没有空格将它们隔开!我可能必须回过头来改进一些提交的内容。

#(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。将其更改为可G1减少22点(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>



1

PHP,得分584

把字典弄乱了;对该字符串进行异或运算会使其substr过时的事实变得过时了。

<?=">1 -?/;73,+=:420<*!56.8#)("^str_repeat(y,$argv[1]);

在线尝试



0

Pyth,得分:371

<"GHYTFVBNJURDCMKIESXLOWAZPQ

在这里尝试。

怎么样?

<"GHYTFVBNJURDCMKIESXLOWAZPQ"Q   implicit string end, implicit input
<                            Q   first Q(=input) elements ...
 "GHYTFVBNJURDCMKIESXLOWAZPQ"    ... of this string


0

> <>,558 + 16 = 574点

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

使用该-v标志将输入推入堆栈。

以相反的顺序将螺旋推入堆栈,然后将输入旋转到顶部。然后,当堆栈的顶部不为零时,打印下一个字母并递减堆栈的顶部。

在线尝试!


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.