尽管梭罗掷得透彻,但巨魔却投出了艰难的低谷


19

为这9个令人困惑的相似单词中的每一个,以您喜欢的任何方式分配数字1-9:

though
through
thorough
Thoreau
throw
threw
trough
tough
troll

编写一个包含字符串的程序。如果输入是这9个单词之一,则输出分配给它的数字。如果输入不是以上单词之一,则程序可能会执行任何操作(包括错误或永久循环)。

单词区分大小写,例如Thoreau,应产生一个1到9的数字,但thoreau不一定会一样。

假设您分配数字如下:

though   9
through  2
thorough 7
Thoreau  6
throw    3
threw    5
trough   4
tough    1
troll    8

然后在tough输入时,1应输出。
through输入时,2应当输出。
throw输入时,3应当输出。
。。。
though输入时,9应当输出。

所有其他输入都可以做任何事情。

细节

  • 通过stdin或命令行获取输入字符串,然后输出到stdout。
  • 输出可能包含单个尾随换行符。
  • 您可以编写一个可以接受字符串并正常打印结果或返回结果的函数,而不是程序。
  • 以字节为单位的最短提交胜出

1
该死!当使用Python字符串find方法找不到时,我有一个聪明的解决方案可以输出零。然后规则改变了。聪明的主意现在还不那么聪明。
逻辑骑士

@CarpetPython我的确很糟糕。如果您对变更不满意,请毫不犹豫地拒绝投票。(尽管我向所有人保证不会有任何变化。)
卡尔文的爱好

没关系。我认为我的答案仍然有效(尽管我有点冗长)。
逻辑骑士

不论大小写,我都可以使用吗?
ASCIIThenANSI 2015年

2
@ASCIIThenANSI,只要它适用于9种情况
加尔文的爱好

Answers:


19

CJam,11 9 7个字节

q1b2+B%

运作方式

我们利用了这样一个事实,即以11为模的ASCII码+ 2的总和给出了从1到9的非常好的顺序,然后对于9个有关的单词给出了10的很好的顺序。排序如下:

through -> 1
thorough -> 2 
tough -> 3 
Thoreau -> 4 
throw -> 5 
threw -> 6 
trough -> 7 
though -> 8 
troll -> 9

代码说明

q               e# Read the input
 1b             e# Sum the ASCII code values of all characters in this word
   2+           e# Increment the sum by 2
     B%         e# Mod by 11 and automatically print the mod result at the end

感谢user23013,节省了4个字节

在这里在线尝试


我们应该如何尝试呢?(并非每个人都讲CJam,我们中有些人讲大声笑)
Behrooz

@Behrooz有一个链接。单击它,将您的输入放在输入部分“运行”中。不确定如何更容易:)
Optimizer

冬青狗屎,我在想我应该怎么给它列出单词。好人
Behrooz 2015年

1
@ user23013该死!每一次!
Optimizer

2
或者q1b2+B%
jimmy23013 2015年

18

Pyth,8个字符

e%Cz8109

在线尝试:演示测试套件

我正在使用作业:

though   5
through  9
thorough 4
Thoreau  7
throw    3
threw    2
trough   8
tough    6
troll    1

说明:

   z       input()
  C        convert to int (convert each char to their ASCII value
           and interprete the result as number in base 256)
 %  8109   modulo 8109
e          modulo 10

顺便说一句,我使用以下脚本找到了魔幻数字8109 fqr1 10Sme%CdT.z1


这不会有假阳性吗?
亚历山大·布雷特

5
@ alexander-brett你到底是什么意思?OP中未指定所有其他输入的输出。我们可以输出任何我们想要的东西。
雅库布

抱歉,我错过了对OP的修改。:P
亚历山大·布雷特

11

Python 2,92 54字节

print'K{7j)yE<}'.find(chr(hash(raw_input())%95+32))+1

索引字符串是使用创建的for word in words: print chr(hash(word)%95+32),。正如Jakube的答案所指出的那样,哈希函数将根据Python版本给出不同的结果。此索引字符串是在64位Python 2.7.6上计算的。

更长(92个字节),但答案却不太明确:

print'though through thorough Thoreau throw threw trough tough troll'.find(raw_input())/7+1

该程序返回1 9,因为尽管通过彻底的梭罗投掷顺序经过了艰难的巨魔。当找不到输入时,find将返回-1,在之后方便地变成零+1


请注意,0不再需要这些东西。很抱歉为您更改它。
加尔文的爱好2015年

感谢您的注意。一段时间
逻辑骑士

3
@CarpetPython地板分割的很好用-效果出奇地整齐。
xnor

7

Python 2.7.9 32位版本,22字节

lambda x:hash(x)%78%10

注意,这里的版本非常重要。如果使用64位版本的Python,您将获得不同的结果。由于该hash方法将计算64位哈希值而不是32位。

分配是:

though  => 5   through => 6   thorough => 8
Thoreau => 7   throw   => 3   threw    => 1
trough  => 9   tough   => 4   troll    => 2

在线尝试:http : //ideone.com/Rqp9J8


2
哇,所以一直以来,您都在遍历语言版本和操作系统位?:P
优化器

1
很好的答案。您是否通过数学,自动迭代或某些猜测找到了常数78?
逻辑骑士

3
@CarpetPython只是一个遍历所有可能模块的简单暴力循环。有一次sorted(...)==range(1,10),我停了下来。
雅库布2015年

5

Pyth,7个字节

et%Cz31

我正在使用以下任务:

though   8
through  3
thorough 1
Thoreau  5
throw    4
threw    7
trough   6
tough    2
troll    9

Cz将输入解释为基数256。然后,我们将这个mod 31减去1,然后得到结果mod10。等效的伪代码:

((base_256(input()) % 31) - 1) % 10

演示测试线束


1

Python 2,27个字节

f=lambda w:int(w,34)%444/46

与此作业:

>>> for w in "though through thorough Thoreau throw threw trough tough troll".split(): print f(w),w
...
9 though
7 through
3 thorough
8 Thoreau
2 throw
5 threw
6 trough
1 tough
4 troll

可能有几种变化,例如

f=lambda w:int(w,35)/159%10

1

Japt,6个字节

nH %BÉ

试试吧 | 检查所有单词


说明

利用这样的事实,当将基本n字符串解析为整数时,如果JavaScript遇到大于的数字,JavaScript将停止解析,n并返回结果。通过在此处使用base-32(数字0-vw,实际上将忽略“ throw”和“ throw”中的s。

nH      :Convert from base-32
   %B   :Modulo 11
     É  :Subtract 1

JavaScript,22个字节

直接翻译-似乎不值得单独发布。

f=
U=>parseInt(U,32)%11-1
o.innerText=["through","tough","troll","trough","though","throw","threw","thorough","Thoreau"].map(s=>f(s)+": "+s).join`\n`
<pre id=o><pre>



0

Java 8,53 25字节

s->(s.chars().sum()+2)%11

要么

s->-~-~s.chars().sum()%11

@Optimizer的CJam答案的端口号,因为它(最有可能)无法用Java缩短。

在线尝试。


Java有parseInt,不是吗?我的解决方案的端口号不会更短吗?
粗野的

@Shaggy Java确实具有parseInt给定的基数,但是不幸的是,由于静态类的要求,它是字节过多的:Long.parseLong(...,32)作为最短的变体。此外,它似乎失败"throw"(和"threw"Java中也一样)因为某些原因w似乎超出了以32为基数的范围(使用33会给出错误的结果)。
凯文·克鲁伊森

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.