Semordnilaps'ı bulun


21

Semordnilaps (heteropalindromlar, yarı-palindromlar, yarım-palindromlar, reversgramlar, mynoretehler, tersinir anagramlar, kelime tersleri veya anadromlar olarak da bilinir), geriye doğru yazıldıklarında da kelimelerdir. Birkaç örnek:

  • Ward <=> Beraberlik
  • Mayınlı <=> Denim
  • Parçalar <=> Kayış

Pozitif bir tamsayı N verildiğinde (işlev bağımsız değişkeni veya STDIN aracılığıyla), bu İngilizce sözcük listesinden tam olarak N harfine sahip bir semordnilaps listesi döndürün / çıktı alın . Bir metin dosyası dediği gibi kelimelerin listesini bilgisayarınızda yerel kaydedilebilir: w.txt. Listeyi url'den de alabilirsiniz, ancak bayt sayısına dahil edilecektir.

Kurallar:

  1. Palindromlar semordnilaps değildir! Bu nedenle, "öğlen", "rotor" ve "radar" kelimeleri listeye dahil edilmemelidir.
  2. Listeden yalnızca bir kelime (bir semordnilap çiftinde) dahil edilmelidir. Bu nedenle, eğer "köpek" listede varsa, "tanrı" olmamalıdır (hangisinin dahil olduğu önemli değildir.)
  3. Hiçbir semordnilaps yoksa, çıktı boş bir dize, 0, FALSE veya sonuç olmadığını gösteren başka bir şey olmalıdır. Sonuç olmasa bile fonksiyonun çalışması gerekir.

Bu kod golf yani bayt kısa kod kazanır!


Liderler Sıralaması

Bu yazının altındaki Yığın Parçacığı, a) her dil için en kısa çözüm listesi ve b) genel bir lider panosu olarak cevaplardan katalog oluşturur.

Yanıtınızın göründüğünden emin olmak için lütfen aşağıdaki Markdown şablonunu kullanarak yanıtınızı bir başlıkla başlatın:

## Language Name, N bytes

Ngönderiminizin büyüklüğü nerede . Puanınızı artırmak varsa, olabilir onları içinden vurarak, başlığa eski hesapları tutmak. Örneğin:

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

Başlığınıza birden fazla sayı eklemek istiyorsanız (örneğin, puanınız iki dosyanın toplamı olduğu veya yorumlayıcı bayrak cezalarını ayrı olarak listelemek istediğiniz için), gerçek puanın başlıktaki son sayı olduğundan emin olun :

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

Dil adını snippet'te görünecek bir bağlantı da yapabilirsiniz:

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



5
Tekil Emordnilapve çoğul olmamalı Semordnilapmı? ;)
FryAmTheEggman

1
İnternethaber.com "Palindromlar semordnilaps değil!" Vay canına, o cümle / kurşun daha net olamazdı, ama şimdi ne demek istediğini anlıyorum. Ters çevrildiğinde kendileri olan kelimeler semordnilaps değildir.
kedi

Yanıtlar:


10

Pyth , 23 (18 kod, 5 gerekli STDIN)

J'f&qlTQ&}_TJ>_TTJ

Bu oldukça basit bir çözümdür.

Jkelime listesini saklar. Ardından f J, giriş ( qlTQ) kelimesinin uzunluğuna , ters çevrilmiş sözcük listede ( }_TJ) ve sözcüğün ters çevrilmesinden ( ) sözcüğünden daha büyük olan kelimelerin ( ) listesine filtre uygularız >_TT. Son koşul Tpalindromik değildir ve çiftten sadece birinin basılmasını sağlar. Ortaya çıkan liste yazdırılır.

Pyth'in çalışma şekli, bir dosyayı açmanın tek yolu STDIN'de adını almaktır. Bu yüzden skorumda STDIN baytlarının 5'ini saydım w.txt.

Örnek çalışma:

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

10

Yakut, 74 bayt

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

Hem palindromları önleyen hem de "stresli" ve "tatlılar" çıktıları veren elemanları kaldırarak liste üzerinde yinelenir. İşlev ve yineleyici için aynı değişken adını kullanmak bir Ruby sözdizimi tuhaflığına dönüşür: daha f=i.popönce değerlendirilmiş olsa da , zaten bir şey ifade f.reverseetmedikçe satır ayrıştırılmaz f. Ben de kullanabilirsiniz p.


4

bash 134 157 118 bayt

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

Bu ciddi bir giriş değil, Brian'ın Bash cevabına yanıt olarak . Bash'te bu tür şeyleri programlamayı düşünmeye eğilimliyim - Bash'i mümkün olduğunca az kullanarak ve yerleşik araçların tüm işi yapmasına izin veriyorum.


Her iki kelime ve onun yansıması zaten comm alacak, sadece "$ w" yankı ve ekstra sıralama ve kuyruk ile rahatsız etmeyin. Bunu yaparsanız, sonuç zaten sıralanmalıdır, böylece son sıralama da kaldırılabilir.
orion

Takip etmiyorum. Tekilleştirme yaklaşımınızda nasıl yapılır?
Aaron Davies

Ayrıca palindromları çıkarmayı tamamen unuttum. Sabit.
Aaron Davies

Üzgünüm, uyku yoksunluğu ... gerçekten sadece birini tutmak için tersi ile karşılaştırmanız gerekiyor, ancak palindromları önemsemek zorunda değilsiniz ve yorumların geri kalanı hala geçerli. Ve şimdi bahsettiğinize göre, bash'ın bir dize karşılaştırma operatörü var, bu yüzden &&[[ $w > $(rev<<<$w) ]]&& echo $wyine de kaçınıyor sort|tail -1. Bununla birlikte, son türü ve benzersiz olanı bile düşürebileceğinizi düşünüyorum, çünkü palindromları kaldırır ve sadece kelimelerden birini çıkarır .
orion

Ayrıca, başlangıçta işe yaramaz bir kedi: <(sort w.txt)tamam.
orion

4

Piton, 126 125 , 120 bayt

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)

Oldukça basit bir çözüm.


Tanımlanması daha kısa gibi görünüyor k=c[::-1]. Ayrıca, set()sadece ikinci kez arayamadınız mı? Dosyada tekrarlar olduğunu sanmıyorum?
FryAmTheEggman

@FryAmTheEggman: Aslında atamak için 11 karakter gerekir k(tanım için 9 artı newline için 1 artı boşluk için 1), ama sadece 10 karakter kaydederdim (6 için çıkar [::-1]ama 1 ekleyin çünkü daha sonra bir boşluğa ihtiyacım var). Hakkında, küme setolmam gerekiyor Jçünkü dupe olmayan kuralı karşılamak için kullanılan kelimeleri ondan kaldırıyorum
Claudiu

geçiş N==len(c)andbir yer kazandırır.
isaacg

@isaacg: Ah evet, ty
Claudiu

Sen kısasın =- olmalı ==.
isaacg

3

CJam, 48 47 45 42 38 bayt

URL'nin sayılması gerektiğinden, Optimize Edici ile aynı URL kısaltmasını kullanıyorum.

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

§Genişletilmiş ASCII bir parçası, bu nedenle kod her karakter tek bir bayt kodlanabilir.

Doktoru durumunda olduğu gibi, kullanmak gerekecek Java tercüman ve diyelim ki, bir dosyadan yerel bu çalıştırın semordnilap.cjamsonra ve

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

böylece girdi bir komut satırı argümanı olarak verilir.

Nasıl çalışır (biraz modası geçmiş):

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

Ortaya çıkan dize, programın sonunda otomatik olarak yazdırılır.


3

Java, 280 218 bayt

Rekabetin geri kalanıyla karşılaştırıldığında, bunun iyi bir puan olup olmadığı konusunda hiçbir fikrim yok.

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

Expanded:

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

Palindromları ve yinelenenleri aynı anda yoksaymak için comparTo () işlevini kullanır.


2
Java her zaman bir golf yarışmasında patlar.
Rodolfo Dias

Daha önce hiç görmedim Files.readAllLines(Paths.get("w.txt")). Bu yararlı bir numara.
Ypnypn

2

CJam, 68 bayt

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

Derleyicinin Java sürümünü buradan indirmeniz ve yukarıdaki kodu words.cjam (herhangi bir ad olabilir) adlı bir dosyaya kaydetmeniz gerekir. Sonra kodu aşağıdaki gibi çalıştırın

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

Örneğin N = 8,

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

Java - bu bir kısaltma değildir. Lütfen JAVA'yı hecelemeyin.
FUZxxl

@FUZxxl bu kadar kendi kendine düzenlenebilir ..
Optimizer

Ben bir polis memuru değilim. İnsanların yazım hakkında farklı görüşleri vardır ve ben senin fikrine saygı duyuyorum. Sadece Java'yı bir kısaltma gibi yazmamanızı öneririm, size farklı bir yazım zorlamak istemiyorum.
FUZxxl

@FUZxxl Gerçekten ortalamam: D
Optimizer

2

Node.js, 172 bayt

İşlev:

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

Test yapmak:

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 bayt

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

Oldukça açık. Listeyi okuyun, ters listeyi oluşturun, kavşaklarını alın, palindromları filtreleyin, gerekli sayımda filtreleyin, çiftleri sıralayın ve tekilleştirin.


2

Ruby, 95 bayt

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

açıklama

  • Girdi bir lambda'ya argüman olarak alınır. Bekleyen bir Integer.
  • Dosyayı belleğe String( a) olarak okuyun .
  • ArrayTüm kelimelerin bir döngüsü (satırsonu olmadan).
    • Kelimeyi şuradan kaldırın a.
    • Öğesine niteleyici kelimeler ekleyin Array l.
  • Dönüş l.

ArrayNitelikli kelime bulunamadığında boş bir değer döndürülür.


1

Node.js, CoffeeScript, 132 Bayt

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 Bayt

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 Geliştirme Araçları Konsolu, 111 Bayt (İndirme sayfasında)

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

Tüm sürümler, tüm Semordnilaps uzunluk dizisini döndürür n.

Node.js, 162 Bayt

Tüm semordnilapsları yazdırır:

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 bayt

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

Bu gerçekten işe yaramalı ...


1

Mathematica, 105 bayt

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

Bazen İçe Aktar, metni otomatik olarak satır listesi listesine böler veya CSV veya TSV olarak ele alır. Diğer zamanlarda, İçe Aktar dosyanın içeriğini bir dizeye okur. İkincisi, test verileri için sonuncusunu yaptı.

testler


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
}

Testler ...

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
Bu çok golf değil sanırım ..? Bu, Stack Overflow (bazı yorum ve açıklamaları varsa) için güzel bir cevap olacaktır.
Stewie Griffin

1
Kabul ediyorum, bu bash'de bunu çözmedeki ilk yinelememdi. Mümkün olduğunca okunabilir hale getirmek için yoruldum. ama golf kadar. daha çok par 3'e bir 9
Brian
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.