Знайдіть Semordnilaps


21

Semordnilaps (також відомий як гетеропаліндроми, напівпаліндроми, напівпаліндроми, реверграми, міноретехи, оборотні анаграми, зворотні слова або анадроми) - це слова, які також є словами, коли написані назад. Кілька прикладів:

  • Уорд <=> Малюємо
  • Видобуток <=> Джинсовий
  • Запчастини <=> Ремінь

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

Правила:

  1. Паліндроми - це не півночі! Тому слова "полудень", "ротор" та "радари" не повинні включатися до переліку.
  2. До списку має бути включено лише одне зі слів (у пару седланілап). Тому, якщо "собака" є у списку, "бога" не повинно бути (не має значення, хто з них включений.)
  3. Якщо немає semordnilaps, на виході має бути порожній рядок, 0, FALSE або щось інше, що вказує на відсутність результатів. Функція повинна працювати, навіть якщо результатів немає.

Це код гольфу, тому найкоротший код у байтах виграє!


Таблиця лідерів

Фрагмент стека внизу цієї публікації генерує каталог з відповідей а) як список найкоротших варіантів для кожної мови та б) як загальний таблиця лідерів.

Щоб переконатися, що ваша відповідь відображається, будь ласка, почніть свою відповідь із заголовка, використовуючи наступний шаблон Markdown:

## 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']

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.


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

Python, 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бути набором, тому що я видаляю з нього вживані слова, щоб задовольнити правило бездушного
Клавдіу

перемикання N==len(c)andекономить місце.
isaacg

@isaacg: Ага так, ty
Клавдіу

Ти короткий =- повинен бути ==.
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

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

Розширено:

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

Використовує сравнениеTo () для одночасного ігнорування паліндром і дублікатів.


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

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повертається, коли не знайдено кваліфікованих слів.


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

1

Джулія, 101 байт

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

Насправді це має спрацювати ...


1

Математика, 105 байт

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

Іноді Імпорт автоматично розділить текст на список рядків списку або трактуватиме його як CSV або TSV. В інший час Імпорт буде читати вміст файлу в рядок. Імпорт зробив останнє для даних тесту.

тести


0

БАШ

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
Я думаю, це не дуже гольф ..? Це було б чудовою відповіддю на Stack Overflow (якщо в ньому були коментарі та пояснення).
Стюі Гріффін

1
Домовились, це була моя перша ітерація щодо вирішення цього питання в баші. Я втомився зробити це максимально читабельним. але що стосується гольфу. це більше схоже на те, що я вистрілив у 9 нарівні 3: -)
Брайан
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.