查找the草


21

Semordnilaps(也称为异回文,半回文,半回文,反义词,mynoretehs,可逆字谜,单词反义词或书呆子)是单词,当向后拼写时也就是单词。一些示例是:

  • 病房<=>抽奖
  • 已开采<=>牛仔布
  • 零件<=>表带

给定一个正整数N(通过函数参数或STDIN),从此英语单词列表中返回/输出一个semordnilaps 列表,这些单词正好具有N个字母。单词列表可以作为文本文件保存在您的计算机上本地:w.txt。您也可以从url获取列表,但是它将包含在字节数中。

规则:

  1. 回文不属于semordnilaps!因此,单词“中午”,“转子”和“雷达”不应包括在列表中。
  2. 列表中仅应包含一个单词(在semordnilap对中)。因此,如果“狗”在列表中,则“神”不应存在(与其中包括哪一个无关)。
  3. 如果没有semordnilaps,则输出应为空字符串,0,FALSE或其他指示没有结果的字符串。即使没有结果,该功能也必须起作用。

这是代码高尔夫球,因此以字节为单位的最短代码获胜!


排行榜

这篇文章底部的Stack Snippet从答案a)生成目录,答案是每种语言的最短解决方案列表,b)则是总体排行榜。

为确保您的答案显示出来,请使用以下Markdown模板以标题开头。

## Language Name, N bytes

N您提交的文件大小在哪里。如果您提高了分数,则可以通过打败旧分数保持标题。例如:

## Ruby, <s>104</s> <s>101</s> 96 bytes

如果要在标头中包含多个数字(例如,因为您的分数是两个文件的总和,或者您想单独列出解释器标志罚分),请确保实际分数是标头中的最后一个数字:

## Perl, 43 + 2 (-p flag) = 45 bytes

您还可以将语言名称设置为链接,然后该链接将显示在代码段中:

## [><>](http://esolangs.org/wiki/Fish), 121 bytes



5
单数Emordnilap和复数不应该Semordnilap吗?;)
FryAmTheEggman 2014年

1
“回文不是semordnilaps!” 哇,这个句子/项目符号还不清楚,但是现在我明白了你的意思了。当它们被颠倒时,本身的单词不是semordnilaps。

Answers:


10

Pyth,23(18个代码,5个必要的STDIN)

J'f&qlTQ&}_TJ>_TTJ

这是一个非常简单的解决方案。

J存储单词列表。然后,我们根据单词f J的长度过滤掉单词列表(),将单词的长度设为输入(qlTQ),将反向单词放在列表(}_TJ)中,并将单词的反转程度大于单词(>_TT)。最后一个条件确保T不是回文,并且仅打印一对。结果列表被打印。

Pyth的工作方式是,打开文件的唯一方法是在STDIN上接收其名称。这就是为什么我w.txt在分数中计算了5个STDIN字节的原因。

示例运行:

$ pyth -c "J'f&qlTQ&}_TJ>_TTJ" <<< '6
w.txt'
['animal', 'denier', 'diaper', 'drawer', 'pupils', 'recaps', 'redraw', 'sleets', 'snoops', 'sports']

10

Ruby,74个字节

f=->n{i=IO.read('w.txt').split
p *i&[f.reverse]if f.size==n while f=i.pop}

通过删除元素来遍历列表,这样既可以避免回文,又可以输出“压力”和“甜点”。为函数使用相同的变量名,并且迭代器会绕过Ruby语法的古怪:即使f=i.pop在之前进行了评估f.reverse,该行也不会解析,除非f已经有意义。我也可以使用p


4

重击 134 157 118个字节

f () { comm -12 <(sort w.txt) <(rev w.txt|sort)|while read w; do ((${#w}==$1))&&[[ $w<$(rev<<<$w) ]]&&echo $w; done; }

这不是一个严肃的词条,而是为了回应 Brian的Bash回答的回应。这就是我倾向于考虑在Bash中进行此类编程的方式-尽可能少地使用Bash本身,并让内置工具完成所有工作。


无论如何,您都会从comm中得到单词及其反映,您只需回显“ $ w”,而不必担心多余的排序和结尾。如果这样做,则结果应该已经排序,因此最终排序也可以删除。
Orion

我不懂 我如何在您的方法中进行重复数据删除?
亚伦·戴维斯

另外,我完全忘了去除回文。固定。
亚伦·戴维斯

抱歉,睡眠不足……您确实需要与反面进行比较,以仅保留其中之一,但是您不必担心回文,并且我的其余评论仍然有效。现在您已经提到了,bash具有字符串比较运算符,因此&&[[ $w > $(rev<<<$w) ]]&& echo $w仍然避免使用sort|tail -1。这样,我认为您甚至可以放弃最后的排序和唯一性,因为它消除了回文仅输出其中一个单词。
Orion

另外,一开始没用的猫:<(sort w.txt)还可以。
Orion

4

Python中,126 125 120个字节

N=input()
J=open("w.txt").read().split()
for c in set(J):
 if N==len(c)and c!=c[::-1]and c[::-1]in J:print c;J.remove(c)

非常简单的解决方案。


它的定义似乎更短k=c[::-1]。而且,您不能set()只第二次打电话吗?我认为文件中没有重复吗?
FryAmTheEggman 2014年

@FryAmTheEggman:实际上,要分配11个字符k(定义为9个,换行符为1个,空格为1个),但是我只保存10个字符(取出[::-1]6 个字符,但加上1个,因为我需要一个空格)。关于set,我需要J成为一个集合,因为我从中删除了用过的单词以满足不重复规则
Claudiu 2014年

切换为N==len(c)and节省空间。
isaacg 2014年

@isaacg:是的,ty
Claudiu

您很短=-应该是==
isaacg 2014年

3

CJam,48 47 45 42 38字节

由于必须计算网址,因此我使用了与优化程序相同的网址缩写。

"ri.ms/§"gDcN+/{,ea~i=},_Wf%&{_W%>},N*

§是扩展的ASCII的一部分,所以在代码的每个字符可以在一个单一的字节来编码。

与Optimizer的情况一样,您必须使用Java解释器并从文件本地运行它semordnilap.cjam,然后

java -jar cjam-0.6.2.jar semordnilap.cjam <N>

因此,输入作为命令行参数给出。

工作原理(略过时):

"Prepare word list:";
"ri.ms/§"gDcN+/ 
"ri.ms/§"g      "Fetch list from shortened URL.";
          DcN+  "Create \r\n string.";
              / "Split input into lines.";

"Process input:";
{,ea~i=},
{      }, "Filter the list.";
 ,        "Get word length.";
  ea      "Push command-line arguments.";
    ~     "Unwrap array.";
     i    "Convert to integer.";
      =   "Check equality.";

"Find all palindromes and semordnilaps:";
_Wf%&
_     "Duplicate list.";
 Wf%  "Reverse each line.";
    & "Set intersection.";

"Remove duplicates and palindromes:";
{_W%>},N*
{    },   "Filter list.";
 _W%      "Duplicate word, reverse.";
    >     "Check lexicographic order.";
       N* "Join with newlines.";

结果字符串将自动打印在程序末尾。


3

Java中,280个 218字节

与其他比赛相比,我绝对不知道这是一个好成绩。

void a(int n)throws Exception{List<String>l=Files.readAllLines(Paths.get("w.txt"));for(String s:l){String c=new StringBuilder(s).reverse()+"";if(s.length()==n&&c.compareTo(s)>0&&l.contains(c)){System.out.println(s);}}}

展开:

void a(int n)throws Exception{
    List<String>l=Files.readAllLines(Paths.get("w.txt"));
    for(String s:l){
        String c=new StringBuilder(s).reverse()+"";
        if(s.length()==n&&c.compareTo(s)>0&&l.contains(c)){
            System.out.println(s);
        }
    }
}

使用compareTo()同时忽略回文和重复项。


2
Java总是会在高尔夫比赛中大放异彩。
Rodolfo Dias 2014年

我从来没有见过Files.readAllLines(Paths.get("w.txt"))之前。这是一个有用的把戏。
Ypnypn 2014年

2

CJam,68个字节

"www.ri.ms/§"gDc-N/{_,ea~~=\_W%=!*},:Q{_W%aQ\/,({Q\a-:Q;1}{;0}?},N*

您将必须从此处下载Java版本的编译器,并将上面的代码保存在一个名为words.cjam的文件中(可以是任何名称)。然后像这样运行代码

java -jar cjam-0.6.2.jar <file_name> <input_number> [> <output_file_name>]

例如,对于N = 8

java -jar cjam-0.6.2.jar words.cjam 8 > out.txt  

Java –不是首字母缩写词。请不要将其拼写为JAVA。
FUZxxl 2015年

@FUZxxl大部分都是可自我编辑的..
Optimizer

我不是警察 人们对拼写有不同的看法,我尊重您的看法。我只是建议您不要像Java的首字母缩写那样对Java进行拼写,也不希望对您使用其他拼写。
FUZxxl

@FUZxxl我真的不喜欢:D
Optimizer

2

Node.js,172个字节

功能:

function d(n){return(require('fs').readFileSync("w.txt")+"").match(RegExp(("b"+Array(n+1).join("(.)")+"b(?=(.|s)*b"+"87654321".substr(-n)+"b)").replace(/\w/g,"\\$&"),"g"))}

测试:

console.log(d(+process.argv[2]));
// run from command line like this:
// node main 4
// where
//   main is js file name
//   4    is length

2

K,59个字节

{*+?{x@<x}'+(w;r)@\:&(x=#:'w)&(~w~'r)&w in r:|:'w:0:`w.txt}

非常简单。阅读列表,构造反向列表,取得它们的交集,过滤出回文,在所需的计数中进行过滤,对和进行重复数据删除。


2

Ruby,95个字节

f=->n{l=[]
(a=IO.read"w.txt").split.map{|w|a[w]=?.
w.size==n&&a[/^#{r=w.reverse}\s$/]&&l<<w}
l}

说明

  • 输入作为lambda的参数。它期望一个Integer
  • Stringa)将文件读入内存。
  • 循环Array所有单词中的一个(没有换行符)。
    • 从中删除单词a
    • 将限定词添加到中Array l
  • 返回l

Array如果找不到限定词,则返回一个空。


1

Node.js,CoffeeScript,132字节

f=(n)->(require('fs').readFileSync('w.txt')+'').split('\n').filter((s,i,f)->s.length==n&&f.indexOf(s.split('').reverse().join(''))>i)

Node.js,162字节

function a(n){return(require('fs').readFileSync('w.txt')+'').split('\n').filter(function(s,i,f){return s.length==n&&f.indexOf(s.split('').reverse().join(''))>i})}

Chrome Dev Tools Console,111字节 (在下载页面上)

f=(n=>$('pre').innerText.split('\n').filter((x,i,a)=>x.length==n&&a.indexOf(x.split('').reverse().join(''))>i))

所有版本均返回所有长度的Semordnilaps的数组 n

Node.js,162字节

打印所有semordnilaps:

function a(n){(require('fs').readFileSync('w.txt')+'').split('\n').map(function(s,i,f){s.length==n&&f.indexOf(s.split('').reverse().join(''))>i&&console.log(s)})}

1

朱莉娅101字节

k=split(readall("w.txt"))
for(i=k)
([]!=(l=find(x->x==reverse(i)&&x!=i,k)))&&(println(i);k[l]="")
end

这实际上应该工作...


1

Mathematica,105个字节

F[f_,n_]:=(W=StringSplit@Import@f;Select[W,StringLength@#==n&&MemberQ[W,r@#]&&Order[r@#,#]==1&&r@#!=# &])

有时,导入会自动将文本拆分为行列表,或将其视为CSV或TSV。在其他时候,Import会将文件的内容读入字符串。导入由后者完成,用于测试数据。

tests


0

重击

f() {
  w=($(cat "${1}"))
  for ((i=0;i<=${#w[@]};i++)); do
    if ((${#w[$i]} == $2)); then
      r=
      for((x=${#w[$i]}-1;x>=0;x--)); do
        r="$r${w[$i]:$x:1}";
      done
      if [[ ${w[$i]} != ${r} ]] && grep -qw $r "${1}"; then
        echo "${w[$i]}, ${r}"
      fi
      unset w[$i]
    fi
  done
}

测试...

f /usr/share/dict/words 5

debut, tubed
decaf, faced
decal, laced
deeps, speed
denim, mined
devil, lived
draws, sward
faced, decaf
keels, sleek
knits, stink
laced, decal
lager, regal
leper, repel
lever, revel
lived, devil
loops, spool
loots, stool
mined, denim
parts, strap
peels, sleep
pools, sloop
ports, strop
rebut, tuber
regal, lager
remit, timer
repel, leper
revel, lever
sleek, keels
sleep, peels
sloop, pools
smart, trams
snaps, spans
snips, spins
spans, snaps
speed, deeps
spins, snips
spool, loops
spots, stops
sprat, tarps
stink, knits
stool, loots
stops, spots
strap, parts
straw, warts
strop, ports
sward, draws
tarps, sprat
timer, remit
trams, smart

2
我想这不是很打高尔夫球。这将是关于Stack Overflow的一个很好的答案(如果有一些评论和解释)。
Stewie Griffin 2014年

1
同意,这是我第一次解决bash问题。我厌倦了使其尽可能地可读。但就高尔夫而言。这更像是我在标准杆3杆中射出9:-)
Brian
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.