Trouvez les Semordnilaps

21

Les semordnilaps (également appelés hétéropalindromes, semi-palindromes, demi-palindromes, reversgrams, mynoretehs, anagrammes réversibles, inversions de mots ou anadromes) sont des mots qui sont également des mots épelés à l'envers. Voici quelques exemples:

  • Ward <=> Draw
  • <=> Denim extrait
  • Pièces <=> Sangle

Étant donné un entier positif N (via l'argument de fonction ou STDIN), retournez / sortez une liste de semordnilaps à partir de cette liste de mots anglais , qui ont exactement N lettres. La liste des mots peut être enregistré localement sur votre ordinateur sous forme de fichier texte appelé: w.txt. Vous pouvez également obtenir la liste à partir de l'URL, mais elle sera incluse dans le nombre d'octets.

Règles:

  1. Les palindromes ne sont pas des semordnilaps! Par conséquent, les mots "midi", "rotor" et "radar" ne devraient pas être inclus dans la liste.
  2. Un seul des mots (dans une paire semordnilap) doit être inclus dans la liste. Par conséquent, si "chien" est dans la liste, "dieu" ne devrait pas l'être (peu importe lequel est inclus.)
  3. S'il n'y a pas de semordnilaps, la sortie doit être une chaîne vide, 0, FALSE ou quelque chose d'autre indiquant qu'il n'y a pas de résultats. La fonction doit fonctionner même s'il n'y a aucun résultat.

Il s'agit de code golf, donc le code le plus court en octets gagne!


Classement

L'extrait de pile au bas de cet article génère le catalogue à partir des réponses a) en tant que liste des solutions les plus courtes par langue et b) en tant que classement général.

Pour vous assurer que votre réponse apparaît, veuillez commencer votre réponse avec un titre, en utilisant le modèle Markdown suivant:

## Language Name, N bytes

Nest la taille de votre soumission. Si vous améliorez votre score, vous pouvez conserver les anciens scores dans le titre, en les rayant. Par exemple:

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

Si vous souhaitez inclure plusieurs nombres dans votre en-tête (par exemple, parce que votre score est la somme de deux fichiers ou que vous souhaitez répertorier les pénalités de drapeau d'interprète séparément), assurez-vous que le score réel est le dernier numéro de l'en-tête:

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

Vous pouvez également faire du nom de la langue un lien qui apparaîtra ensuite dans l'extrait de code:

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

Stewie Griffin
la source
5
Le singulier ne devrait-il pas être Emordnilaple pluriel Semordnilap? ;)
FryAmTheEggman
1
"Les palindromes ne sont pas des semordnilaps!" Wow, cette phrase / balle ne pourrait pas être plus claire, mais maintenant je vois ce que tu veux dire. Les mots qui sont eux-mêmes lorsqu'ils sont inversés ne sont pas des semordnilaps.
cat

Réponses:

10

Pyth , 23 (code 18, 5 STDIN nécessaires)

J'f&qlTQ&}_TJ>_TTJ

Il s'agit d'une solution assez simple.

Jstocke la liste des mots. Ensuite, nous filtrons la liste de mots ( f J) sur la longueur du mot étant l'entrée ( qlTQ), le mot inversé étant dans la liste ( }_TJ), et l'inversion du mot étant supérieure au mot ( >_TT). La dernière condition garantit qu'elle Tn'est pas palindromique et qu'une seule de la paire est imprimée. La liste résultante est imprimée.

Le fonctionnement de Pyth, la seule façon d'ouvrir un fichier est de recevoir son nom sur STDIN. C'est pourquoi j'ai compté 5 octets STDIN w.txtdans ma partition.

Exemple d'exécution:

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

Rubis, 74 octets

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

Itère sur la liste en supprimant les éléments, ce qui évite les deux palindromes et produit à la fois des "stressés" et des "desserts". L'utilisation du même nom de variable pour la fonction et l'itérateur contourne une bizarrerie de syntaxe Ruby: même si elle f=i.popest évaluée auparavant f.reverse, la ligne ne sera pas analysée à moins qu'elle ne fsignifie déjà quelque chose. Je pourrais aussi utiliser p.

histocrate
la source
4

bash 134 157 118 octets

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

Ce n'est pas une entrée sérieuse, mais plutôt en réponse à la réponse de Brian à Bash . C'est ainsi que j'ai tendance à penser à programmer ce genre de chose dans Bash - en utilisant Bash lui-même le moins possible et en laissant les outils intégrés faire tout le travail.

Aaron Davies
la source
Vous obtiendrez à la fois le mot et son reflet de comm de toute façon, vous pourriez simplement faire écho à "$ w" et ne pas vous embêter avec un tri et une queue supplémentaires. Si vous faites cela, le résultat doit déjà être trié, de sorte que le tri final peut également être supprimé.
orion
Je ne suis pas. Comment faire la déduplication dans votre approche?
Aaron Davies
De plus, j'ai complètement oublié de retirer les palindromes. Fixé.
Aaron Davies
Désolé, la privation de sommeil ... vous avez en effet besoin de comparer avec l'inverse pour ne garder qu'un seul d'entre eux, mais vous n'avez pas à vous soucier des palindromes et le reste de mes commentaires sont toujours valables. Et maintenant que vous le mentionnez, bash a un opérateur de comparaison de chaînes, donc &&[[ $w > $(rev<<<$w) ]]&& echo $wtoujours à éviter sort|tail -1. Avec cela, je pense que vous pouvez même supprimer le tri final et unique, car il supprime les palindromes et ne produit qu'un seul des mots.
orion
Aussi, un chat inutile au début: <(sort w.txt)ça va.
orion
4

Python, 126 125 120 octets

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)

Solution assez simple.

Claudiu
la source
Il semble être plus court à définir k=c[::-1]. De plus, ne pouviez-vous pas appeler set()seulement la deuxième fois? Je ne pense pas qu'il y ait des répétitions dans le fichier?
FryAmTheEggman
@FryAmTheEggman: En fait, il faudrait 11 caractères à attribuer k(9 pour la définition plus 1 pour la nouvelle ligne plus 1 pour l'espace), mais je n'enregistrerais que 10 caractères (retirez-en [::-1]6 mais ajoutez 1 car j'ai alors besoin d'un espace). À propos de la set, je dois Jêtre un ensemble car j'en supprime les mots utilisés pour satisfaire la règle de non-dupe
Claudiu
basculer vers N==len(c)andpermet d' économiser un espace.
isaacg
@isaacg: Ah oui, ty
Claudiu
Vous êtes petit et =- devrait l'être ==.
isaacg
3

CJam, 48 47 45 42 38 octets

Étant donné que l'URL doit être comptée, j'utilise le même raccourcisseur d'URL que l'Optimizer.

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

Le §fait partie de l'ASCII étendu, de sorte que chaque caractère du code peut être codé dans un seul octet.

Comme dans le cas d'Optimizer, vous devrez utiliser l' interpréteur Java et l'exécuter localement à partir d'un fichier, par exemple semordnilap.cjam, puis

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

donc l'entrée est donnée comme argument de ligne de commande.

Comment ça marche (un peu dépassé):

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

La chaîne résultante est automatiquement imprimée à la fin du programme.

Martin Ender
la source
3

Java, 280 218 octets

Par rapport au reste de la compétition, je n'ai absolument aucune idée si c'est un bon score.

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

Étendu:

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

Utilise compareTo () pour ignorer simultanément les palindromes et les doublons.

Stretch Maniac
la source
2
Java soufflera toujours dans un concours de golf.
Rodolfo Dias
Je n'en ai jamais vu Files.readAllLines(Paths.get("w.txt"))auparavant. C'est une astuce utile.
Ypnypn
2

CJam, 68 octets

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

Vous devrez télécharger la version Java du compilateur à partir d' ici et enregistrer le code ci-dessus dans un fichier appelé words.cjam (peut être n'importe quel nom). Ensuite, exécutez le code comme

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

Par exemple, pour N = 8,

java -jar cjam-0.6.2.jar words.cjam 8 > out.txt  
Optimiseur
la source
Java - ce n'est pas un acronyme. Veuillez ne pas l'épeler JAVA.
FUZxxl
@FUZxxl c'est beaucoup modifiable par lui-même ..
Optimizer
Je ne suis pas policier. Les gens ont des opinions différentes sur l'orthographe et je respecte votre opinion. Je vous suggère simplement de ne pas épeler Java comme si c'était un acronyme, je ne veux pas vous imposer un sort différent.
FUZxxl
@FUZxxl Je ne suis vraiment pas au milieu: D
Optimizer
2

Node.js, 172 octets

Une fonction:

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

Essai:

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
la source
2

K, 59 octets

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

Assez simple. Lisez la liste, construisez la liste inversée, prenez leur intersection, filtrez les palindromes, filtrez le nombre requis, triez et dédupliquez les paires.

Aaron Davies
la source
2

Rubis, 95 octets

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

Explication

  • L'entrée est considérée comme l'argument d'un lambda. Il attend un Integer.
  • Lisez le fichier en mémoire sous la forme d'un String( a).
  • Boucle à travers un Arrayde tous les mots (sans retour à la ligne).
    • Retirez le mot de a.
    • Ajoutez des mots de qualification au Array l.
  • Retour l.

Un vide Arrayest retourné quand aucun mot de qualification n'a été trouvé.

britishtea
la source
1

Node.js, CoffeeScript, 132 octets

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 octets

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

Console Chrome Dev Tools, 111 octets (sur la page de téléchargement)

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

Toutes les versions renvoient un tableau de tous les semordnilaps de longueur n .

Node.js, 162 octets

Imprime tous les 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
la source
1

Julia, 101 octets

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

Cela devrait réellement fonctionner ...

eaglgenes101
la source
1

Mathematica, 105 octets

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

Parfois, Import divise automatiquement le texte en liste de liste de lignes ou le traite comme CSV ou TSV. À d'autres moments, Import lira le contenu du fichier dans une chaîne. Import a fait ce dernier pour les données de test.

tests

Ming-Tang
la source
0

FRAPPER

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
la source
2
Je suppose que ce n'est pas très golfé ..? Ce serait une belle réponse sur Stack Overflow (si elle avait quelques commentaires et explications).
Stewie Griffin
1
D'accord, c'était ma première itération pour résoudre ce problème en bash. Je suis fatigué de le rendre aussi lisible que possible. mais en ce qui concerne le golf. c'est plus comme si j'avais tiré un 9 sur un par 3: -)
Brian