在不使用每个元音的情况下打印字母


72

启示:1939年,一个名叫欧内斯特 ·文森特·赖特(Ernest Vincent Wright)的人写了一部名为《加兹比》的小说,没有使用字母“ e”。

您的任务是用任何一种语言(具有基于文本的语法*)编写一组(最多5个)程序,以按顺序输出所有26个字母。但是,对于每个元音aeiou,至少一个程序不得包含任何出现的元音。

所以一定有

  • 在程序语法中的任何地方都不使用“ a ”或“ A ”的程序。
  • 在程序语法中的任何地方都不使用' e '或' E '的程序。
  • 不使用程序“ ”或“ ”在程序的语法的任何地方。
  • 在程序语法中的任何地方都不使用' o '或' O '的程序。
  • 在程序语法中的任何地方都不使用“ u ”或“ U ”的程序。

它们都必须输出abcdefghijklmnopqrstuvwxyz

优胜者应是所有程序长度最短的解决方案。

*因为约束在Piet或Whitespace中并不是什么挑战


当前排名(2014年3月6日):


4
@ w0lf:不,它说“最多5个程序”和“所有程序的长度”,我读为“在这种情况下,只能有一个程序,并且其长度很重要”。
schnaader 2012年

9
@PeterTaylor:您认为不必避免在语法中使用元音是一个独特的挑战吗?作为JS程序员,它特别有趣:)
mellamokb

2
输出中是否接受换行符(即每个字符一个换行符)?如果是这种情况,我可以缩短一些代码...
Gaffi 2012年

2
是否允许大写输出?
暴民埃里克(Erik the Outgolfer)

2
我是OP。不允许大写。
shamp00 '16

Answers:


48

Golfscript-8个字符

123,97>+

8
该死的,在简洁方面真的无法击败golfscript ...
Patrick Oscity 2012年

18
话虽这么说,但可读性却像疯了似的。
安德鲁·格雷

5
并不坏;)生成123个数字的列表,删除不大于97的数字,将其(数字数组)强制转换为字符串。
麦凯2014年

3
使用91,65>+代替。
暴民埃里克


23

PHP,31字节

没有a,e,i,o,u:

<?=~žœ›š™˜—–•”“’‘ŽŒ‹Š‰ˆ‡†…;

代字号后的二进制字符串具有以下十六进制表示形式:

\x9e\x9d\x9c\x9b\x9a\x99\x98\x97\x96\x95\x94\x93\x92\x91\x90\x8f\x8e\x8d\x8c\x8b\x8a\x89\x88\x87\x86\x85

既然有一个语言记分板,我也可以提交这个记分板:

Ruby(v1.8)18字节

$><<[*97.chr..'z']

我不确定我是否理解它的工作原理。我可以解释一下吗?
骆马先生2012年

当应用于字符串时,〜运算符会将所有位取反。在这里,我将abc ... xyz颠倒了。因为二进制字符串中没有符号字符(或空格),所以也不需要引号。
primo 2012年

1
您可能要为那里的内容指定编码。
乔伊

1
iso-8859-1。发布时删除了三个“不可打印的”字符,这就是为什么我添加了十六进制的原因。
primo 2012年

2
不错,可能是最短的PHP版本。生成文件的命令:php -r 'echo("<?=~\x9e\x9d\x9c\x9b\x9a\x99\x98\x97\x96\x95\x94\x93\x92\x91\x90\x8f\x8e\x8d\x8c\x8b\x8a\x89\x88\x87\x86\x85;");' > script.php。该命令运行它php -d error_reporting=0 script.php; echo
axiac

16

红宝石(24 22)

编辑:括号可以省略,少2个字符:

$><<'%c'*26%[*97..122]

Ruby中的24个字符:

$><<('%c'*26)%[*97..122]

这个怎么运作

$>$stdout或的别名STDOUT。您可以使用<<运算符对其进行写入。该术语'%c'*26将字符串重复'%c'26次。在%操作者上的字符串定义为别名sprintf,这样str % val等价于书写sprintf(str,val)。格式字符%c用于将char值转换为char。这些值来自[*97..122]创建一个包含从97到122的值的数组。


非常好。我一直在寻找一种使用方法,<<但是却忘记了$>
马克·里德

1
我什至$>以前都不知道,但是我猜想必须有一些美元可变的别名,$stdout因为没人记得:)
Patrick Oscity

21个字符:($><<[*"`".."z"][1,26]请注意:这仅在Ruby 1.8中有效)
Ventero'5

@Ventero不仅可以在Ruby 1.8中使用,而且在Ruby 1.9.2中也可以使用。但是使用p [*"“ ..” z“] [1,26]`更短
Hauleth 2012年

@Hauleth:不,在1.9中运行它不会生成正确的输出,因为1.9 Array#to_s与1.9 是相同的Array#inspect,而在1.8中则是Array#join-因此在1.9中,输出是["a", "b", "c", "d", "e", ...]而不是abcdef...。出于同样的原因,p不能使用(它调用inspect其参数而不是to_s)。
Ventero 2012年

16

Pyth,1个字符

G

Pyth预定义了某些变量。G预定义为小写字母。Pyth还隐式地打印具有合理返回值的每一行。


3
Ninja'd me by 3 years ...
Stan

15

JavaScript(100)

没有“ aeou”:

this['\x61l\x65rt']('\x61bcd\x65fghijklmn\x6fpqrst\x75vwxyz')

没有“我”:

alert('abcdefgh\x69jklmnopqrstuvwxyz')

+1对我的答案有很好的改进:)我曾考虑过使用\x##代码,但不确定它们是否在JavaScript中有效。
mellamokb

为什么会发出警报?在js终端上,对象会自动回显。('\ x61bcd \ x65fghijklmn \ x6fpqrst \ x75vwxyz')@ 42个字符。
antony.trupe 2012年

3
@ antony.trupe,对于代码高尔夫,IO通常是通过语言的内置IO机制(或通用插件)完成的。对于JS,这是典型的alertconfirmpromptconsole.log,和document.write。简单声明一个字符串文字在执行时不会将其作为输出产生。否则,您将是正确的,而我会使用它。
zzzzBov 2012年

它会在google chrome控制台中产生输出(无论如何,我都会使用该定义),但是我承认了这个问题;首先是一个任意的限制。
antony.trupe 2012年

@ antony.trupe,在像PHP这样的语言中,您可以不必使用文字,因为它就是执行IO的方式。
zzzzBov 2012年

15

9

_26#.Q.b6

10倍

"c"$97+!26

K,14

.:".Q.","c"$97

2
以及一种完全没有字母(12个字符)的愚蠢方式:(@$`)$97+!26
亚伦·戴维斯

1
K5方式几乎是您的第二个解决方案,但是使用$符号而不是字符串来控制转换为以下类型的类型:`c $ 97 +!26
JohnE 2015年

15

J,26 23 17 16个字符

在J的内衣抽屉里翻滚一个小时左右后,我终于找到了消除a.u:动词的方法。

2(3!:4)96+#\26$1

先前:

a.{~96++/\26$1
u:97+i.26

感谢randomra#\技巧。


不错的解决方案!设法用1个字符#\ 代替来缩短+/\
randomra 2013年

5
滚出我的内衣抽屉

14

R,17 + 19 = 36个字符

没有AE(17):

intToUtf8(97:122)

没有(19):

cat(letters,sep="")

12

重击(38)

根本没有元音。

/*/*/*ntf "/*/?ch? {\x61..z}"|/*/b?sh

该程序在我的系统上失败,因为/ * / b?sh不存在。我有/ usr / local / bin / bash,没有/ bin / bash。
kernigh 2012年

2
很好地使用外壳球!
机械蜗牛

@kernigh[[ ! -d "/bin" ]] && mkdir "/bin"; sudo cp "/usr/local/bin/bash" "/bin/bash"
Stan Strum

如果/bin/sh是bash 会更好。然后代码可以以/*/sh(36个字节)结尾。但是我还没有找到一个可以正常工作的系统。在Debian中,/ bin / sh不是bash。在我的旧Mac中,/ bin / sh是bash 2.05b0。(1),但是此版本太旧并且无法扩展{a..z}
kernigh

11

C,90 88 84个字符

编译使用 gcc -nostartfiles

b;_exit(){for(;b<26;)printf("%c",b+++97);}    // 42 chars, works for a, u
b;_start(){putchar(b+++97)>121?:_start();}    // 42 chars, works for e, i, o

_start并且_exit是一个很好的方式得到解决main。但是,如果可以使用非标准的编译行,那为什么不行-DX=main呢?
ugoren

4
不知何故,-DX=main感觉比-nostartfiles对我来说更糟。这是将部分源代码移至编译行的一种方式,与编写#define X main源代码相同,这显然是无效的。尽管-nostartfiles不是重命名的方法main,但是消除了必须有一个main函数(称为_start)的限制。另一方面,使用-nostartfiles确实有点像作弊,特别是因为它包含5个“坏”字母中的
schnaader 2012年

这是一个滑坡......从距离-nostartfiles-DX=main小,那么为什么不节省一些字符用-DX=main()等等。但是我找不到不涉及任何麻烦的解决方案。
ugoren

无法将例如main函数定义为“ mn”吗?
尼尔

@Neil,只能执行类似的操作-Dmn=main。交流功能必须具有某种main功能,除非使用了非标准选件-nostartfiles
马修·弗拉申


9

Ruby,20个字符

$><<[*97.chr..?z]*''
  • 97.chr 是一种精致的说“ a”的方式
  • .. 指定范围
  • ?z 是说“ z”的简短方式
  • [*range]会导致范围分散其值在数组中
  • *''与相同join(''); 它将所有数组值粘合在一起。
  • $><< Perlicism:打印到标准输出。

此代码似乎无效。?z不是简写'z',而是122。但是,这确实适用于18个字节:$><<[*97.chr..'z']
primo 2012年

确实在Ruby 1.9 中工作
steenslag 2012年

1
我下载了1.9.3 ...,您说的对。他们为什么要改变这样的事情?我可以看到为什么无政府状态高尔夫仍然在运行1.8.7。无论如何,18字节解决方案适用于v1.8.7-
primo

2
(4年后......),你可以替换97.chr使用?\x61为-1字节。
乔丹

9

dc:18 17个字符

97[dP1+dBD>m]dsmx

那里死了一个勇敢的角色。


我对此表示怀疑。我正在全力以赴,没有找到缩短它的方法。我以完全相同的解决方案结束了,除了我用于x注册的这使我的解决方案更加混乱。
海尼克

3
97[dP1+dBD>m]dsmx,共17个字符。显然,您始终可以在DC中输入十六进制字符,但是由于输入基数为10,因此值为B*10+D=11*10+13=123='{',而不是0xBD。
Fors

哦,很高兴;-)
维乔迪尔13年

9

Powershell,75 62个字符

编辑:使用-f(String.Format)和数组索引来显着减少代码长度。

'{0}bcd{1}fgh{2}jklmn{3}pqrst{4}vwxyz'-f"$(1|gm)"[8,10,0,5,31]

这个怎么运作

gm是的别名get-members,因此1|gm返回value的成员1,其System.Int32类型为:

PS C:\> 1|gm
   TypeName: System.Int32
Name        MemberType Definition
----        ---------- ----------
CompareTo   Method     int CompareTo(System.Object value), int CompareTo(int value)
Equals      Method     bool Equals(System.Object obj), bool Equals(int obj)
GetHashCode Method     int GetHashCode()
...

"$(1|gm)"返回上述列表的字符串表示形式,它恰好包含我们需要完成字母的所有元音:“ int C omp ar eTo(System.Object val ue)...”


2
如果MS将成员添加到System.Int32中,则这是不稳定的,但是:-)
Joey

我认为那也必须($x=''+$(gv))[8]+"bcd$($x[4])fgh$($x[25])jklmn$($x[26])pqrst$($x[19])vwxyz"是75个字符:)
DankoDurbić12年

啊,对。我从历史中钓到了错误的物品。抱歉。
乔伊

其实,如果你更换''+$(gv)"$(gv)"($x="$(gv)")[8]+"bcd$($x[4])fgh$($x[25])jklmn$($x[26])pqrst$($x[19])vwxyz"这是74个字符。真好!
DankoDurbić2012年

2
我使用-f(String.Format)和数组索引来显着减少代码长度。
蒂姆·刘易斯


8

哈斯克尔(12)

['\97'..'z']

还是这是作弊?:)


我承认我对Haskell不太了解,但是它给了我这个错误:Parse error: naked expression at top level
primo 2012年

1
你在解释器中运行它
RobAu

7

MATLAB,12 + 20 = 32个字符

没有eiou(12):

char(97:122)

无声(20)

fprintf('%s',97:122)

7

在Perl中

也可以不用任何元音

但是比Ruby等更加困难。这总共使用101个字符,但不需要调用cmd行(perl -e)。

`\160\145\162\154\40\55\145\40\42\160\162\151\156\164\40\123\124\104\105\122\122\40\141\56\56\172\42`

=>结果:abcdefghijklmnopqrstuvwxyz

与“外观相似”的PHP解决方案相反,这是一个真实的程序。解码的程序读取为:

perl -e "print STDERR a..z"

编码为八进制值后,在运行期间由``(反引号)调用另一个perl解释器。反引号会消耗输出,因此将其打印到STDERR。

编码由sprintf完成:

my $s = q{perl -e "print STDERR a..z"};
my $cmd = eval(
       '"' . join('', map sprintf("\\%o",ord $_), split //, $s) . '"'
       );

评估的编码发布的程序(在反引号内):

"\160\145\162\154\40\55\145\40\42\160\162"
"\151\156\164\40\123\124\104\105\122\122"
"\40\141\56\56\172\42"

问候

机器人


8
您可以通过仅对元音进行编码来将其缩短为44个字符:)
marinus 2012年

7

Perl 5,22个字符

(1)仅包含ae,10个字符(需要5.10+,从命令行运行):

-Esay+a..z

(2)仅包含'i',12个字符:

print v97..z

如果不允许从命令行运行,那么您需要使用use 5.01;say a..z第一个字符,花费7个字符和一个以上的元音,但是它仍然没有'i',因此它导致有效的输入为29字符。


我认为'-E'选项可以,但是通常将2个字符'-E'添加到总字符长度中。
Gareth 2012年

@gareth--E代替-e来运行单线。如果您正在从文件中运行程序,那么您将受困于use,尽管您可以将其替换为命令行选项-M5.01并删除另外两个字符。
马克·里德

我正在考虑该规则,-p其中将2个字符添加到计数中。不过,看看这个元问题,-M5.010如果该选项有助于缩短代码,则应该可以免费使用。
Gareth 2012年

您可以替换为printdie
删除

chr 97..z可以替换v97..z为3个字节。
primo

7

APL(Dyalog)(11 13)

您可能需要APL字体。这应该是Unicode,但没有预览...

U(可能还算希腊元音):

⎕UCS 96+⍳26

(这就是:[quad]UCS 96+[iota]26

A

⎕A

2
U是元音...
Tobia

@Tobia:花了一年多的时间才看到有人(包括我)。我想现在,iota实际上也是一个元音。修复。
marinus

APL功能符号iota(U + 2373)在Unicode中不视为字母,因此不能作为元音。请注意,它与希腊语小写字母iota(U + 03B9)不同。
ngn 2014年

7

Python 2,83

没有一个Øü ; 47

x=97;s='';exec"s+=chr(x);x+=1;"*26+"pr\x69nt s"

没有e ; 36

print"abcd\x65fghijklmnopqrstuvwxyz"

6

Python 2,175个字符

注意:打印到输出不同于早期的python answer

使用'e',但不使用a,i,o,u- 63 61 59 65(修正错误地i移至小写字母)115个字符(去除空格)。

exec('fr%cm sys %cmp%crt*\nf%cr x %cn r%cnge(97,123):std%c%ct.wr%cte(chr(x)),'%(111,105,111,111,105,97,111,117,105))

(最初,它使用带逗号的print插入一个空格;还打印了大写字母。现在看到对'abcdefghijklmnopqrstuvwxyz'的严格要求;因此添加了import语句)。

不使用'e'(使用a,i,o,u;可以小幅扩展而摆脱a,u)-61 60个字符

import string
print string.__dict__['low%crcas%c'%(101,101)]

1
您的第一个解决方案确实使用了letter i,所以应该是:exec('f%cr x %cn r%cnge(65,91):pr%cnt chr(x),'%(111,105,97,105))并且我们回到了64个字符。
BioGeek 2012年

1
exec('fr%cm sys mp%crt*\nf%cr ...
Gareth

BioGeek和@Gareth-我的手动元音检测技巧很烂。谢谢指出。但是我写了一个额外的e作为'%c',所以最终它变得平稳了。
jimbob博士2012年

您可以从exec('...')
mbomb007 '16

5

的JavaScript(154)

(1)仅包含i(99个字符):

t=this;s=-t+t+t.b;z=s[1]+'bcd'+s[7]+'fghijklmn'+s[4]+'pqrst'+s[21]+'vwxyz';t[s[1]+'l'+s[7]+'rt'](z)

(2)仅包含aeou(55个字符):

t=0;s=''+t.b;alert('abcdefgh'+s[5]+'jklmnopqrstuvwxyz')

演示:http//jsfiddle.net/SvN5n/


$("h\x65\x61d")[0]["\x6fwn\x65rD\x6fc\x75m\x65nt"]["l\x6fc\x61t\x69\x6fn"]="j\x61v\x61scr\x69pt:\x65v\x61l(`f\x6fr(s='',l=65;l<90;l++){s=s+Str\x69ng.fr\x6fmCh\x61rC\x6fd\x65(l);};c\x6fns\x6fl\x65.l\x6fg(s)`)"208个字符,未aeoui在代码中使用。适用于Chrome浏览器。
EscĐiệp

5

蟒蛇 159 117

如另一篇python文章所述,最困难的部分是处理输出唯一方法是使用printor 的事实sys.stdout.write,两者都包含i。必须使用2个程序来完成它(它们是独立的,并且不使用python交互式外壳程序来创建输出):

这个仅使用i表示55个字符:

print"%cbcd%cfghijklmn%cpqrst%cvwxyz"%(97,101,111,117)

这避免了将i用作104个字符:

eval("sys.stdout.wr%cte"%105,{'sys':eval("__%cmport__('sys')"%105)})("%c"*26%tuple(range(97,123))+"\n")

编辑: 巨大的突破!我当时以为使用eval(甚至是exec)有点作弊,并不是真正的竞争精神。无论如何,我通过浏览内置函数找到了一种无需使用i即可掌握打印功能的方法。所以这是68个字符的避免-i(和o)程序:

vars(vars().values()[0])['pr%cnt'%105]("%c"*26%tuple(range(97,123)))

但是因为这样也可以避免使用o,所以可以将其与只避免使用49个字符的a,e,u的配对:

print"%cbcd%cfghijklmnopqrst%cvwxyz"%(97,101,117)

您可以丢掉兼容性,并获得角色vars(vars().values()[0]).values()[47]
ugoren 2012年

5

红宝石196 164 44 47

$><<"\x61bcd\x65fgh\x69jklmn\x6Fpqrst\x75vwxyz"

这是一个有效的答案,因为p在字母周围会输出引号?
Mark Reed 2012年

我同意p x等同于调用puts str.inspect,这会导致引号引起来。
Patrick Oscity

@padde你们都是正确的;改变了。
克里斯蒂安·卢帕斯库

1
@padde我用了您$><<,所以+1并表示祝贺;您的版本更好
Cristian Lupascu 2012年


5

VBA:76种蛮力,116种不“作弊”(如果输出中可接受换行符,则为98种)

标准功能

由于VBA的冗长,我不相信在标准代码模块中没有'E'或'U'就无法做到这一点...

  • E nd”
  • “F ü nction”
  • “S ü B”

即时功能

使用mellamokb的假设运行,这里没有函数声明(省略SUBFUNCTION)(116个字符,如果输出中可以接受换行符,则为98个):

以下代码既不使用“ e”也不使用“ a”(43个字符,格式为在立即窗口中运行):

b=65:Do:z=z+Chr(b):b=b+1:Loop Until b=91:?z

以下代码既不使用'i'也不使用'a'也不使用'u'(33个字符,格式为在立即窗口中运行):

For b=65 To 90:z=z+Chr(b):Next:?z

以下代码既不使用'a'也不使用'o'也不使用'u'(40个字符,格式为在立即窗口中运行):

b=65:While b<91:z=z+Chr(b):b=b+1:Wend:?z

如果输出中允许使用换行符,则上面的示例可以更短:

37个字符

b=65:Do:?Chr(b):b=b+1:Loop Until b=91

27个字符

For b=65 To 90:?Chr(b):Next

34个字符

b=65:While b<91:?Chr(b):b=b+1:Wend

蛮力

使用w0lf的Ruby答案运行

76个字符,格式为在立即窗口中运行):

?Chr(65)&"BCD"&Chr(69)&"FGH"&Chr(73)&"JKLMN"&Chr(79)&"PQRST"&Chr(85)&"VWXYZ"

1
我认为将其遗漏会很公平Sub..End Sub,因为大多数其他程序都不包含函数定义。
mellamokb

@mellamokb好吧,这让我感觉更好。我将举一些例子来补充这一点。
加菲2012年

2
只需将其视为“您在立即窗口中运行的代码” :)
mellamokb '04

2
好吧,如果有疑问,只需将其称为VBScript,即可将其包含在文件中,而无需使用Sub:)
Joey 2012年

修正了一堆不必要的空间,改变了print?自认为在即时窗口工作。
加菲2012年

5

Rebmu:15个字符

Ctc'`L26[pn++C]

要开始阅读Rebmu,始终需要一点点注意

c: tc '` l 26 [pn ++ c]

然后,它有助于扩展缩写:

c: to-char-mu '`
loop 26 [
    prin ++ c
]

对于小写字母a的前身使用字符文字会更明显:

c: #"`"
loop 26 [
    prin ++ c
]

但这并不是“强制性的”,因此将单词文字转换为字符可以通过相同的目的。与大多数Rebmu一样,我喜欢它的是,尽管有压缩,它仍具有明智程序的精神。(Golfscript的答案较短,但并不对应于程序员在编码时通常会想到的方式。)


5

<> <(Fish)-22个字符

因为<> <使用'o'来打印字符,所以似乎很难做到这一点。幸运的是,fish可以在运行时更改其自己的代码。这使我可以将打印指令添加到代码中。

此代码不使用任何元音:

'`78'+11pv
:X:'z'=?;>1+

您可以在此处运行代码

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.