Temukan Semordnilaps

21

Semordnilaps (juga dikenal sebagai heteropalindrom, semi-palindrom, half-palindrom, reversgram, mynoretehs, anagram reversibel, pembalikan kata, atau anadrom) adalah kata-kata yang juga kata-kata ketika dieja terbalik. Beberapa contoh adalah:

  • Ward <=> Draw
  • Menambang <=> Denim
  • Bagian <=> Tali

Dengan bilangan bulat positif N (melalui argumen fungsi atau STDIN), kembalikan / keluarkan daftar semordnilaps dari daftar kata-kata bahasa Inggris ini , yang memiliki huruf N persis. Daftar kata-kata dapat disimpan secara lokal pada komputer Anda sebagai file teks yang disebut: w.txt. Anda juga bisa mendapatkan daftar dari url, tetapi akan dimasukkan dalam jumlah byte.

Aturan:

  1. Palindrom bukan semordnilaps! Karena itu, kata "siang", "rotor" dan "radar" tidak boleh dimasukkan dalam daftar.
  2. Hanya satu kata (dalam pasangan semordnilap) yang harus dimasukkan dalam daftar. Karena itu, jika "anjing" ada dalam daftar, "tuhan" tidak boleh (tidak peduli yang mana yang termasuk.)
  3. Jika tidak ada semordnilaps, output harus berupa string kosong, 0, FALSE atau sesuatu yang menunjukkan bahwa tidak ada hasil. Fungsi tersebut harus berfungsi bahkan jika tidak ada hasil.

Ini adalah kode golf sehingga kode terpendek dalam byte menang!


Papan peringkat

Cuplikan Stack di bagian bawah posting ini menghasilkan katalog dari jawaban a) sebagai daftar solusi terpendek per bahasa dan b) sebagai leaderboard keseluruhan.

Untuk memastikan bahwa jawaban Anda muncul, silakan mulai jawaban Anda dengan tajuk utama, menggunakan templat Penurunan harga berikut:

## Language Name, N bytes

di mana Nukuran kiriman Anda. Jika Anda meningkatkan skor Anda, Anda bisa menyimpan skor lama di headline, dengan mencoretnya. Contohnya:

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

Jika Anda ingin memasukkan beberapa angka dalam tajuk Anda (mis. Karena skor Anda adalah jumlah dari dua file atau Anda ingin membuat daftar hukuman penterjemah secara terpisah), pastikan bahwa skor sebenarnya adalah angka terakhir di tajuk:

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

Anda juga dapat membuat nama bahasa menjadi tautan yang kemudian akan muncul di cuplikan:

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

Stewie Griffin
sumber
5
Bukankah seharusnya bentuk tunggal Emordnilapdan bentuk jamak menjadi Semordnilap? ;)
FryAmTheEggman
1
"Palindrom bukan semordnilaps!" Wow, kalimat / peluru itu tidak bisa lebih jelas, tapi sekarang saya mengerti maksud Anda. Kata-kata yang dengan sendirinya terbalik tidak semordnilaps.
kucing

Jawaban:

10

Pyth , 23 (18 kode, 5 STDIN diperlukan)

J'f&qlTQ&}_TJ>_TTJ

Ini adalah solusi yang cukup mudah.

Jmenyimpan daftar kata. Kemudian kami memfilter daftar kata ( f J) pada panjang kata menjadi input ( qlTQ), kata terbalik berada di daftar ( }_TJ), dan pembalikan kata menjadi lebih besar dari kata ( >_TT). Kondisi terakhir memastikan Ttidak palindromik, dan hanya satu dari pasangan yang dicetak. Daftar yang dihasilkan dicetak.

Cara Pyth bekerja, satu-satunya cara untuk membuka file adalah dengan menerima namanya di STDIN. Inilah sebabnya saya menghitung 5 dari byte STDIN w.txt,, dalam skor saya.

Contoh dijalankan:

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

Ruby, 74 byte

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

Iterasi daftar dengan menghapus elemen, yang menghindari kedua palindrom dan mengeluarkan "stres" dan "makanan penutup". Menggunakan nama variabel yang sama untuk fungsi dan iterator menyiasati quirk sintaksis Ruby: meskipun f=i.popdievaluasi sebelumnya f.reverse, baris tidak akan diuraikan kecuali fsudah berarti sesuatu. Saya juga bisa menggunakan p.

histokrat
sumber
4

bash 134 157 118 byte

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

Ini bukan entri serius, tetapi sebagai tanggapan atas jawaban Brian Bash . Ini adalah bagaimana saya cenderung berpikir tentang pemrograman hal semacam ini di Bash - dengan menggunakan Bash sendiri sesedikit mungkin, dan membiarkan alat bawaan melakukan semua pekerjaan.

Aaron Davies
sumber
Anda akan mendapatkan kata dan refleksinya dari comm, Anda hanya bisa menggemakan "$ w" dan tidak repot-repot dengan tambahan jenis dan ekor. Jika Anda melakukannya, hasilnya harus sudah disortir, jadi pengurutan akhir juga dapat dihapus.
orion
Saya tidak mengikuti. Bagaimana saya melakukan dedupe dalam pendekatan Anda?
Aaron Davies
Juga, saya benar-benar lupa untuk menghapus palindrom. Tetap.
Aaron Davies
Maaf, kurang tidur ... Anda memang perlu membandingkan dengan yang terbalik untuk mempertahankan hanya satu dari mereka, tetapi Anda tidak perlu peduli dengan palindrom dan sisa komentar saya masih valid. Dan sekarang Anda menyebutkannya, bash memiliki operator pembanding string, jadi &&[[ $w > $(rev<<<$w) ]]&& echo $wtetap hindari sort|tail -1. Dengan itu, saya pikir Anda bahkan dapat menjatuhkan jenis terakhir dan unik, karena menghilangkan palindrom dan hanya menghasilkan salah satu kata.
orion
Juga, kucing yang tidak berguna di awal: <(sort w.txt)tidak apa-apa.
orion
4

Python, 126 125 120 byte

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)

Solusi yang sangat mudah.

Claudiu
sumber
Tampaknya lebih pendek untuk didefinisikan k=c[::-1]. Juga, tidak bisakah Anda menelepon set()hanya untuk kedua kalinya? Saya tidak berpikir ada pengulangan dalam file?
FryAmTheEggman
@FryAmTheEggman: Sebenarnya ini akan membutuhkan 11 karakter untuk ditetapkan k(9 untuk definisi ditambah 1 untuk baris baru ditambah 1 untuk ruang), tapi saya hanya akan menyimpan 10 karakter (ambil [::-1]untuk 6 tetapi tambahkan 1 karena saya kemudian butuh spasi). Tentang itu set, saya perlu Jmenjadi satu set karena saya menghapus kata-kata yang digunakan dari itu untuk memenuhi aturan no-dupe
Claudiu
beralih untuk N==len(c)andmenghemat ruang.
isaacg
@isaacg: Ah ya, ty
Claudiu
Anda pendek =- seharusnya ==.
isaacg
3

CJam, 48 47 45 42 38 byte

Karena URL harus dihitung, saya menggunakan pemendek URL yang sama dengan Pengoptimal.

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

Ini §adalah bagian dari ASCII yang diperluas, sehingga setiap karakter dalam kode dapat dikodekan dalam satu byte.

Seperti dalam kasus Optimizer, Anda harus menggunakan penerjemah Java dan menjalankan ini secara lokal dari file, katakan semordnilap.cjam, lalu

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

jadi input diberikan sebagai argumen baris perintah.

Cara kerjanya (agak ketinggalan jaman):

"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.";

String yang dihasilkan secara otomatis dicetak pada akhir program.

Martin Ender
sumber
3

Jawa, 280 218 byte

Dibandingkan dengan sisa kompetisi, saya sama sekali tidak tahu apakah ini skor yang bagus.

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);}}}

Diperluas:

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);
        }
    }
}

Menggunakan compareTo () untuk secara bersamaan mengabaikan palindrom dan duplikat.

Regangkan Maniac
sumber
2
Jawa akan selalu berhembus dalam kontes golf.
Rodolfo Dias
Saya belum pernah melihat Files.readAllLines(Paths.get("w.txt"))sebelumnya. Itu trik yang berguna.
Ypnypn
2

CJam, 68 byte

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

Anda harus mengunduh versi Java dari kompiler dari sini dan menyimpan kode di atas dalam file bernama words.cjam (bisa berupa nama apa saja). Kemudian jalankan kodenya seperti

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

Misalnya, untuk N = 8,

java -jar cjam-0.6.2.jar words.cjam 8 > out.txt  
Pengoptimal
sumber
Java – itu bukan akronim. Tolong jangan mengejanya JAWA.
FUZxxl
@FUZxxl sebanyak ini dapat diedit sendiri ..
Pengoptimal
Saya bukan petugas polisi. Orang-orang memiliki pendapat berbeda tentang ejaan dan saya menghargai pendapat Anda. Saya hanya menyarankan Anda untuk tidak mengeja Jawa seolah itu akronim, saya tidak ingin memaksakan mantra yang berbeda pada Anda.
FUZxxl
@FUZxxl Saya benar-benar tidak pertengahan: D
Pengoptimal
2

Node.js, 172 byte

Fungsi:

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"))}

Pengujian:

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

K, 59 byte

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

Cukup mudah. Baca daftar, buat daftar terbalik, ambil persimpangannya, saring palindrom, saring dalam hitungan yang diperlukan, urutkan dan potong pasangan.

Aaron Davies
sumber
2

Ruby, 95 byte

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

Penjelasan

  • Masukan diambil sebagai argumen ke lambda. Itu mengharapkanInteger .
  • Baca file ke dalam memori sebagai String(a ).
  • Loop melalui Array semua kata (tanpa baris baru).
    • Hapus kata dari a .
    • Tambahkan kata yang memenuhi syarat ke Array l.
  • Kembali l.

Kosong Arraydikembalikan ketika kata-kata yang memenuhi syarat tidak ditemukan.

britishtea
sumber
1

Node.js, CoffeeScript, 132 Bytes

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 Bytes

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})}

Konsol Alat Dev Chrome, 111 Bytes (Di halaman unduhan)

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

Semua versi mengembalikan array dengan panjang Semordnilaps n .

Node.js, 162 Bytes

Mencetak semua 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)})}
cPu1
sumber
1

Julia, 101 byte

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

Ini seharusnya bekerja ...

eaglgenes101
sumber
1

Mathematica, 105 byte

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

Terkadang Impor akan secara otomatis membagi teks menjadi daftar daftar baris, atau memperlakukannya sebagai CSV atau TSV. Di lain waktu, Impor akan membaca konten file menjadi string. Impor melakukan yang terakhir untuk data pengujian.

tes

Ming-Tang
sumber
0

PESTA

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
}

menguji ...

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
Brian
sumber
2
Saya kira ini tidak terlalu golf ..? Ini akan menjadi jawaban yang bagus di Stack Overflow (jika ada beberapa komentar dan penjelasan).
Stewie Griffin
1
Setuju, ini adalah iterasi pertama saya dalam menyelesaikan masalah ini di bash. Saya lelah membuatnya dibaca sebagai mungkin. tapi sejauh golf. itu lebih seperti saya menembak angka 9 pada par 3: -)
Brian