当前位置:  开发笔记 > 编程语言 > 正文

Code golf:查找所有字谜

如何解决《Codegolf:查找所有字谜》经验,为你挑选了3个好方法。

如果该单词中的字母可以重新排列以形成不同的单词,则单词是字谜.

任务:

按字符排序的最短源代码,用于查找给定单词列表的所有字符集集.

空格和新行应计为字符

使用代码标尺

--------- -------- 10 20 -------- -------- 30 40 -------- ---- 50 ---- -------- 60 70 -------- -------- 80 90 -------- 100 ------- 110- ------ 120

输入:

一个单词的列表,从一个新行分隔每个字标准输入.

例如

A
A's
AOL
AOL's
Aachen
Aachen's
Aaliyah
Aaliyah's
Aaron
Aaron's
Abbas
Abbasid
Abbasid's

输出:

所有组的字谜,每组由一条单独的线分隔.

示例运行:

./anagram < words
marcos caroms macros
lump's plum's
dewar's wader's
postman tampons
dent tend
macho mocha
stoker's stroke's
hops posh shop
chasity scythia
...

我有一个149 char perl解决方案,我会在几个人发布后发布:)

玩得开心!

编辑:澄清

假设字谜不区分大小写(即大写和小写字母相同)

只应打印超过1个项目的集合

每组字谜应该只打印一次

字谜集中的每个单词应该只出现一次

EDIT2:更多澄清

如果两个单词仅在大小写方面有所不同,那么它们应该折叠成同一个单词,由您来决定使用哪个大写方案用于折叠单词

只要每个单词以某种方式分隔,例如逗号分隔或空格分隔有效,单词集只需以新行结束.我知道有些语言内置了快速阵列打印方法,所以如果它不输出空格分隔的数组,这应该允许你利用它.

Danko Durbić.. 12

电源外壳, 104 97 91 86 83个字符

$k=@{};$input|%{$k["$([char[]]$_|%{$_+0}|sort)"]+=@($_)}
$k.Values|?{$_[1]}|%{"$_"}

更新新要求(+8个字符):

为了排除只是大小写不同的话,我们只能从输入列表,即删除重复的(案例insensitvely) $input|sort -u,其中-u代表-unique.sort默认情况下不区分大小写:

$k=@{};$input|sort -u|%{$k["$([char[]]$_|%{$_+0}|sort)"]+=@($_)} 
$k.Values|?{$_[1]}|%{"$_"} 

[char[]]$_|%{$_+0}|sort-part的解释

它是哈希表条目的关键,在该条目下存储单词的字谜.我最初的解决方案是:$_.ToLower().ToCharArray()|sort.然后我发现我不需要ToLower()密钥,因为哈希表查找不区分大小写.

[char[]]$_|sort将是理想的,但对于字符的关键需要的排序,以不区分大小写(否则Cababc下不同的密钥将被存储).不幸的是,sort字符不具有大小写不敏感(仅适用于字符串).

我们需要的是[string[]][char[]]$_|sort,但是我找到了一种将每个char转换为字符串的简短方法,即将其他东西连接到它,在这种情况下是一个整数0,因此[char[]]$_|%{$_+0}|sort.这不会影响排序顺序,实际的键最终会像:d0 o0 r0 w0.它不漂亮,但它做的工作:)



1> Danko Durbić..:

电源外壳, 104 97 91 86 83个字符

$k=@{};$input|%{$k["$([char[]]$_|%{$_+0}|sort)"]+=@($_)}
$k.Values|?{$_[1]}|%{"$_"}

更新新要求(+8个字符):

为了排除只是大小写不同的话,我们只能从输入列表,即删除重复的(案例insensitvely) $input|sort -u,其中-u代表-unique.sort默认情况下不区分大小写:

$k=@{};$input|sort -u|%{$k["$([char[]]$_|%{$_+0}|sort)"]+=@($_)} 
$k.Values|?{$_[1]}|%{"$_"} 

[char[]]$_|%{$_+0}|sort-part的解释

它是哈希表条目的关键,在该条目下存储单词的字谜.我最初的解决方案是:$_.ToLower().ToCharArray()|sort.然后我发现我不需要ToLower()密钥,因为哈希表查找不区分大小写.

[char[]]$_|sort将是理想的,但对于字符的关键需要的排序,以不区分大小写(否则Cababc下不同的密钥将被存储).不幸的是,sort字符不具有大小写不敏感(仅适用于字符串).

我们需要的是[string[]][char[]]$_|sort,但是我找到了一种将每个char转换为字符串的简短方法,即将其他东西连接到它,在这种情况下是一个整数0,因此[char[]]$_|%{$_+0}|sort.这不会影响排序顺序,实际的键最终会像:d0 o0 r0 w0.它不漂亮,但它做的工作:)


这个Powershell开始吓到我了;)
看起来像perl.

2> Michael Carm..:
Perl,59个字符
chop,$_{join'',sort split//,lc}.="$_ "for<>;/ ./&&say for%_

请注意,这需要Perl 5.10(用于该say功能).



3> MtnViewMark..:

哈斯克尔,147个字符

先前尺寸: 150 159 字符

import Char
import List
x=sort.map toLower
g&a=g(x a).x
main=interact$unlines.map unwords.filter((>1).length).groupBy((==)&).sortBy(compare&).lines

该版本的165个字符符合新的澄清规则:

import Char
import List
y=map toLower
x=sort.y
g&f=(.f).g.f
w[_]="";w a=show a++"\n"
main=interact$concatMap(w.nubBy((==)&y)).groupBy((==)&x).sortBy(compare&x).lines

此版本处理:

    输入中仅按大小写区分的单词应仅计为一个单词

    输出需要是每行一个字谜集,但额外的标点符号是可以接受的

推荐阅读
携手相约幸福
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有