Semordnilapsを見つける


21

Semordnilaps(ヘテロパリンドローム、セミパリンドローム、ハーフパリンドローム、リバーズグラム、マイノリーテス、リバーシブルアナグラム、ワードリバーサル、またはアナドロームとも呼ばれる)は、逆スペルの場合もワードです。以下に例を示します。

  • 区<=>引き分け
  • マイニング<=>デニム
  • パーツ<=>ストラップ

(関数の引数またはSTDINを介して)正の整数Nが与えられると、この英語の単語のリストから、正確にN文字のsemordnilapsのリストを返す/出力します。単語のリストは、次の名前のテキストファイルとしてコンピューターにローカルに保存できますw.txt。URLからリストを取得することもできますが、バイトカウントに含まれます。

ルール:

  1. 回文はsemordnilapsではありません!したがって、「正午」、「ローター」、および「レーダー」という単語はリストに含めないでください。
  2. (semordnilapペアの)単語の1つだけをリストに含める必要があります。したがって、「犬」がリストに含まれている場合、「神」は含まれません(どちらが含まれているかは関係ありません)。
  3. semordnilapsがない場合、出力は空の文字列、0、FALSE、または結果がなかったことを示す他のものでなければなりません。結果がなくても、関数は機能する必要があります。

これはコードゴルフなので、バイト単位の最短コードが勝ちです!


リーダーボード

この投稿の下部にあるスタックスニペットは、a)言語ごとの最短ソリューションのリストとして、b)全体的なリーダーボードとして、回答からカタログを生成します。

回答が表示されるようにするには、次のマークダウンテンプレートを使用して、見出しから回答を開始してください。

## Language Name, N bytes

N提出物のサイズはどこですか。スコアを改善する場合、古いスコアを打つことで見出しに残すことができます。例えば:

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

ヘッダーに複数の数字を含める場合(たとえば、スコアが2つのファイルの合計であるか、インタープリターフラグペナルティーを個別にリストする場合)、実際のスコアがヘッダーの最後の数字であることを確認します。

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

言語名をリンクにして、スニペットに表示することもできます。

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



5
単数形とEmordnilap複数形は違いますSemordnilapか?;)
FryAmTheEggman 14

1
「回文はsemordnilapsではありません!」うわー、その文/箇条書きはこれ以上不明瞭ではありませんでしたが、今私はあなたが何を意味するかを見ます。逆になったときにそれ自体である単語は、semordnilapではありません。

回答:


10

Pyth、23(18コード、5必要なSTDIN)

J'f&qlTQ&}_TJ>_TTJ

これはかなり簡単なソリューションです。

J単語のリストを保存します。次にf J、入力である単語の長さ(qlTQ)、リストに含まれる逆の単語(}_TJ)、および単語よりも大きい単語の反転()で単語のリスト()をフィルタリングし>_TTます。最後の条件Tは、パリンドロームではなく、ペアの1つだけが出力されることを保証します。結果のリストが印刷されます。

Pythが機能する方法、ファイルを開く唯一の方法は、STDINでその名前を受け取ることです。これがw.txt、スコアでSTDINバイトのうち5バイトをカウントした理由です。

実行例:

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

10

ルビー、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

bashの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"をエコーするだけで、余分な並べ替えやテールを気にする必要はありません。その場合、結果はすでにソートされているはずなので、最終ソートも削除できます。
オリオン

従わない あなたのアプローチで重複排除を行うにはどうすればよいですか?
アーロンデイヴィス

また、パリンドロームを取り除くのを完全に忘れていました。一定。
アーロンデイヴィス

申し訳ありませんが、睡眠不足...あなたは確かにそれらのうちの1つだけを保持するために逆と比較する必要がありますが、パリンドロームを気にする必要はなく、私のコメントの残りはまだ有効です。そして、あなたがそれについて言及した今、bashには文字列比較演算子がありますので、&&[[ $w > $(rev<<<$w) ]]&& echo $wまだ避けていsort|tail -1ます そのことを、私はそれが回文を除去するので、あなたも、最終ソートとユニークをドロップすることができると思う言葉だけの1を出力します。
オリオン

また、最初の役に立たない猫<(sort w.txt)は大丈夫です。
オリオン

4

パイソン、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

@FryAmTheEggman:実際に割り当てるには11文字k(定義に9 文字、改行に1文字、スペースに1文字)かかりますが、10文字しか保存しません([::-1]6に取り出して1つ追加するとスペースが必要になります)。set私は必要Jノーデュープルールを満たすためにそれから使用されている単語を削除するために設定する
クラウディウ

に切り替えるとN==len(c)and、スペースが節約されます。
isaacg 14

@isaacg:あ、はい、ty
Claudiu 14

あなたが短い=-する必要があります==
isaacg 14

3

CJam、48 47 45 42 38バイト

URLをカウントする必要があるため、Optimizerと同じURL短縮サービスを使用しています。

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

§拡張ASCIIの一部であるので、コードの各文字は単一バイトで符号化することができます。

オプティマイザーの場合と同様に、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は常にゴルフコンテストに参加します。
ロドルフォディアス14

私はFiles.readAllLines(Paths.get("w.txt"))前に見たことがありません。これは便利なトリックです。
Ypnypn 14

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

@FUZxxlこれは自己編集可能です..
オプティマイザー

私は警察官ではありません。人々はつづりについて異なる意見を持っています。あなたの意見を尊重します。Javaの頭字語であるかのようにスペルしないことをお勧めします。Javaに別のスペルを強制したくありません。
FUZxxl

@FUZxxl私は本当に半ばしない:D
オプティマイザー

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

ルビー、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}

説明

  • 入力は、ラムダへの引数として取得されます。期待してい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として処理したりする場合があります。それ以外の場合、インポートはファイルの内容を文字列に読み取ります。インポートは、テストデータに対して後者を行いました。

テスト


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
これはあまりゴルフではないようです。これは、スタックオーバーフローに関する良い答えです(コメントや説明があれば)。
スチューウィーグリフィン14

1
同意して、これはこれをbashで解決する最初の繰り返しでした。できるだけ読みやすくするのに疲れました。しかし、ゴルフに関しては。私がパー3で9を撃ったようなものです
ブライアン14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.