Code golf:查找所有字谜

Cha*_* Ma 16 code-golf anagram

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

任务:

  • 按字符排序的最短源代码,用于查找给定单词列表的所有字符集集.
  • 空格和新行应计为字符
  • 使用代码标尺

    --------- -------- 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
Run Code Online (Sandbox Code Playgroud)

输出:

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

示例运行:

./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
...
Run Code Online (Sandbox Code Playgroud)

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

玩得开心!

编辑:澄清

  • 假设字谜不区分大小写(即大写和小写字母相同)
  • 只应打印超过1个项目的集合
  • 每组字谜应该只打印一次
  • 字谜集中的每个单词应该只出现一次

EDIT2:更多澄清

  • 如果两个单词仅在大小写方面有所不同,那么它们应该折叠成同一个单词,由您来决定使用哪个大写方案用于折叠单词
  • 只要每个单词以某种方式分隔,例如逗号分隔或空格分隔有效,单词集只需以新行结束.我知道有些语言内置了快速阵列打印方法,所以如果它不输出空格分隔的数组,这应该允许你利用它.

Dan*_*bić 12

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

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

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

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

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

[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开始吓到我了;) (6认同)
  • 看起来像perl. (2认同)

Mic*_*man 12

Perl,59个字符

chop,$_{join'',sort split//,lc}.="$_ "for<>;/ ./&&say for%_
Run Code Online (Sandbox Code Playgroud)

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


Mtn*_*ark 5

哈斯克尔,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
Run Code Online (Sandbox Code Playgroud)

该版本的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
Run Code Online (Sandbox Code Playgroud)

此版本处理:

  1. 输入中仅按大小写区分的单词应仅计为一个单词
  2. 输出需要是每行一个字谜集,但额外的标点符号是可以接受的