打印字母四次


37

程序必须打印四次字母:第一次按正常字母顺序,第二次按qwerty键盘顺序,第三次按dvorak键盘顺序,最后按相反的字母顺序打印。输出应类似于以下内容:

abcdefghijklmnopqrstuvwxyz
qwertyuiopasdfghjklzxcvbnm
pyfgcrlaoeuidhtnsqjkxbmwvz
zyxwvutsrqponmlkjihgfedcba

输出不区分大小写,您可以在任意位置添加或省略换行符或空格。

要点:程序必须少于104个字符,换句话说,必须小于字母的长度乘以四。

我将用最短的代码接受答案,除非我看到一些令我印象深刻的真正聪明或有趣的东西。

编辑:我将在2011年4月27日星期三接受最短答案。

EDIT2:赢家是(照常)以64个字符组成的Golfscript第二名,仅落后3个字符,在Golfscript中也有67个字符,其次是Bash,排名第 32

但我想提及其他一些内容,例如这个,根据您的定义,仅使用了52个“字符”,而这个字符是他用自己创建的语言编写的。

当时有几个 打破了一条不成文的规定,并没有出线,但我会提到他们只是为自己没有盒子的思维方式。


11
考虑使用赏金给您留下深刻印象的答案。我认为在代码高尔夫球中接受答案应该总是自然的标准(即长度)。
Joey

我输掉了Tcl:tio.run/…–
sergiol

Answers:


16

Python 2,97个字符

q="qwertyuiopasdfghjklzxcvbnm"
a="".join(sorted(q))
print a,q,"pyfgcrlaoeuidhtnsqjkxbmwvz",a[::-1]

将QWERTY排序并从列表转换回字符串比字母本身短!*

与字母本身相比,用更少的字符生成字母的另一种选择:

print map(chr,range(65,91))

尽管这会打印一个Python字符列表。

在数据压缩方面,这里没有太多要做。将字母卡成5位只能节省39个字符,如果您随后必须将它们取消卡塞(这仍然需要从字面上表示字节),那么这并不是很多。看起来zlib(仅作为示例)节省了不到20个字节;将序列编码为delta列表到下一个字母,每个delta仍然需要5位,因为此序列中最大的是-22:

[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
 1, 1, 1, 1, 1, 1, 1, -9, 6, -18, 13, 2, 5, -4, -12, 6, 
 1, -15, 18, -15, 2, 1, 2, 1, 14, -2, -21, 19, -20, 12, 
 -1, 3, 9, -19, 1, -4, 15, -6, -11, 14, -10, 16, -12, -5, 
 4, 12, -6, 5, -2, -7, 1, 13, -22, 11, 10, -1, 4, 0, -1, 
 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1]

*虽然只有一点点。


1
Python 3.5:q="qwertyuiopasdfghjklzxcvbnm";a=sorted(q);print(*a,q,"pyfgcrlaoeuidhtnsqjkxbmwvz",*a[::-1])
Veedrac '16

15

PHP,100字节

根据ISO 8859-1:

<?=base64_encode("i·yø!9%z)ª»-ºü1Ë:°z»rº*)jÇ_ä<\½¹æ§'àr¹Z¡ë¢vg²¨äŹ°¿<òÇî¶Êê¦æHâÞuÆÚ");

为了可靠地复制,

printf '<?=base64_encode("' > 4times.php
printf abcdefghijklmnopqrstuvwxyzqwertyuiopasdfghjklzxcvbnmpyfgcrlaoeuidhtnsqjkxbmwvzzyxwvutsrqponmlkjihgfedcba | base64 -d >> 4times.php
printf '");' > 4times.php

5
这是一种有趣的方式。其他所有都是相同想法的变体,但是这个有点不同。
彼得·奥尔森

我认为这不应该算;该问题被标记为“ Kolmogorov复杂性”,并指定为“ 104个字符”,这意味着我们应区别对待我们认为的字符。否则,我将使用一个单独的字符定义自己的字符编码,该字符映射到解决问题的整个程序的ASCII,然后对其进行解码。
Adrian Petrescu

2
@Adrian Petrescu:可以通过在提出挑战时要求已经存在编码来轻松解决。
Lowjacker 2011年

@Lowjacker当然,但这似乎是解决此问题的一种任意方法。
Adrian Petrescu

5
@Adrian,使用字符vs字节时使用unicode的优势已为人所知。在我看来,在询问字符时将问题标记为Kolmogorov是没有意义的。它应该计数字节。请问问问题的人要谨慎对待这些术语。
gnibbler 2011年

10

红宝石1.9,88 87 84 80

puts b=[*?a..?z],:qwertyuiopasdfghjklzxcvbnmpyfgcrlaoeuidhtnsqjkxbmwvz,b.reverse


9

Python,97 96个“字符”

广泛使用“字符”一词,这是一些使用16位unicode字符对3个正常字符进行编码的python。该程序共有96个字符,其中35个是我见过的最奇怪的unicode字符。

for i in range(104):print chr((ord(u'ࠠᒃ⃦ⵉ��割廕��匓�เ᳅ⵉૹ�懬ࣅű傎ᱨ�⤰〷�弙劶��ⶍKᓇࡤ^A'[i/3])>>i%3*5&31)+97),

我不确定unicode垃圾是否会正确发送,所以这是一个生成上述python程序的python程序:

#!/usr/bin/python                                                                                                                                                                 
import codecs
f=codecs.open('alpha.py','w','utf-8')
f.write('#!/usr/bin/python\n')
f.write('# coding=utf-8\n')
f.write('for i in range(104):print chr((ord(u\"')
S='''abcdefghijklmnopqrstuvwxyzqwertyuiopasdfghjklzxcvbnmpyfgcrlaoeuidhtnsqjkxbmwvzzyxwvutsrqponmlkjihgfedcbaa'''
for i in xrange(0,104,3):
 n=32*32*(ord(S[i+2])-97)+32*(ord(S[i+1])-97)+ord(S[i+0])-97
 f.write(u'%c'%n)
f.write('"[i/3])>>i%3*5&31)+97),\n')

9

巴什72

echo {a..z} qwertyuiopasdfghjklzxcvbnmpyfgcrlaoeuidhtnsqjkxbmwvz {z..a}

编辑:删除了tr -d

鸣谢:亚历山大,罗杰。


2
规则允许您省略|tr -d ' ',保存10个字符并使该版本在撰写本文时成为领导者:-)
Alexander Gladysh 2011年

@亚历山大,酷;-)不知道这一点。不过感谢@Roger为我指出了正确的方向。
asoundmove 2011年

我试图用带质数和模的幂的多项式找到一个更优雅的解决方案(或者换句话说,找到一个可以在该序列中工作的足够简单的置换函数)...但是无法花费所需的时间对于这样的解决方案,所以我将其保留。再加上简明扼要的表达很难。
asoundmove 2011年

9

Golfscript,64个字符

"qwertyuiopasdfghjklzxcvbnmpyfgcrlaoeuidhtnsqjkxbmwvz".$2%\1$-1%

注意:也是64个字节。实际上,使用Unicode和基本更改似乎会适得其反,因为base关键字太长了。


6

Windows PowerShell,89

不是特别好,但至少比输出字符串短:

[char[]](65..90)
'qwertyuiopasdfghjklzxcvbnmpyfgcrlaoeuidhtnsqjkxbmwvz'
[char[]](90..65))

现在,我看到空白空间有所放宽,现在变得更短了。再短一点,如果我忽略了允许的情况。


2
您在那里有额外的)东西。应该是88
Iszi

5

Golfscript,76,67个字符

123,97>+."qwertyuiopasdfghjklzxcvbnmpyfgcrlaoeuidhtnsqjkxbmwvz"\-1%

使用123,97>+生成初始字母。
Ventero 2011年

感谢Ventero,我确实在前几天的其他帖子中看到了这一点。

4

CI -92个字符

'a(1p'z((,0(4d)(.$)<)$)(0c0c.1+2p$.)>)$)qwertyuiopasdfghjklzxcvbnmpyfgcrlaoeuidhtnsqjkxbmwvz

CI(“编译器/解释器”)是我为“自解释器”挑战创建的一种基于堆栈的简单语言(答案链接)。我在发布此挑战前两个小时发布了该答案。这不是GolfScript(我仍然没有去学习),因为我的目标是使解释器更简短。

该程序必须ci通过标准输入传递给解释器。解释器将终止后的字符)视为程序的输入。我的语言不支持字符串文字,因此stdin取代了它。


3

Python 2.7.X-具有讽刺意味的是103个字符...

a='abcdefghijklmnopqrstuvwxyz'
print a,'qwertyuiopasdfghjklzxcvbnm pyfgcrlaoeuidhtnsqjkxbmwvz',a[::-1]

事实证明,在Python中生成字母比对它进行硬编码需要更多的字符。导入字母也一样。有时会喜欢以可读性为中心的语言。


1
您不需要QWERTY和DVORAK字符串之间的空格,它将少1个字符。
Lowjacker 2011年

是的,但是python会自动在逗号分隔的打印列表中的每个项目之间添加一个空格,因此该空格是我个人对更改可读输出的牺牲。
arrdem 2011年

您可以使用+代替,,并节省空间。
马丁·乌丁2011年

3

C — 133个字符

凯西的简化版本:

main(i){char a[105];strcpy(a+26,"qwertyuiopasdfghjklzxcvbnmpyfgcrlaoeuidhtnsqjkxbmwvz");for(i=0;i<26;)a[i]=a[103-i]=i+++65;puts(a);}

空格:

main(i) {
    char a[105];
    strcpy(a+26, "qwertyuiopasdfghjklzxcvbnmpyfgcrlaoeuidhtnsqjkxbmwvz");
    for(i=0;i<26;)
        a[i]=a[103-i]=i+++65;
    puts(a);
}

转置输出

这是一个进行转置输出的版本,很有趣。134个字符。

main(i){char*a="qwertyuiopasdfghjklzxcvbnmpyfgcrlaoeuidhtnsqjkxbmwvz";for(i=0;i<26;i++,a++)printf("%c%c%c%c\n",i+65,*a,*(a+25),90-i);}

空格:

main(i){
  char*a="qwertyuiopasdfghjklzxcvbnmpyfgcrlaoeuidhtnsqjkxbmwvz";
  for(i=0;i<26;i++,a++)
    printf("%c%c%c%c\n",i+65,*a,*(a+25),90-i);
}

印刷品:

AqmZ
体重
塞克斯
博士
病毒
FycU
古尔特
希尔斯
内部审计
日本邮政
凯普
su
多媒体
国防部
gh
PhtK
j
ks
q
z
UxkF
VcxE
播放器
XbmC
n
ZmvA

当然还是不合适。
亚历山大·格拉迪什

1
通过声明i为global并将其放入strcpy(...)for循环的第一块,您会得到129。
贝贝2014年

3

Ĵ

x=:(97+/i.26){a.
x
261329910883437428257896643x A.x
247073478763191548160234722x A.x
(_1+/-i.26){x

我对J的初次体验。这个想法只是使用所需排列的规范(词典编目)数。不幸的是,这比硬编码需要更多的字符。但是,如果可以找到一些算术表达式(使用幂和其他运算法则)来产生幻数,则可以将其缩短。


261329910883437437457896643具有质数分解7 * 601 * 991 * 213987797 * 292923318887,因此这没有幂。
杰里·耶利米


3

JavaScript的139 121

新:

q='qwertyuiopasdfghjklzxcvbnm'
a=q.split('').sort()
alert(a.join('')+q+'pyfgcrlaoeuidhtnsqjkxbmwvz'+a.reverse().join(''))

旧:

a=[]
a[26]='qwertyuiopasdfghjklzxcvbnmpyfgcrlaoeuidhtnsqjkxbmwvz'
for(i=0;i<26;i++)a[i]=a[52-i]=String.fromCharCode(i+65)
alert(a.join(''))

您可能还会有121位用户,其中包括:alert((a=(q='qwertyuiopasdfghjklzxcvbnm').split('').sort()).join('')+q+'pyfgcrlaoeuidhtnsqjkxbmwvz'+a.reverse().join(''))
WallyWest

2

Lua-111个字符

击败C和C ++!:-)

print'abcdefghijklmnopqrstuvwxyzqwertyuiopasdfghjklzxcvbnmpyfgcrlaoeuidhtnsqjkxbmwvzzyxwvutsrqponmlkjihgfedcba'

Lua中的“聪明”版本

129个字符

q='qwertyuiopasdfghjklzxcvbnm'a={q:byte(1,-1)}table.sort(a)a=q.char(unpack(a))print(a,q,'pyfgcrlaoeuidhtnsqjkxbmwvz',a:reverse())

空格:

q='qwertyuiopasdfghjklzxcvbnm'
a={q:byte(1,-1)}
table.sort(a)
a=q.char(unpack(a))
print(a,q,'pyfgcrlaoeuidhtnsqjkxbmwvz',a:reverse())

2

C- 163135个字符

这不能满足要求,因为它的时钟输入超过104个字符,但是制作起来很有趣。也许有人会提出一些建议。

main(i){char a[105];strcpy(&a[26],"qwertyuiopasdfghjklzxcvbnmpyfgcrlaoeuidhtnsqjkxbmwvz");for(i=0;i<26;)a[i]=a[103-i]=i+++65;puts(a);}

这是在GCC 4.5.1上编译的(其他未经测试)。是的,省略了#include,返回类型和变量声明!硬编码会导致程序更短,但这没什么好玩的。

空白版本:

main(i) {                                                                                   
    char a[105];                                                                        
    strcpy(&a[26], "qwertyuiopasdfghjklzxcvbnmpyfgcrlaoeuidhtnsqjkxbmwvz");                 
    for(i=0;i<26;)                                                                          
        a[i]=a[103-i]=i+++65;                                                               
    puts(a);                                                                                
}

C- 124122 me子

这是the脚的硬编码版本,仍然没有成功。

main(){puts("abcdefghijklmnopqrstuvwxyzqwertyuiopasdfghjklzxcvbnmpyfgcrlaoeuidhtnsqjkxbmwvzzyxwvutsrqponmlkjihgfedcba");}

使用puts()代替了printf在第二种情况下- 2个字符以下。
亚历山大·格拉迪什

并在第一种情况下替换whileputs(a);掉线*p=a;- 138个字符,而不是163
亚历山大Gladysh

很棒的建议!我完全忘记了puts。变了
Casey

2

PHP 88字节

<?=$a=join(range(a,z)),~Žˆš‹†Š–žŒ›™˜—•”“…‡œ‰‘’†™˜œ“žšŠ–›—‹‘ŒŽ•”‡’ˆ‰…,strrev($a);

2

J-69个字符

'pyfgcrlaoeuidhtnsqjkxbmwvz'(,~|.)&(,\:~)'mnbvcxzlkjhgfdsapoiuytrewq'

说明:

  • (,\:~) y-按y降序(\:~)排序,然后将(,)附加到y

  • x (,~|.) y-反转(|.y,并将其附加到的前面x

  • x F&G y-Execute (G y) F (G y),即执行F应用于G参数的结果。

因此,总的来说,我们将字母向后附加到Dvorak和反向QWERTY字符串上,然后反向QWERTY / alphabet并将其放在Dvorak / alphabet的前面。


2

Bash,64岁

我参加聚会很晚,但是我有64个字符的解决方案。程序需要保存到磁盘才能工作

echo {a..z} $(sed 1d $0|base64) {z..a};exit
««·+¢¢–¬uø!ŽIsÅËÛžjr~+•ªº'a¶{*ŽL[›ó

怎么运行的:

{a..z}并且{z..a}很容易说明,但基本上只是打印出相应范围内的每个字符。

$(sed 1d $0|base64) 输出程序,忽略第一行,然后将其通过base64编码器传递(如其他示例所示)。

比其他类似示例短的原因...

...是因为{a..z}范围比base64编码短,所以我只需要对base64编码一半的字符串。而且因为我是从文件中读取二进制数据,而不是将其存储在字符串中,所以不需要在代码中转义任何字符。

如何重新创建此脚本:

如果代码无法正确地从Stack Exchange复制/粘贴到您的文本编辑器,请在命令行中运行以下命令(与Shell无关):

echo 'echo {a..z} $(sed 1d $0|base64) {z..a};exit' > alphabetgolf
echo 'qwertyuiopasdfghjklzxcvbnmpyfgcrlaoeuidhtnsqjkxbmwvz' | base64 -d >> alphabetgolf

然后运行:

bash alphabetgolf

2

05AB1E,25个字节

AžW.•8t”a$äJÚ₁вƒüu¯Cê•AR»

在线尝试!

说明

A                          # Push alphabet                    
 žW                        # Push qwerty string
   .•8t”a$äJÚ₁вƒüu¯Cê•     # Push compressed dvorak string
                      AR   # Push reversed alphabet
                         » # Join entire stack with newlines

1

C ++

当用某种语言完成某件事的最短方法是对它进行硬编码时,这会让人感到悲伤。

#include <iostream>

int main()
{
 std::cout<<"abcdefghijklmnopqrstuvwxyzqwertyuiopasdfghjklzxcvbnmpyfgcrlaoeuidhtnsqjkxbmwvzzyxwvutsrqponmlkjihgfedcba";
}

您不需要输出换行符。
Lowjacker

@低:Do!我在取出换行符时忘了删除那些,我意识到自己不需要。感谢您指出了这一点。
约翰

这是一个非常明显的解决方案,它超过了最大长度要求。
彼得·奥尔森

std::cout短一点using namespace std,你可以跳过void
Alexander Gladysh 2011年

@Alex:感谢您指出这一点。
约翰

1

J(77)

(,|.@(26&{.))(,~/:~@(26&{.))'qwertyuiopasdfghjklzxcvbnmpyfgcrlaoeuidhtnsqjkxbmwvz'

通过使用变量将3个字符删减:

(,|.@a)(,~/:~@(a=.26&{.))'qwertyuiopasdfghjklzxcvbnmpyfgcrlaoeuidhtnsqjkxbmwvz'

通过使用值级方法减少了2个字符:

(|.a),~t,~a=./:~26{.t=.'qwertyuiopasdfghjklzxcvbnmpyfgcrlaoeuidhtnsqjkxbmwvz'

1

哈斯克尔(95)

main=putStr$['a'..'z']++"qwertyuiopasdfghjklzxcvbnmpyfgcrlaoeuidhtnsqjkxbmwvz"++['z','y'..'a']

佩尔(51)

没有规则说我不能。

use LWP::Simple;print get("http://bit.ly/fGkflf");

1
请参阅标准漏洞列表。
boboquack

1

问(68)

.Q.a,"qwertyuiopasdfghjklzxcvbnmpyfgcrlaoeuidhtnsqjkxbmwvz",(|:).Q.a

输出:

"abcdefghijklmnopqrstuvwxyzqwertyuiopasdfghjklzxcvbnmpyfg     
crlaoeuidhtnsqjkxbmwvzzyxwvutsrqponmlkjihgfedcba"

试图找到一种对中间两个进行硬编码的改进,但是没有提出。


1

K-69个字符

b,a,|b:a@<26#a:"qwertyuiopasdfghjklzxcvbnmpyfgcrlaeouidhtnsqjkxbmwvz"

说明:

  • 26#a:-将两个键盘布局分配给a,然后采用前26个字符。

  • b:a@<-排序a并将其分配给b<为升序排序提供排列,并@让我们进行索引a以对其进行排序。

  • b,a,|-附加在一排b,然后a,再反向(|)的b


1

佩思,57

G"qwertyuiopasdfghjklzxcvbnmpyfgcrlaoeuidhtnsqjkxbmwvz"VG

字母,字符串,反向字母。G是字母。打印是隐式的。


1

Dyalog APL,60 字节

⎕A'QWERTYUIOPASDFGHJKLZXCVBNMPYFGCRLAOEUIDHTNSQJKXBMWVZ',⌽⎕A

印刷品:

  ABCDEFGHIJKLMNOPQRSTUVWXYZ  QWERTYUIOPASDFGHJKLZXCVBNMPYFGCRLAOEUIDHTNSQJKXBMWVZ ZYXWVUTSRQPONMLKJIHGFEDCBA

根据OP允许:

输出不区分大小写,您可以在任意位置添加或省略换行符或空格。


1

果冻,36个字节(无竞争)

Øa;Øq;“pyfgcrlaoeuidhtnsqjkxbmwvz”;U

在线尝试!

说明:

Øa;Øq;“pyfgcrlaoeuidhtnsqjkxbmwvz”;U    |
Øa;                                     | alphabet
   Øq;                                  | list with all rows of the qwerty keyboard
      “pyfgcrlaoeuidhtnsqjkxbmwvz”;     | string
                                   U    | reverse

1

05AB1E60 59字节

AÂ"qwertyuiopasdfghjklzxcvbnm""pyfgcrlaoeuidhtnsqjkxbmwvz"»

在线尝试!

-推动分叉的字母。

"qwertyuiopasdfghjklzxcvbnm""pyfgcrlaoeuidhtnsqjkxbmwvz" -推动qwerty和drovak。

» -打印堆栈。

05AB1E,57个字节(如果您不关心随机\ n)

AÂ"qwertyuiopasdfghjklzxcvbnmpyfgcrlaoeuidhtnsqjkxbmwvz"»

在线尝试!


在第一个示例中,可以通过用""换行符替换来保存字节。
尼尔·
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.