Найти семорднилапс

21

Semordnilaps (также известные как гетеропалиндромы, полупалиндромы, полупалиндромы, реверсграммы, mynoretehs, обратимые анаграммы, реверсии слов или анадромы) - это слова, которые также являются словами, когда они пишутся в обратном направлении. Вот несколько примеров:

  • Уорд <=> Ничья
  • Mined <=> Джинсовая ткань
  • Части <=> ремень

Учитывая положительное целое число N (через аргумент функции или STDIN), вернуть / вывести список semordnilaps из этого списка английских слов , которые имеют ровно N букв. Список слов можно сохранить локально на вашем компьютере , как это текстовый файл: w.txt. Вы также можете получить список из URL, но он будет включен в число байтов.

Правила:

  1. Палиндромы не семорднилапс! Поэтому слова «полдень», «ротор» и «радар» не следует включать в список.
  2. Только одно из слов (в паре semordnilap) должно быть включено в список. Следовательно, если в списке присутствует «собака», «бог» не должен быть (не имеет значения, какой из них включен).
  3. Если нет semordnilaps, выходные данные должны быть пустой строкой, 0, FALSE или что-то еще, что указывает на отсутствие результатов. Функция должна работать, даже если нет результатов.

Это кодовый гольф, поэтому выигрывает самый короткий код в байтах!


Leaderboard

Фрагмент стека в нижней части этого поста создает каталог из ответов а) в виде списка кратчайшего решения для каждого языка и б) в качестве общей таблицы лидеров.

Чтобы убедиться, что ваш ответ обнаружен, начните его с заголовка, используя следующий шаблон уценки:

## Language Name, N bytes

где Nразмер вашего представления. Если вы улучшите свой счет, вы можете сохранить старые результаты в заголовке, вычеркнув их. Например:

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

Если вы хотите включить в заголовок несколько чисел (например, потому что ваш результат равен сумме двух файлов или вы хотите перечислить штрафы за флаг интерпретатора отдельно), убедитесь, что фактический результат является последним числом в заголовке:

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

Вы также можете сделать имя языка ссылкой, которая будет отображаться во фрагменте кода:

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

Стьюи Гриффин
источник
5
Не должно быть единственное Emordnilapи множественное число Semordnilap? ;)
FryAmTheEggman
1
"Палиндромы не семорднилапс!" Вау, это предложение / пуля не может быть более неясным, но теперь я понимаю, что вы имеете в виду. Слова, которые сами по себе обратные, не являются семорднилапсами.
кот

Ответы:

10

Pyth , 23 (18 кодов, 5 необходимых STDIN)

J'f&qlTQ&}_TJ>_TTJ

Это довольно простое решение.

Jхранит список слов. Затем мы фильтруем список слов ( f J) по длине слова, являющегося входом ( qlTQ), обратное слово находится в списке ( }_TJ), а обращение слова больше, чем слово ( >_TT). Последнее условие гарантирует, Tчто не является палиндромным, и что печатается только одна из пары. Результирующий список печатается.

Как работает Pyth, единственный способ открыть файл - это получить его имя в STDIN. Вот почему я насчитал 5 байтов STDIN w.txtв моем счете.

Пример выполнения:

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

Рубин, 74 байта

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

Итерирует по списку, удаляя элементы, избегая палиндромы и выводя как «подчеркнутые», так и «десерты». Используя одно и то же имя переменной для функции, итератор обходит причуду синтаксиса Ruby: даже если f=i.popона вычисляется раньше f.reverse, строка не будет анализироваться, если она fуже ничего не значит. Я также мог бы использовать p.

histocrat
источник
4

bash 134 157 118 байт

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

Это не серьезная запись, а скорее в ответ на ответ Брайана Баша . Вот как я склонен думать о программировании такого рода вещей в Bash - используя сам Bash как можно меньше, и позволяя встроенным инструментам выполнять всю работу.

Аарон Дэвис
источник
В любом случае вы получите и слово, и его отражение от comm, вы можете просто повторить "$ w" и не беспокоиться о дополнительных сортировке и хвосте. Если вы сделаете это, результат уже должен быть отсортирован, поэтому окончательная сортировка также может быть удалена.
Орион
Я не следую Как мне сделать дедупликацию в вашем подходе?
Аарон Дэвис
Также я полностью забыл удалить палиндромы. Исправлена.
Аарон Дэвис
Извините, лишение сна ... вам действительно нужно сравнить с обратным, чтобы сохранить только один из них, но вам не нужно заботиться о палиндромах, а остальные мои комментарии по-прежнему актуальны. И теперь, когда вы упомянули об этом, в bash есть оператор сравнения строк, поэтому он по- &&[[ $w > $(rev<<<$w) ]]&& echo $wпрежнему избегает sort|tail -1. При этом, я думаю, вы даже можете отбросить окончательный вид и уникальный, потому что он удаляет палиндромы и выводит только одно из слов.
Орион
Кроме того, бесполезная кошка в начале: <(sort w.txt)все в порядке.
Орион
4

Питон, 126 125 120 байтов

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)

Довольно простое решение.

Клаудиу
источник
Похоже, короче, чтобы определить k=c[::-1]. Кроме того, не могли бы вы позвонить set()только во второй раз? Я не думаю, что есть повторы в файле?
FryAmTheEggman
@FryAmTheEggman: На самом деле для назначения потребовалось бы 11 символов k(9 для определения плюс 1 для новой строки плюс 1 для пробела), но я бы сохранил только 10 символов (уберите [::-1]6, но добавьте 1, потому что мне нужен пробел). О set, мне нужно Jбыть набором, потому что я удаляю из него использованные слова, чтобы удовлетворить правило отсутствия дубликата
Claudiu
переключение на N==len(c)andэкономит место.
Исаак
@isaacg: Ах да, ты
Клавдиу
Вы короткие =- должно быть ==.
Исаак
3

CJam, 48 47 45 42 38 байт

Поскольку URL-адрес должен учитываться, я использую тот же сокращатель URL-адреса, что и оптимизатор.

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

§Является частью расширенного ASCII, так что каждый символ в коде могут быть закодированы в один байт.

Как и в случае с оптимизатором, вам придется использовать интерпретатор Java и запускать его локально из файла, скажем semordnilap.cjam, а затем

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

поэтому ввод задается в качестве аргумента командной строки.

Как это работает (немного устарело):

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

Результирующая строка автоматически печатается в конце программы.

Мартин Эндер
источник
3

Ява, 280 218 байт

По сравнению с остальной частью соревнования я абсолютно не знаю, хороший ли это результат.

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

Использует CompareTo () для одновременного игнорирования палиндромов и дубликатов.

Стрейч маньяк
источник
2
Ява всегда будет дуть в соревновании по гольфу.
Родольфо Диас
Я никогда не видел Files.readAllLines(Paths.get("w.txt"))раньше. Это полезный трюк.
Ypnypn
2

CJam, 68 байт

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

Вам нужно скачать отсюда Java-версию компилятора и сохранить приведенный выше код в файле words.cjam (может быть любым именем). Затем запустите код как

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

Например, для N = 8,

java -jar cjam-0.6.2.jar words.cjam 8 > out.txt  
оптимизатор
источник
Java - это не аббревиатура. Пожалуйста, не пишите это по буквам JAVA.
FUZxxl
@FUZxxl это многое редактируется самостоятельно.
Оптимизатор
Я не офицер полиции. Люди имеют разные мнения о правописании, и я уважаю ваше мнение. Я просто предлагаю вам не произносить Java, как если бы оно было аббревиатурой, я не хочу навязывать вам другое заклинание.
FUZxxl
@FUZxxl Я действительно не в середине: D
Оптимизатор
2

Node.js, 172 байта

Функция:

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

Тестирование:

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
источник
2

К, 59 байт

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

Довольно просто. Прочитайте список, создайте обратный список, возьмите их пересечение, отфильтруйте палиндромы, отфильтруйте необходимое количество, отсортируйте и дедуплицируйте пары.

Аарон Дэвис
источник
2

Рубин, 95 байт

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

объяснение

  • Входные данные принимаются в качестве аргумента лямбда-выражения. Это ожидает Integer.
  • Считайте файл в память как String( a).
  • Цикл Arrayвсех слов (без перевода строки).
    • Удалить слово из a.
    • Добавьте уточняющие слова в Array l.
  • Возвращение l.

Пустое Arrayвозвращается, когда не найдено подходящих слов.

britishtea
источник
1

Node.js, CoffeeScript, 132 байта

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 байта

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, 111 байт (на странице загрузки)

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

Все версии возвращают массив всех Semordnilaps длины n.

Node.js, 162 байта

Печатает все 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
источник
1

Юлия, 101 байт

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

Это на самом деле должно работать ...

eaglgenes101
источник
1

Mathematica, 105 байт

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

Иногда импорт автоматически разбивает текст на список строк или обрабатывает его как CSV или TSV. В других случаях Import считывает содержимое файла в строку. Последний сделал импорт для тестовых данных.

тесты

Мин-Tang
источник
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
}

тесты ...

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
Я думаю, что это не очень в гольфе ..? Это был бы хороший ответ о переполнении стека (если бы у него были некоторые комментарии и объяснения).
Стьюи Гриффин
1
Согласен, это была моя первая итерация при решении этой проблемы в bash. Я устал, чтобы сделать его как можно более читабельным. но что касается гольфа. это больше похоже на то, как я стрелял в 9 на уровне 3: -)
Брайан