Encuentra las Semordnilaps

21

Semordnilaps (también conocidos como heteropalíndromos, semi-palíndromos, semi-palíndromos, reversgramas, mynoretehs, anagramas reversibles, reversiones de palabras o anádromos) son palabras que también son palabras cuando se escriben al revés. Algunos ejemplos son:

  • Ward <=> Draw
  • Denim minado <=>
  • Piezas <=> Correa

Dado un número entero positivo N (a través del argumento de función o STDIN), devuelve / genera una lista de semordnilaps de esta lista de palabras en inglés , que tienen exactamente N letras. La lista de palabras se puede guardar de forma local en el ordenador como un archivo de texto llamado: w.txt. También puede obtener la lista de la url, pero se incluirá en el recuento de bytes.

Reglas:

  1. Palindromes no son semordnilaps! Por lo tanto, las palabras "mediodía", "rotor" y "radar" no deben incluirse en la lista.
  2. Solo se debe incluir en la lista una de las palabras (en un par de semordnilap). Por lo tanto, si "perro" está en la lista, "dios" no debería estar (no importa cuál esté incluido).
  3. Si no hay semordnilaps, la salida debe ser una cadena vacía, 0, FALSE u otra cosa que indique que no hubo resultados. La función debe funcionar incluso si no hay resultados.

Este es el código de golf, por lo que gana el código más corto en bytes.


Tabla de clasificación

El Fragmento de pila al final de esta publicación genera el catálogo a partir de las respuestas a) como una lista de la solución más corta por idioma yb) como una tabla de clasificación general.

Para asegurarse de que su respuesta se muestre, comience con un título, utilizando la siguiente plantilla de Markdown:

## Language Name, N bytes

¿Dónde Nestá el tamaño de su envío? Si mejora su puntaje, puede mantener los puntajes antiguos en el título, tachándolos. Por ejemplo:

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

Si desea incluir varios números en su encabezado (por ejemplo, porque su puntaje es la suma de dos archivos o desea enumerar las penalizaciones de la bandera del intérprete por separado), asegúrese de que el puntaje real sea el último número en el encabezado:

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

También puede hacer que el nombre del idioma sea un enlace que luego aparecerá en el fragmento:

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

Stewie Griffin
fuente
55
¿No deberían ser el singular Emordnilapy el plural ser Semordnilap? ;)
FryAmTheEggman
1
"¡Palindromes no son semordnilaps!" Wow, esa oración / bala no podría ser más clara, pero ahora entiendo lo que quieres decir. Las palabras que son ellas mismas cuando se invierten no son semordnilaps.
gato

Respuestas:

10

Pyth , 23 (18 códigos, 5 STDIN necesarios)

J'f&qlTQ&}_TJ>_TTJ

Esta es una solución bastante sencilla.

Jalmacena la lista de palabras. Luego filtramos sobre la lista de palabras ( f J) en la longitud de la palabra que es la entrada ( qlTQ), la palabra invertida está en la lista ( }_TJ), y la inversión de la palabra es mayor que la palabra ( >_TT). La última condición asegura Tque no sea palindrómico y que solo se imprima uno de los pares. Se imprime la lista resultante.

De la forma en que funciona Pyth, la única forma de abrir un archivo es recibir su nombre en STDIN. Es por eso que he contado 5 de los bytes STDIN,, w.txten mi puntaje.

Ejemplo de ejecución:

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

Ruby, 74 bytes

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

Itera la lista eliminando elementos, lo que evita los palíndromos y genera "estresados" y "postres". Usando el mismo nombre de variable para la función y el iterador evita una peculiaridad de sintaxis de Ruby: aunque f=i.popse evalúa antes f.reverse, la línea no se analizará a menos que fya signifique algo. Yo también podría usar p.

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

Esta no es una entrada seria, sino más bien en respuesta a la respuesta de Brian's Bash . Así es como tiendo a pensar en programar este tipo de cosas en Bash: utilizando Bash en sí mismo por el menor tiempo posible y dejando que las herramientas integradas hagan todo el trabajo.

Aaron Davies
fuente
Obtendrá tanto la palabra como su reflejo de la comunicación de todos modos, podría hacer eco de "$ w" y no molestarse con una clasificación y cola adicionales. Si hace eso, el resultado ya debería estar ordenado, por lo que el orden final también se puede eliminar.
orion
No te sigo. ¿Cómo hago la deducción en su enfoque?
Aaron Davies
Además, olvidé por completo eliminar los palíndromos. Fijo.
Aaron Davies
Lo sentimos, falta de sueño ... de hecho, necesita comparar con el reverso para conservar solo uno de ellos, pero no tiene que preocuparse por los palíndromos y el resto de mis comentarios siguen siendo válidos. Y ahora que lo menciona, bash tiene un operador de comparación de cadenas, por lo que &&[[ $w > $(rev<<<$w) ]]&& echo $waún lo evita sort|tail -1. Con eso, creo que incluso puedes soltar el tipo final y único, porque elimina los palíndromos y solo genera una de las palabras.
orion
Además, un gato inútil al principio: <(sort w.txt)está bien.
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)

Solución bastante sencilla.

Claudiu
fuente
Parece ser más corto de definir k=c[::-1]. Además, ¿no podrías llamar set()solo la segunda vez? ¿No creo que haya repeticiones en el archivo?
FryAmTheEggman
@FryAmTheEggman: en realidad se necesitarían 11 caracteres para asignar k(9 para la definición más 1 para la nueva línea más 1 para el espacio), pero solo ahorraría 10 caracteres (saque [::-1]para 6 pero agregue 1 porque luego necesito un espacio). Sobre el set, necesito Jser un conjunto porque elimino las palabras usadas para satisfacer la regla de no engañar
Claudiu
cambiar a N==len(c)andahorra un espacio.
isaacg
@isaacg: Ah sí, ty
Claudiu
Eres bajo =y deberías serlo ==.
isaacg
3

CJam, 48 47 45 42 38 bytes

Como se debe contar la URL, estoy usando el mismo acortador de URL que Optimizer.

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

Forma §parte de ASCII extendido, por lo que cada carácter del código puede codificarse en un solo byte.

Como en el caso de Optimizer, tendrá que usar el intérprete de Java y ejecutarlo localmente desde un archivo, digamos semordnilap.cjam, y luego

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

entonces la entrada se da como un argumento de línea de comando.

Cómo funciona (un poco desactualizado):

"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 cadena resultante se imprime automáticamente al final del programa.

Martin Ender
fuente
3

Java, 280 218 bytes

En comparación con el resto de la competencia, no tengo ni idea de si es un buen puntaje.

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

Expandido:

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

Utiliza compareTo () para ignorar simultáneamente palíndromos y duplicados.

Estiramiento maniaco
fuente
2
Java siempre explotará en un concurso de golf.
Rodolfo Dias
Nunca he visto Files.readAllLines(Paths.get("w.txt"))antes. Ese es un truco útil.
Ypnypn
2

CJam, 68 bytes

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

Deberá descargar la versión Java del compilador desde aquí y guardar el código anterior en un archivo llamado words.cjam (puede ser cualquier nombre). Luego ejecuta el código como

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

Por ejemplo, para N = 8,

java -jar cjam-0.6.2.jar words.cjam 8 > out.txt  
Optimizador
fuente
Java, eso no es un acrónimo. Por favor no lo deletree JAVA.
FUZxxl
@FUZxxl esto es autoeditable ..
Optimizer
No soy un oficial de policía. La gente tiene diferentes opiniones sobre la ortografía y respeto su opinión. Simplemente le sugiero que no deletree Java como si fuera un acrónimo, no quiero forzarle un hechizo diferente.
FUZxxl
@FUZxxl Realmente no lo hago a medias: D
Optimizer
2

Nodo.js, 172 bytes

Función:

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

Pruebas:

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

K, 59 bytes

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

Muy claro. Lea la lista, construya la lista inversa, tome su intersección, filtre los palíndromos, filtre el recuento requerido, ordene y deduzca los pares.

Aaron Davies
fuente
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}

Explicación

  • La entrada se toma como argumento para una lambda. Se espera un Integer.
  • Lea el archivo en la memoria como a String( a).
  • ArrayPase por una de todas las palabras (sin líneas nuevas).
    • Eliminar la palabra de a.
    • Agregue palabras calificativas al Array l.
  • Retorno l.

Se Arraydevuelve un vacío cuando no se encontraron palabras calificadas.

britishtea
fuente
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)

Nodo.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 (en la página de descarga)

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

Todas las versiones devuelven una matriz de todas las Semordnilaps de longitud n.

Nodo.js, 162 bytes

Imprime todos los 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
fuente
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

Esto debería funcionar ...

eaglgenes101
fuente
1

Mathematica, 105 bytes

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

A veces, Importar dividirá automáticamente el texto en una lista de líneas o lo tratará como CSV o TSV. En otras ocasiones, Import leerá el contenido del archivo en una cadena. Import hizo lo último para los datos de prueba.

pruebas

Ming-Tang
fuente
0

GOLPETAZO

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
}

pruebas ...

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
fuente
2
Supongo que esto no es muy golfista ... Esta sería una buena respuesta en Stack Overflow (si tuviera algunos comentarios y explicaciones).
Stewie Griffin
1
De acuerdo, esta fue mi primera iteración para resolver esto en bash. Me cansé de hacerlo lo más legible posible. pero en lo que respecta al golf. es más como si hubiera disparado un 9 en un par 3: -)
Brian