Tìm Semordnilaps


21

Semordnilaps (còn được gọi là heteropalindromes, semi-palindromes, nửa palindromes, Reversegrams, mynoretehs, đảo ngược đảo ngược, đảo ngược từ, hoặc anadromes) là những từ cũng là từ khi được đánh vần ngược. Một vài ví dụ là:

  • Phường <=> Vẽ
  • Khai thác <=> denim
  • Bộ phận <=> Dây đeo

Cho một số nguyên dương N (thông qua đối số chức năng hoặc STDIN), trả về / xuất ra một danh sách các semordnilaps từ danh sách các từ tiếng Anh này , có chính xác N chữ cái. Danh sách các từ có thể được lưu cục bộ trên máy tính của bạn dưới dạng tệp văn bản có tên : w.txt. Bạn cũng có thể lấy danh sách từ url, nhưng nó sẽ được bao gồm trong số byte.

Quy tắc:

  1. Palindromes không phải là semordnilaps! Do đó, các từ "buổi trưa", "rôto" và "radar" không nên được đưa vào danh sách.
  2. Chỉ một trong những từ (trong một cặp semordnilap) nên được đưa vào danh sách. Do đó, nếu "chó" có trong danh sách, "thần" không nên (không bao gồm cái nào được bao gồm.)
  3. Nếu không có semordnilaps, đầu ra phải là một chuỗi rỗng, 0, FALSE hoặc một cái gì đó khác chỉ ra rằng không có kết quả. Chức năng phải hoạt động ngay cả khi không có kết quả.

Đây là mã golf nên mã ngắn nhất tính bằng byte sẽ thắng!


Bảng xếp hạng

Đoạn trích Stack ở cuối bài đăng này tạo ra danh mục từ các câu trả lời a) dưới dạng danh sách các giải pháp ngắn nhất cho mỗi ngôn ngữ và b) dưới dạng bảng xếp hạng tổng thể.

Để đảm bảo rằng câu trả lời của bạn hiển thị, vui lòng bắt đầu câu trả lời của bạn bằng một tiêu đề, sử dụng mẫu Markdown sau:

## Language Name, N bytes

nơi Nlà kích thước của trình của bạn. Nếu bạn cải thiện điểm số của mình, bạn có thể giữ điểm số cũ trong tiêu đề, bằng cách đánh bại chúng thông qua. Ví dụ:

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

Nếu bạn muốn bao gồm nhiều số trong tiêu đề của mình (ví dụ: vì điểm của bạn là tổng của hai tệp hoặc bạn muốn liệt kê riêng các hình phạt cờ của thông dịch viên), hãy đảm bảo rằng điểm thực tế là số cuối cùng trong tiêu đề:

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

Bạn cũng có thể đặt tên ngôn ngữ thành liên kết sau đó sẽ hiển thị trong đoạn trích:

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



5
Không nên là số ít Emordnilapvà số nhiều Semordnilap? ;)
FryAmTheEggman

1
"Palindromes không phải là semordnilaps!" Wow, câu / viên đạn đó không thể rõ ràng hơn, nhưng bây giờ tôi hiểu ý của bạn. Những từ mà chính chúng khi bị đảo ngược không phải là semordnilaps.
mèo

Câu trả lời:


10

Pyth , 23 (18 mã, 5 STDIN cần thiết)

J'f&qlTQ&}_TJ>_TTJ

Đây là một giải pháp khá đơn giản.

Jlưu trữ danh sách các từ. Sau đó, chúng tôi lọc qua danh sách các từ ( f J) trên độ dài của từ là đầu vào ( qlTQ), từ đảo ngược nằm trong danh sách ( }_TJ) và độ đảo ngược của từ lớn hơn từ ( >_TT). Điều kiện cuối cùng đảm bảo Tkhông bị palindromic và chỉ một trong số các cặp được in. Danh sách kết quả được in.

Cách Pyth hoạt động, cách duy nhất để mở tệp là nhận tên của nó trên STDIN. Đây là lý do tại sao tôi đã đếm 5 byte STDIN w.txt, trong số điểm của tôi.

Chạy ví dụ:

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

10

Ruby, 74 byte

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

Lặp lại danh sách bằng cách loại bỏ các yếu tố, giúp tránh cả hai palindromes và xuất ra cả "nhấn mạnh" và "món tráng miệng". Sử dụng cùng một tên biến cho hàm và iterator sẽ xoay quanh một cú pháp cú pháp Ruby: mặc dù f=i.popđược đánh giá trước đó f.reverse, dòng sẽ không phân tích trừ khi fđã có nghĩa gì đó. Tôi cũng có thể sử dụng p.


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

Đây không phải là một mục nghiêm túc, mà là để đáp lại câu trả lời của Brian . Đây là cách tôi có xu hướng nghĩ về việc lập trình loại điều này trong Bash - bằng cách sử dụng chính Bash càng ít càng tốt và để các công cụ tích hợp làm tất cả công việc.


Dù sao thì bạn cũng sẽ nhận được cả từ và phản ánh từ comm, bạn chỉ có thể lặp lại "$ w" và không bận tâm với việc sắp xếp thêm và đuôi. Nếu bạn làm điều đó, kết quả sẽ được sắp xếp, vì vậy loại cuối cùng cũng có thể được loại bỏ.
orion

Tôi không làm theo. Làm thế nào để tôi thực hiện các khoản khấu trừ trong cách tiếp cận của bạn?
Aaron Davies

Ngoài ra, tôi hoàn toàn quên loại bỏ các palindromes. Đã sửa.
Aaron Davies

Xin lỗi, thiếu ngủ ... bạn thực sự cần phải so sánh với điều ngược lại để chỉ giữ một trong số họ, nhưng bạn không cần phải quan tâm đến palindromes và những bình luận còn lại của tôi vẫn còn hiệu lực. Và bây giờ bạn đề cập đến nó, bash có một toán tử so sánh chuỗi, vì vậy &&[[ $w > $(rev<<<$w) ]]&& echo $wvẫn tránh được sort|tail -1. Với điều đó, tôi nghĩ rằng bạn thậm chí có thể loại bỏ loại cuối cùng và duy nhất, bởi vì nó loại bỏ các palindromes chỉ xuất ra một trong các từ.
orion

Ngoài ra, một con mèo vô dụng lúc ban đầu: <(sort w.txt)là ok.
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)

Giải pháp khá đơn giản.


Nó dường như ngắn hơn để xác định k=c[::-1]. Ngoài ra, bạn không thể set()chỉ gọi lần thứ hai? Tôi không nghĩ có sự lặp lại trong tập tin?
FryAmTheEggman

@FryAmTheEggman: Trên thực tế, sẽ mất 11 ký tự để gán k(9 cho định nghĩa cộng 1 cho dòng mới cộng 1 cho không gian), nhưng tôi sẽ chỉ lưu 10 ký tự (lấy ra [::-1]6 nhưng thêm 1 vì sau đó tôi cần một khoảng trắng). Về set, tôi cần Jphải là một tập hợp vì tôi loại bỏ các từ đã sử dụng khỏi nó để đáp ứng quy tắc không lừa đảo
Claudiu

chuyển sang N==len(c)andtiết kiệm một không gian.
isaacg

@isaacg: À đúng rồi, ty
Claudiu

Bạn đang thiếu một =- nên được ==.
isaacg

3

CJam, 48 47 45 42 38 byte

Vì URL phải được tính, tôi đang sử dụng cùng một trình rút ngắn URL với Trình tối ưu hóa.

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

Phần §này là một phần của ASCII mở rộng, vì vậy mỗi ký tự trong mã có thể được mã hóa theo một byte đơn.

Như trong trường hợp của Trình tối ưu hóa, bạn sẽ phải sử dụng trình thông dịch Java và chạy tệp này cục bộ từ một tệp, nói semordnilap.cjamvà sau đó

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

vì vậy đầu vào được đưa ra dưới dạng đối số dòng lệnh.

Cách thức hoạt động (hơi lỗi thời):

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

Chuỗi kết quả được tự động in vào cuối chương trình.


3

Java, 280 218 byte

So với phần còn lại của cuộc thi, tôi hoàn toàn không biết đây có phải là một điểm số tốt hay không.

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

Mở rộng:

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

Sử dụng so sánh () để đồng thời bỏ qua palindromes và trùng lặp.


2
Java sẽ luôn thổi trong một cuộc thi golf.
Rodolfo Dias

Tôi chưa từng thấy Files.readAllLines(Paths.get("w.txt"))trước đây. Đó là một mẹo hữu ích.
Ypnypn

2

CJam, 68 byte

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

Bạn sẽ phải tải xuống phiên bản Java của trình biên dịch từ đây và lưu mã ở trên vào một tệp có tên words.cjam (có thể là bất kỳ tên nào). Sau đó chạy mã như

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

Ví dụ, đối N = 8,

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

Java, đó không phải là từ viết tắt. Xin đừng đánh vần nó JAVA.
FUZxxl

@FUZxxl phần lớn này có thể tự chỉnh sửa ..
Trình tối ưu hóa

Tôi không phải là cảnh sát. Mọi người có ý kiến ​​khác nhau về chính tả và tôi tôn trọng ý kiến ​​của bạn. Tôi chỉ đề nghị bạn không đánh vần Java như thể đó là từ viết tắt, tôi không muốn buộc một câu thần chú khác với bạn.
FUZxxl

@FUZxxl Tôi thực sự không ở giữa: D
Trình tối ưu hóa

2

Node.js, 172 byte

Chức năng:

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

Kiểm tra:

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 byte

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

Khá đơn giản. Đọc danh sách, xây dựng danh sách ngược, lấy giao điểm của chúng, lọc ra các palindromes, lọc theo số lượng yêu cầu, sắp xếp và khấu trừ các cặp.


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}

Giải trình

  • Đầu vào được lấy làm đối số cho lambda. Nó mong đợi một Integer.
  • Đọc tệp vào bộ nhớ dưới dạng String( a).
  • Vòng lặp máng một Arraytrong tất cả các từ (không có dòng mới).
    • Xóa từ khỏi a.
    • Thêm từ đủ điều kiện vào Array l.
  • Quay trở lại l.

Một khoảng trống Arrayđược trả về khi không tìm thấy từ nào đủ điều kiện.


1

Node.js, CoffeeScript, 132 byte

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 byte

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

Bảng điều khiển Chrome Dev Tools, 111 byte (Trên trang tải xuống)

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

Tất cả các phiên bản trả về một mảng của tất cả các Semordnilaps có độ dài n.

Node.js, 162 byte

In tất cả các 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

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

Điều này thực sự sẽ làm việc ...


1

Toán học, 105 byte

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

Đôi khi, Nhập sẽ tự động chia văn bản thành danh sách các dòng hoặc coi nó là CSV hoặc TSV. Vào thời điểm khác, Nhập sẽ đọc nội dung của tệp thành một chuỗi. Nhập đã làm sau cho dữ liệu thử nghiệm.

kiểm tra


0

BASH

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
}

kiểm tra ...

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
Tôi đoán điều này không phải là rất golf ..? Đây sẽ là một câu trả lời hay trên Stack Overflow (nếu nó có một số bình luận và giải thích).
Stewie Griffin

1
Đồng ý, đây là lần lặp đầu tiên của tôi trong việc giải quyết điều này trong bash. Tôi mệt mỏi để làm cho nó dễ đọc nhất có thể. nhưng xa như golf đi. giống như tôi đã bắn 9 trên par 3: -)
Brian
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.