Encontre o Semordnilaps

21

Semordnilaps (também conhecidos como heteropalindromes, semi-palindromes, semi-palindromes, reversgrams, miroretehs, anagramas reversíveis, reversões de palavras ou anadromos) são palavras que também são palavras quando escritas para trás. Alguns exemplos são:

  • Ward <=> Draw
  • Minerado <=> Denim
  • Peças <=> Correia

Dado um número inteiro positivo N (via argumento da função ou STDIN), retorne / produza uma lista de semordnilaps dessa lista de palavras em inglês , que possuem exatamente N letras. A lista de palavras podem ser salvos localmente em seu computador como um arquivo de texto chamado: w.txt. Você também pode obter a lista a partir do URL, mas ela será incluída na contagem de bytes.

Regras:

  1. Palindromes não são semordnilaps! Portanto, as palavras "meio-dia", "rotor" e "radar" não devem ser incluídas na lista.
  2. Somente uma das palavras (em um par semordnilap) deve ser incluída na lista. Portanto, se "cachorro" estiver na lista, "deus" não deve estar (não importa qual deles está incluído).
  3. Se não houver semordnilaps, a saída deve ser uma sequência vazia, 0, FALSE ou outra coisa indicando que não houve resultados. A função deve funcionar mesmo se não houver resultados.

Este é um código de golfe, portanto o código mais curto em bytes vence!


Entre os melhores

O snippet de pilha na parte inferior desta postagem gera o catálogo a partir das respostas a) como uma lista da solução mais curta por idioma eb) como uma tabela geral de líderes.

Para garantir que sua resposta seja exibida, inicie-a com um título, usando o seguinte modelo de remarcação:

## Language Name, N bytes

onde Nestá o tamanho do seu envio. Se você melhorar sua pontuação, poderá manter as pontuações antigas no título, identificando-as. Por exemplo:

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

Se você quiser incluir vários números no cabeçalho (por exemplo, porque sua pontuação é a soma de dois arquivos ou você deseja listar as penalidades do sinalizador de intérpretes separadamente), verifique se a pontuação real é o último número no cabeçalho:

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

Você também pode transformar o nome do idioma em um link que será exibido no snippet:

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

Stewie Griffin
fonte
5
Não deveria ser o singular Emordnilape o plural Semordnilap? ;)
FryAmTheEggman
1
"Palíndromos não são semiluminados!" Uau, essa frase / marcador não poderia ser mais clara, mas agora entendo o que você quer dizer. Palavras que são elas mesmas quando revertidas não são semordnilaps.
cat

Respostas:

10

Pitão , 23 (código 18, 5 STDIN necessário)

J'f&qlTQ&}_TJ>_TTJ

Esta é uma solução bastante direta.

Jarmazena a lista de palavras. Em seguida, filtramos a lista de palavras ( f J) no comprimento da palavra sendo a entrada ( qlTQ), a palavra invertida na lista ( }_TJ) e a inversão da palavra sendo maior que a palavra ( >_TT). A última condição garante que Tnão seja palindrômica e que apenas um dos pares seja impresso. A lista resultante é impressa.

Como o Pyth funciona, a única maneira de abrir um arquivo é receber seu nome no STDIN. É por isso que contei 5 dos bytes STDIN,, w.txtna minha pontuação.

Exemplo de execução:

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

Ruby, 74 bytes

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

Repete a lista removendo elementos, o que evita os palíndromos e gera os itens "estressados" e "sobremesas". Usando o mesmo nome de variável para a função e o iterador contorna uma peculiaridade de sintaxe Ruby: mesmo que já tenha f=i.popsido avaliada antes f.reverse, a linha não será analisada, a menos que fjá signifique alguma coisa. Eu também poderia usar p.

histocrata
fonte
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 não é uma entrada séria, mas em resposta à resposta de Brian Bash . É assim que costumo pensar em programar esse tipo de coisa no Bash - usando o próprio Bash o mínimo possível e deixando as ferramentas internas fazer todo o trabalho.

Aaron Davies
fonte
De qualquer maneira, você receberá a palavra e seu reflexo do comm, basta ecoar "$ w" e não se preocupar com classificação e cauda extras. Se você fizer isso, o resultado já deverá estar classificado, para que a classificação final também possa ser removida.
Orion
Eu não sigo. Como faço a desduplicação em sua abordagem?
Aaron Davies
Além disso, esqueci completamente de remover os palíndromos. Fixo.
Aaron Davies
Desculpe, privação de sono ... você realmente precisa comparar com o inverso para manter apenas um deles, mas não precisa se preocupar com palíndromos e o restante dos meus comentários ainda é válido. E agora que você mencionou, o bash possui um operador de comparação de strings, o que &&[[ $w > $(rev<<<$w) ]]&& echo $wainda evita sort|tail -1. Com isso, acho que você pode até soltar a classificação final e a única, porque remove palíndromos e gera apenas uma das palavras.
orion
Além disso, um gato inútil no começo: <(sort w.txt)tudo bem.
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)

Solução bastante simples.

Claudiu
fonte
Parece ser mais curto para definir k=c[::-1]. Além disso, você não poderia ligar set()apenas pela segunda vez? Eu não acho que haja repetições no arquivo?
FryAmTheEggman
@FryAmTheEggman: Na verdade, seriam necessários 11 caracteres para atribuir k(9 para definição mais 1 para nova linha mais 1 para espaço), mas eu só salvaria 10 caracteres (removi [::-1]para 6, mas adicionei 1 porque, então, preciso de um espaço). Sobre o set, eu preciso Jser um conjunto, porque removo as palavras usadas para satisfazer a regra dos não-dupe
Claudiu
alternar para N==len(c)andeconomizar espaço.
Isaacg
@isaacg: Ah sim, ty
Claudiu
Você é baixo =e deveria ser ==.
Isaacg
3

CJam, 48 47 45 42 38 bytes

Como o URL precisa ser contado, estou usando o mesmo encurtador de URL que o Optimizer.

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

o § parte do ASCII estendido, para que cada caractere no código possa ser codificado em um único byte.

Como no caso do Optimizer, você precisará usar o interpretador Java e executá-lo localmente a partir de um arquivo, digamos semordnilap.cjam, e depois

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

portanto, a entrada é fornecida como um argumento da linha de comandos.

Como funciona (um pouco desatualizado):

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

A sequência resultante é impressa automaticamente no final do programa.

Martin Ender
fonte
3

Java, 280 218 bytes

Comparado com o resto da competição, não faço a menor idéia se essa é uma boa pontuação.

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

Usa compareTo () para ignorar simultaneamente palíndromos e duplicatas.

Stretch Maniac
fonte
2
Java sempre sopra em uma competição de golfe.
Rodolfo Dias
Eu nunca vi Files.readAllLines(Paths.get("w.txt"))antes. Esse é um truque útil.
Ypnypn
2

CJam, 68 bytes

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

Você precisará fazer o download da versão Java do compilador a partir daqui e salvar o código acima em um arquivo chamado words.cjam (pode ser qualquer nome). Em seguida, execute o código como

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

Por exemplo, para N = 8,

java -jar cjam-0.6.2.jar words.cjam 8 > out.txt  
Optimizer
fonte
Java - isso não é um acrônimo. Por favor, não soletre JAVA.
FUZxxl
@FUZxxl isso é auto-editável ..
Optimizer
Eu não sou policial. As pessoas têm opiniões diferentes sobre ortografia e eu respeito sua opinião. Eu apenas sugiro que você não soletre Java como se fosse um acrônimo, não quero forçar uma soletração diferente em você.
FUZxxl
@FUZxxl Eu realmente não meio: D
Otimizador
2

Node.js, 172 bytes

Função:

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

Teste:

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

K, 59 bytes

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

Bem direto. Leia a lista, construa a lista reversa, faça sua interseção, filtre os palíndromos, filtre a contagem necessária, classifique e desduplice os pares.

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

Explicação

  • A entrada é tomada como argumento para uma lambda. Espera um Integer.
  • Leia o arquivo na memória como um String( a).
  • Faça um loop Arrayem todas as palavras (sem novas linhas).
    • Remova a palavra de a.
    • Adicione palavras qualificadas ao Array l.
  • Retorno l.

Um vazio Arrayé retornado quando nenhuma palavra qualificada foi encontrada.

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

Console de ferramentas de desenvolvimento do Chrome, 111 bytes (na página de download)

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

Todas as versões retornam uma matriz de todos os Semordnilaps de comprimento n .

Node.js, 162 bytes

Imprime todos os 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
fonte
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

Isso realmente deve funcionar ...

eaglgenes101
fonte
1

Mathematica, 105 bytes

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

Às vezes, o Import divide automaticamente o texto em uma lista de linhas ou o trata como CSV ou TSV. Em outros momentos, o Import lerá o conteúdo do arquivo em uma string. A importação fez o último para os dados de teste.

testes

Ming-Tang
fonte
0

BATER

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
}

testes ...

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
fonte
2
Eu acho que isso não é muito golfe ..? Essa seria uma boa resposta no Stack Overflow (se tivesse alguns comentários e explicações).
Stewie Griffin
1
Concordo, esta foi a minha primeira iteração em resolver isso no bash. Eu cansei de torná-lo o mais legível possível. mas no que diz respeito ao golfe. é mais como eu tiro um 9 em um par 3: -)
Brian