Finde die Semordnilaps

21

Semordnilaps (auch bekannt als Heteropalindrome, Halbpalindrome, Halbpalindrome, Umkehrgramme, Mynorethe, reversible Anagramme, Wortumkehrungen oder Anadrome) sind Wörter, die auch Wörter sind, wenn sie rückwärts geschrieben werden. Einige Beispiele sind:

  • Ward <=> Draw
  • Abgebautes <=> Denim
  • Teile <=> Gurt

Bei einer positiven Ganzzahl N (über das Funktionsargument oder STDIN) wird eine Liste von Semordnilaps aus dieser Liste von englischen Wörtern mit genau N Buchstaben zurückgegeben / ausgegeben . Die Liste der Wörter kann lokal auf Ihrem Computer als Textdatei gespeichert werden w.txt. Sie können die Liste auch über die URL abrufen, sie wird jedoch in die Byteanzahl einbezogen.

Regeln:

  1. Palindrome sind keine Semordnilaps! Daher sollten die Wörter "Mittag", "Rotor" und "Radar" nicht in die Liste aufgenommen werden.
  2. Nur eines der Wörter (in einem Semordnilap-Paar) sollte in die Liste aufgenommen werden. Wenn also "Hund" in der Liste steht, sollte "Gott" nicht sein (es ist egal, welcher enthalten ist.)
  3. Wenn es keine Semordnilaps gibt, sollte die Ausgabe eine leere Zeichenfolge sein, 0, FALSE oder etwas anderes, was darauf hinweist, dass keine Ergebnisse vorliegen. Die Funktion muss auch dann funktionieren, wenn keine Ergebnisse vorliegen.

Das ist Code Golf, also gewinnt der kürzeste Code in Bytes!


Bestenliste

Das Stapel-Snippet am Ende dieses Beitrags generiert den Katalog aus den Antworten a) als Liste der kürzesten Lösungen pro Sprache und b) als Gesamt-Bestenliste.

Um sicherzustellen, dass Ihre Antwort angezeigt wird, beginnen Sie Ihre Antwort mit einer Überschrift. Verwenden Sie dazu die folgende Markdown-Vorlage:

## Language Name, N bytes

Wo Nist die Größe Ihres Beitrags? Wenn Sie Ihren Score zu verbessern, Sie können alte Rechnungen in der Überschrift halten, indem man sich durch das Anschlagen. Zum Beispiel:

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

Wenn Sie mehrere Zahlen in Ihre Kopfzeile aufnehmen möchten (z. B. weil Ihre Punktzahl die Summe von zwei Dateien ist oder wenn Sie die Strafen für Interpreter-Flags separat auflisten möchten), stellen Sie sicher, dass die tatsächliche Punktzahl die letzte Zahl in der Kopfzeile ist:

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

Sie können den Namen der Sprache auch als Link festlegen, der dann im Snippet angezeigt wird:

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

Stewie Griffin
quelle
5
Sollte nicht der Singular Emordnilapund der Plural sein Semordnilap? ;)
FryAmTheEggman
1
"Palindrome sind keine Semordnilaps!" Wow, dieser Satz / diese Kugel könnte nicht unklarer sein, aber jetzt verstehe ich, was du meinst. Wörter, die selbst umgekehrt sind, sind keine Semordnilaps.
Katze

Antworten:

10

Pyth , 23 (18 Code, 5 notwendige STDIN)

J'f&qlTQ&}_TJ>_TTJ

Dies ist eine ziemlich einfache Lösung.

Jspeichert die Liste der Wörter. Dann filtern wir über die Liste der Wörter ( f J) nach der Länge des Wortes, das die Eingabe ( qlTQ) ist, wobei das umgekehrte Wort in der Liste ( }_TJ) ist und die Umkehrung des Wortes größer als das Wort ( >_TT) ist. Die letzte Bedingung stellt sicher T, dass sie nicht palindrom ist und dass nur eines der Paare gedruckt wird. Die resultierende Liste wird gedruckt.

So wie Pyth funktioniert, ist der einzige Weg, eine Datei zu öffnen, den Namen auf STDIN zu erhalten. Aus diesem Grund habe ich 5 der STDIN-Bytes w.txtin meiner Punktzahl gezählt.

Beispiellauf:

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

Ruby, 74 Bytes

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

Durchläuft die Liste, indem Elemente entfernt werden, wodurch beide Palindrome vermieden werden und sowohl "gestresste" als auch "Desserts" ausgegeben werden. Die Verwendung des gleichen Variablennamens für die Funktion und des Iterators umgeht einen Ruby-Syntaxfehler: Auch wenn dies f=i.popzuvor ausgewertet wurde f.reverse, wird die Zeile erst dann analysiert, wenn sie fbereits etwas bedeutet. Ich könnte es auch gebrauchen p.

Histokrat
quelle
4

Bash 134 157 118 Bytes

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

Dies ist kein ernstzunehmender Eintrag, sondern eine Antwort auf die Antwort von Brian's Bash . Auf diese Weise neige ich dazu, solche Dinge in Bash zu programmieren - indem ich Bash so wenig wie möglich selbst verwende und die eingebauten Tools die ganze Arbeit erledigen lasse.

Aaron Davies
quelle
Sie werden sowieso das Wort und sein Spiegelbild von comm erhalten, Sie könnten einfach "$ w" wiedergeben und sich nicht um zusätzliche Sortierung und Tail kümmern. Wenn Sie dies tun, sollte das Ergebnis bereits sortiert sein, damit die endgültige Sortierung auch entfernt werden kann.
Orion
Ich folge nicht Wie mache ich die Deduplizierung in Ihrem Ansatz?
Aaron Davies
Außerdem habe ich völlig vergessen, die Palindrome zu entfernen. Fest.
Aaron Davies
Entschuldigung, Schlafentzug ... Sie müssen in der Tat mit der Rückseite vergleichen, um nur einen davon zu behalten, aber Sie müssen sich nicht um Palindrome kümmern, und der Rest meiner Kommentare ist immer noch gültig. Und jetzt, wo Sie es erwähnen, hat bash einen String-Vergleichsoperator, der es also &&[[ $w > $(rev<<<$w) ]]&& echo $wimmer noch vermeidet sort|tail -1. Ich denke, Sie können damit sogar die endgültige Sortierung und Einzigartigkeit aufheben, da sie Palindrome entfernt und nur eines der Wörter ausgibt.
Orion
Auch eine unnütze Katze am Anfang: <(sort w.txt)ist ok.
Orion
4

Python, 126 125 120 Bytes

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)

Ziemlich einfache Lösung.

Claudiu
quelle
Es scheint kürzer zu sein zu definieren k=c[::-1]. Könnten Sie nicht auch set()nur das zweite Mal anrufen ? Ich glaube nicht, dass die Datei Wiederholungen enthält.
FryAmTheEggman
@FryAmTheEggman: Eigentlich würde die Zuweisung 11 Zeichen dauern k(9 für Definition plus 1 für Zeilenvorschub plus 1 für Leerzeichen), aber ich würde nur 10 Zeichen speichern ( [::-1]für 6 herausnehmen, aber 1 hinzufügen, weil ich dann ein Leerzeichen brauche). Über die set, ich muss Jein Satz sein, weil ich die verwendeten Wörter daraus entfernen, um die No-Dupe-Regel zu erfüllen
Claudiu
Umschalten auf N==len(c)andspart Platz.
isaacg
@isaacg: Ah ja, ty
Claudiu
Sie sind klein =und sollten es sein ==.
isaacg
3

CJam, 48 47 45 42 38 Bytes

Da die URL gezählt werden muss, verwende ich denselben URL-Shortener wie das Optimierungsprogramm.

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

Das §ist Teil von Extended ASCII, so dass jedes Zeichen im Code in einem einzelnen Byte codiert werden kann.

Wie im Fall von Optimizer müssen Sie den Java-Interpreter verwenden und diesen lokal aus einer Datei ausführen semordnilap.cjam, zum Beispiel und dann

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

Daher wird die Eingabe als Befehlszeilenargument angegeben.

So funktioniert es (etwas veraltet):

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

Die resultierende Zeichenfolge wird am Ende des Programms automatisch gedruckt.

Martin Ender
quelle
3

Java, 280 218 Bytes

Im Vergleich zum Rest des Wettbewerbs habe ich absolut keine Ahnung, ob dies eine gute Punktzahl ist.

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

Erweitert:

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

Verwendet compareTo (), um Palindrome und Duplikate gleichzeitig zu ignorieren.

Stretch Maniac
quelle
2
Java wird immer in einem Golfwettbewerb blasen.
Rodolfo Dias
Ich habe noch nie gesehen Files.readAllLines(Paths.get("w.txt")). Das ist ein nützlicher Trick.
Ypnypn
2

CJam, 68 Bytes

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

Sie müssen die Java-Version des Compilers von hier herunterladen und den obigen Code in einer Datei namens words.cjam speichern (kann ein beliebiger Name sein). Dann führen Sie den Code wie folgt aus

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

Zum Beispiel für N = 8,

java -jar cjam-0.6.2.jar words.cjam 8 > out.txt  
Optimierer
quelle
Java - das ist kein Akronym. Bitte buchstabieren Sie es nicht JAVA.
FUZxxl
@FUZxxl so viel ist selbst bearbeitbar ..
Optimierer
Ich bin kein Polizist. Die Leute haben unterschiedliche Meinungen zur Rechtschreibung und ich respektiere Ihre Meinung. Ich schlage Ihnen lediglich vor, Java nicht so zu buchstabieren, als wäre es ein Akronym. Ich möchte Ihnen keinen anderen Zauberspruch aufzwingen.
FUZxxl
@FUZxxl Ich bin wirklich nicht mittendrin: D
Optimizer
2

Node.js, 172 Bytes

Funktion:

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

Testen:

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
quelle
2

K, 59 Bytes

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

Ziemlich einfach. Lesen Sie die Liste, konstruieren Sie die umgekehrte Liste, nehmen Sie den Schnittpunkt, filtern Sie die Palindrome heraus, filtern Sie die erforderliche Anzahl, sortieren und deduplizieren Sie die Paare.

Aaron Davies
quelle
2

Ruby, 95 Bytes

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

Erläuterung

  • Die Eingabe wird als Argument für ein Lambda verwendet. Es erwartet ein Integer.
  • Lesen Sie die Datei als String( a) in den Speicher .
  • Schleife durch eines Arrayaller Wörter (ohne Zeilenumbrüche).
    • Entfernen Sie das Wort von a.
    • Fügen Sie qualifizierte Wörter hinzu Array l.
  • Rückkehr l.

Ein Leerzeichen Arraywird zurückgegeben, wenn keine qualifizierenden Wörter gefunden wurden.

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

Chrome Dev Tools Console, 111 Bytes (Auf der Download-Seite)

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

Alle Versionen geben ein Array aller Semordnilaps der Länge zurück n.

Node.js, 162 Bytes

Druckt alle 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
quelle
1

Julia, 101 Bytes

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

Das sollte eigentlich funktionieren ...

eaglgenes101
quelle
1

Mathematica, 105 Bytes

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

Manchmal teilt Import den Text automatisch in eine Liste mit Zeilen auf oder behandelt ihn als CSV oder TSV. Zu anderen Zeiten liest Import den Inhalt der Datei in eine Zeichenfolge. Letzteres erledigte der Import für die Testdaten.

Tests

Ming-Tang
quelle
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
}

Tests ...

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
quelle
2
Ich denke, das ist nicht sehr golfen ..? Dies wäre eine nette Antwort auf Stack Overflow (wenn es einige Kommentare und Erklärungen gäbe).
Stewie Griffin
1
Einverstanden, dies war meine erste Wiederholung bei der Lösung dieses Problems in Bash. Ich war müde, es so lesbar wie möglich zu machen. aber so weit wie Golf geht. Es ist eher so, als hätte ich eine 9 auf einem Par 3 geschossen: -)
Brian