Визначте, чи є рядки анаграмами


85

Виклик

Враховуючи два рядки, попрацюйте, чи є в них обох однакові символи.

Приклад

Вхідні дані

слово, wrdo

Це повертається, trueтому що вони однакові, але просто зашифровані.

Вхідні дані

слово, wwro

Це повертається false.

Вхідні дані

човен, тоба

Це повертається true

Правила

Ось правила!

  • Припустимо, що вхід буде не менше 1 знака і не більше 8 символів.
  • Немає спеціальних символів, лише a-z
  • Усі входи можна вважати малими літерами

Випробування

boat, boat = true
toab, boat = true
oabt, toab = true
a, aa = false
zzz, zzzzzzzz = false
zyyyzzzz, yyzzzzzy = true
sleepy, pyels = false
p,p = true

10
9 відповідей у ​​13 переглядах ... ух!
Том Гюллен

@Tom, тому що всі хотіли довести, що ваш коментар щодо використання 64-бітного цілого числа вказує в неправильному напрямку: P
Пітер Тейлор

5
Запит на заголовок: Ельф від тріски, іди!

5
"Сокіл лють, з глузду з’їжджай!"
Геобіц

7
Моє ім'я пропозиція: "вони анаграми" → "керувати масивами"
Esolanging Fruit

Відповіді:


39

Пітон, 32 байти

f=lambda a,b,S=sorted:S(a)==S(b)

3
@Debanjan, Це точно так само, як def f(a,b):return sorted(a)==sorted(b)угода про те, що ви можете замінити def + return на лямбда в обмін на те, що не використовуєте жодних заяв
gnibbler

1
@Debanjan, я думаю, що це врятує тебе лише один персонаж. Я тут використав варіацію, але вона працює тією ж довжиною, що і ваша, тому що я
поміняю

4
@Tomas, дурниця. Питання не визначає повну програму, тому прийнятна або функція, або повна програма.
гніблер

2
@Tomas, Більшість відповідей тут не відповідають вашим критеріям. Чому б не дати нагороду всім тим, хто робить?
гніблер

4
@Tomas, це не правило зловживань. Деякі питання навмисно відкриваються, як здається, це. Порівняйте з чітко вказаним запитанням, як це . Якщо вам не подобається ці відповіді скаржаться на питання запитувача
gnibbler

27

Гольфскрипт, 3 символи?

$$=

використання:

'boat'$'baot'$=
1

'toab'$'boat'$=
1

'oabt'$'toab'$=
1

'a'$'aa'$=
0

'zzz'$'zzzzzzzz'$=
0

'zyyyzzzz'$'yyzzzzzy'$=
1

'sleepy'$'pyels'$=
0

'p'$'p'$=
1

23
Це цікава інтерпретація того, як подати вклад :)
gnibbler

4
Пояснення будь ласка :(
st0le

10
@ st0le, серйозно? Я не знаю гольфскрипту, але, очевидно, $ (сортувати), $ (сортувати), = (порівняти)
Пітер Тейлор

11
Хіба це мало обману? Я маю на увазі, це не змінний вхід. Це має бути жорстко закодовано. У будь-якому випадку я б додав 4 до числа символів для символів quo ( ').
Томас Едінг

6
Це не є чинним нашими чинними правилами. Однак ви можете змінити його на 4-байтову функцію @ JanDvorak, яка приймає введення через дійсний формат введення .
Дверна ручка

20

J, 8

-:&(/:~)

Literaly, match ( -:) on ( &) сортування ( /:~)

Використання зразка:

   'boat' -:&(/:~) 'boat'
1
   'toab' -:&(/:~) 'boat'
1
   'oabt' -:&(/:~) 'toab'
1
   'a' -:&(/:~) 'aa'
0
   'zzz' -:&(/:~) 'zzzzzzzz'
0
   'zyyyzzzz' -:&(/:~) 'yyzzzzzy'
1
   'sleepy' -:&(/:~) 'pyels'
0
   'p' -:&(/:~) 'p'
1

Де вступають у гру 64-бітні цілі числа?


Чи не можливо записати функції / підпрограми в J?

2
@Tim Nordenfur: їх називають "дієсловами" і беруть або один аргумент праворуч, як у v arg(монадах), або два з обох сторін, як у arg1 v arg2(діади). Я подав я, очевидно, діаду. Я не намагався його назвати, оскільки він не запитувався і таким чином коротше. Якщо ви дійсно хочете дати йому ім’я, зробіть це так: is_anagram_of =: -:&(/:~)і потім використовуйте як 'a' is_anagram_of 'aa'.
JB

Дуже дешево було замінити аргументи в код, але зараз я бачу, що це по суті діада. Не звертай уваги.

29
J завжди схожий на залишки фабричного вибуху смайликів.
st0le

19

Javascript, 192 157 152 147 125 байт

Добре, деякі з цих мов набагато більш гнучкі, ніж я думав! Так чи інакше, я думаю, але принаймні інша техніка.

Стиснута

Дякуємо Петрові та Давидові за те, що видалили більше клопотів!

for(a=[j=p=2];j<123;)a[j]?p%a[++j]<1&&p++&&(j=0):(a[j]=p,j=0);function b(c,i){return c[i=i||0]?a[c.charCodeAt(i)]*b(c,++i):1}

Потім зробіть:

alert(b("hello")==b("elloh"));

Розширений код

Стислий змінив багато змін, але це основна теорія:

// Define dictionary of primes
a = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101];

// Returns the unique ID of the word (order irrelevant)
function b(c) {
    r = 1;
    for (i = 0; i < c.length; i++)
        r *= a[c[i].charCodeAt(0) - 97];
    return r
}

alert(b("hello") == b("hlleo"));

Відмінна ідея з використанням прайметів.

@Tim спасибі! Знизив це до 157 зараз.
Том Гуллен

2
Можна збрити пару символів з ініціалізації словника за допомогою сита. a=[2];for(p=3,j=0;j<26;)if(a[j]){if(p%a[j++]==0){p++;j=0}}else{a[j]=p;j=0}
Пітер Тейлор

1
@ Том, залежить від того, наскільки добре оптимізовані процедури сортування, враховуючи, що ви обмежили введення лише 8 символами: P
Пітер Тейлор

1
125 символів . Рекурсія та тернарії FTW:for(a=[j=p=2];j<123;)a[j]?p%a[++j]<1&&p++&&(j=0):(a[j]=p,j=0);function b(c,i){return c[i=i||0]?a[c.charCodeAt(i)]*b(c,++i):1}
David Murdoch

15

Гольфскрипт, 8 байт

Це визначає функцію, що називається A

{$\$=}:A

Тестові справи

;
'boat' 'boat' A
'toab' 'boat' A
'oabt' 'toab' A
'a' 'aa' A
'zzz' 'zzzzzzzz' A
'zyyyzzzz' 'yyzzzzzy' A
'sleepy' 'pyels' A
'p' 'p' A

11

Haskell, 31 байт

функція - 31

import List
f=(.sort).(==).sort

програма - 81 58 55

import List
g=sort`fmap`getLine
main=(`fmap`g).(==)=<<g

Використання:

$ runghc anagram.hs
boat
boat
True
$ runghc anagram.hs
toab
boat
True
$ runghc anagram.hs
a
aa
False

Кудо до лямбдаботу та його безпроблемне реконструкція .


Чи може код Haskell, який виконує лише те, що потрібно під runghc, але не коли його компілюється, все ще називати "програмою"?
JB

3
@JB: Чи може код Perl, який виконує лише те, що потрібно, perlвсе ще називати "програмою"? :-)
Джої Адамс

Ю.Б .: Сьогодні функціональні мови перекосують значення програми, роблячи її абстракцією вищого порядку. Замість того, щоб просто перелік інструкцій для виконання, оскільки програма haskell просто може розглядатися як сукупність функцій, навіть якщо вони не викликаються.
Callum Rogers

@Callum Rogers: моя думка: його код поводиться по-різному, незалежно від того, працювати він під runghc або компільований, у зоні, чутливій до проблем. "Функція" чудово. "Програма" не вирішує проблему нічим іншим, ніж runghc, а runghc - не єдиний законний спосіб запуску програм Haskell. У цьому контексті це робить фрагмент "сценарієм runghc", а не "програмою Haskell". - не що я вважав би питання важливим, як я вже сказав, функція все одно прекрасна і вона коротша.
JB

2
x#y=sort x==sort yна 1 символ коротший
Ротсор

10

C #, 129 символів

namespace System.Linq{class X{static void Main(string[]a){Console.Write(a[0].OrderBy(_=>_).SequenceEqual(a[1].OrderBy(_=>_)));}}}

Читає:

namespace System.Linq
{
    class X
    {
        static void Main(string[] a)
        {
            Console.Write(a[0].OrderBy(_ => _)
                  .SequenceEqual(a[1].OrderBy(_ => _)));
        }
    }
}

Я думаю, ви могли б пограти в декілька байтів, using System.Linq;замість того, щоб розділяти їх назви?
Стек

10

Рубін, 34 байти

Використовуючи схему IO рішення Пітера Тейлорса Perl:

p gets.chars.sort==gets.chars.sort

Викидає помилку:-e:1:in '<main>': undefined method 'chars' for nil:NilClass (NoMethodError)
Томаш

9

Програма С, 118

t[52],i;main(c){for(;i<52;)(c=getchar())<11?i+=26:t[i+c-97]++;
for(i=27;--i&&t[i-1]==t[i+25];);puts(i?"false":"true");}

1
Ви коли-небудь розглядали можливість подати заявку в МОККП ?
Mateen Ulhaq

9
@muntoo: ти щось бачив у МОККЦ? Це занадто читабельно для цього.
Р. Мартіньо Фернандес

@Martinho Так, вихідні коди IOCCC такі прекрасні. Симфонії. Але він повинен хоча б спробувати скласти невеликий шматок. :)
Mateen Ulhaq

@muntoo: Я навіть не знав, що вони все ще активні.
Joey Adams

1
Щойно побачив цю ... Дуже приємно. Але можна і коротше: t[256],i;main(c){for(;c+3;)(i=getchar())>10?t[i]+=c:(c-=2);for(i=257;--i&&!t[i-1];);puts(i?"false":"true");}- це 108 символів. Дуже важливо, ваш cтрюк ініціалізації все ще використовується.
угорен

7

Perl, 58 байт

(повна програма, на відміну від іншої відповіді Perl, яка є лише функцією)

($c,$d)=map{[sort split//]}<>;print"@$c"eq"@$d"?true:false

49 як функція

sub f{($c,$d)=map{[sort split//]}<>;"@$c"eq"@$d"}

звичайно, ви можете зберегти 4 символи в програмі, видаливши "навколо true і false, оскільки без використання строгих / попереджень барево - це рядок.
Джоел Бергер


Я віддаю перевагу цьому як ($c,$d)=map{[sort split//]}@ARGV;exit("@$c"ne"@$d")(51 знаку), щоб він міг брати аргументи командного рядка та використовувати коди виходу з командного рядка. Це буде 48 символів <>із багаторядковим входом.
Адам Кац

6

Clojure - 23 символи

Як анонімна функція:

#(apply = (map sort %))

Приклад тестового випадку:

(#(apply = (map sort %)) ["boat" "boat"])
=> true

Класно, мені це подобається.
Хірон

1
Гарна відповідь. Мені особливо подобаються вибрані вами тестові рядки ;-)
coredump

6

JavaScript

На основі рішення @ zzzzBov.

Порівняння, 65 символів (40 без функції)

function f(a,b){return a.split('').sort()==b.split('').sort()+""}

Компаратор, 43 символи

function f(a){return a.split('').sort()+""}

Розумний за допомогою +""примушувати до струни.
Кейсі Чу

6

C ++ (104 символів, що не мають часу)


На основі сортування підрахунку. Примітка. Припускає рядки однакової довжини, які, мабуть, маються на увазі (хоча і не зазначені) питанням.

int u[123], i;

int a(char **c) {
    for(; c[0][i]; ) {
        u[c[0][i]]++;
        u[c[1][i++]]--;
    }

    i=123;
    while(i && !u[--i]);
    return !i;
}

У C, якщо ви оголошуєте змінну в глобальній області, вона ініціалізується до нуля. Я думаю, це справедливо і для C ++.
Джої Адамс

Локальні змінні, з іншого боку, не ініціалізуються до нуля автоматично.
Joey Adams

Гаразд, я зняв свій застереження, оскільки знайшов способи обійтися без нього.
Матвій

1
Bzzzt. Ви проходите тестові випадки, але "helle" та "hollo", мабуть, однакові. Просте виправлення: змініть один із ++ на -. Тоді просто якщо (u [i ++]) повернути 0;
Дейв Гембл

1
Я цього не перевіряв, але останні три рядки можна записати якi=123;while(i&&u[--i]);return!i;
st0le

4

PHP (командний рядок, 87 символів)

function d($s){
    return array_count_values(str_split($s));
}

echo d($argv[1]) == d($argv[2]);

4

Javascript

Трохи коротша версія рішення @ zzzzBov, яка використовує .join()замість String box :

function a(b,c){return b.split('').sort().join()==c.split('').sort().join()}
alert(a('abc','bca')); //true

Аналогічно:

function a(b){return b.split('').sort().join()}
alert(a('abc')==a('bca')); //true

3
це відповідь ID 1337. congratz
TheDoctor

4

Clojure REPL 41 символів

(= (sort (read-line)) (sort (read-line)))

Ласкаво просимо до мережі Stack Exchange. Тут допоможе форматування .
dmckee

4

Java

(мабуть, всім улюблена мова!)

173 символів:

import java.util.*;class g{public static void main(String[]p){String[]a=p[0].split(""),b=p[1].split("");Arrays.sort(a);Arrays.sort(b);System.out.print(Arrays.equals(a,b));}}

(Не друкує новий рядок, щоб зберегти 2 символи від println)

Складіть і запустіть:

javac g.java
java -cp . g abcdef fedcba
true

Люблю бачити коротший ...


Я знаю, що минуло більше 6,5 років (кохано), але ви можете пограти в нього на 10 байт, додавши java.util.Arrays x=null;та використовуйте x.замість Arrays.: class g{public static void main(String[]p){java.util.Arrays x=null;String[]a=p[0].split(""),b=p[1].split("");x.sort(a);x.sort(b);System.out.print(x.equals(a,b));}}( 163 байти ) І перетворивши його на Java 8, class g{public static void mainмогло б бути interface g{static void mainдобре, але я думаю, що Java 8 не був Ще не було ще 2011 року, тому зберігання classтеж чудово. ; p
Кевін Круїссен

4

sed, 45 годин

Це навіть можливо в моєму улюбленому - sed! Всього один регулярний вираз для вирішення анаграми ! Просто продовжуйте видаляти відповідні літери:

:
s/(.)(.*,.*)\1/\2/
t
/\w/{i\false
d}
i\true

(на яку слід звернутися -nE)

Перл, 48

1while s/(.)(.*,.*)\1/\2/;$_=/\w/?"false":"true"

До якого слід звернутися -p.

Функція Perl, 39

sub f{$,while s/(.)(.*,.*)\1/\2/;!/\w/}

4

APL, 2 символи

≡⍦

Це Multiset матч функція з Nars2000 , однією з реалізацій APL передових. При застосуванні до рядків він обчислює саме необхідну функцію:

      'elvis' ≡⍦ 'lives'
1
      'alec guinness' ≡⍦ 'genuine class'
1

Просто цікаво, скільки байтів це? 4? 6?
Мальтісен

Це залежить від кодування. 6 байт в UTF-8, 4 байти в UCS-2, 2 байти, якщо будь-який із застарілих однобайтових наборів API APL має символ, в якому я сумніваюся.
Тобія

4

05AB1E , 6 4 байти (не конкуруючий)

{I{Q

Спробуйте в Інтернеті!

Це зайняло деякий час через труднощі з введенням. Гольф вниз через поп.

Пояснення:

{I{Q    Original code

{       Takes first input e.g. word and sorts -> 'dorw'
 I      Takes second input e.g. 'wrdo'
  {     Sorts second input -> 'dorw'
   Q    Compare if sorted 1 = sorted 2, then print result. 'dorw' = 'dorw', so prints 1.

1
Оскільки 05AB1E є новішим, ніж ця проблема, ця відповідь є неконкурентною.
Loovjo

Вибачте - не зрозумів.
Гено Раклін Ашер

4

Perl, 77 75 символів

Введення / виведення проблеми недостатньо уточнено; це читає два рядки зі stdin та виводить true чи false у stdout.

sub p{join'',sort split'',$a}$a=<>;$x=p;$a=<>;print$x eq p()?"true":"false"

(Дякую Тіму за 77 -> 75)


Щось не так. $a=;? Крім того, ви можете пропустити паролі sortта простір після print.

@Tim, геній, який розробив цю платформу для спільного використання коду через мережу, вирішив, що в кодових блоках людям слід уникати менше символів. Але ей, нічого страшного: це не так, якби хтось використовував їх у коді, правда? Продовжує виловлювати мене.
Пітер Тейлор

2
Гаразд, я зняв протизакон. Можливо, ви хочете використовувати формат коду в майбутньому, тобто код відступу з чотирма пробілами.

1
Гаразд, тому є три способи форматування коду (один вбудований і два блоки), і обидва блокові незручні по-різному. Зітхнути.
Пітер Тейлор

4

Perl, 62 байти

Ця функція приймає рядки як аргументи і повертає true або false.

sub f{my@a;for$.(1,-1){$a[ord]+=$.for split//,pop}!grep{$_}@a}

Зберігає значення ASCII в масиві і перевіряє, чи не вирівнюється він. Збільшення до першого слова та зменшення до другого слова.


4

Пітон 3, 107 97 76 64

s=sorted;a,b=input().split(', ')
print(str(s(a)==s(b)).lower())

Очевидно, що це може бути скорочено, якщо ми не сприймемо формулювання ОП буквально і малі букви «правдиві» та «помилкові» ...


Ви можете збрити кілька символів , якщо додати ;s=sortedдо першої рядку , а потім замінити два примірника sortedз sу другому рядку. Чи потрібно зберегти ... 3 символи?
Alex Van Liew

1
Справді. Python 3 також економить трохи місця, і, ймовірно, це розумно використовувати зараз, через 5 років після опублікування цієї відповіді. Також .strip () був надлишковим, враховуючи вказані входи.
Wooble

Так, вибачте. Я не помітив, скільки років було це питання, коли я коментував, лише те, що воно було на головній сторінці. ^^;
Alex Van Liew

4

Пітон, 32 байти

p=sorted
f=lambda a,b:p(a)==p(b)

У python нічого не робить. Ви впевнені, що це повна програма, яка приймає вхід і виробляє результат відповідно до запиту?
Томаш

1
@Tomas Це функція
TuxCrafting

4

Баш, 88 символів

diff <(grep -o .<<<$1|sort) <(grep -o .<<<$2|sort)>/dev/null && echo true || echo false

4

R , 54 байти

function(x,y,`~`=sort,`+`=utf8ToInt)identical(~+x,~+y)

Спробуйте в Інтернеті!


Мене дуже заінтригує ваше використання utf8ToInt не тільки в цій відповіді, але і в багатьох інших, які я бачив.
Sumner18

1
Ви бачили поради щодо гольфу в R ? utf8ToIntі його зворотний шлях, як правило, скорочує розбиття рядків, ніж звичайні функції.
J.Doe

3

Скала в REPL (32)

readLine.sorted==readLine.sorted

Функція Scala (43)

def f(a:String,b:String)=a.sorted==b.sorted

Програма Scala (61)

object A extends App{println(args(0).sorted==args(1).sorted)}

Вони використовують чітку функцію Scala, згідно з якою String також може розглядатися як послідовність символів ( Seq), при цьому всі операції Seqбудуть доступними.


3

APL - 13 символів

{(⍺[⍋⍺])≡⍵[⍋⍵]}

Телефонуйте так:

      'boat' {(⍺[⍋⍺])≡⍵[⍋⍵]} 'baot'
1
      'baot' {(⍺[⍋⍺])≡⍵[⍋⍵]} 'boat'
1
      (,'a') {(⍺[⍋⍺])≡⍵[⍋⍵]} 'aa'
0

В останньому прикладі 'a'представлений один символ, а префікс ,перетворить його в рядок.


3

Java (134 байти)

int[][]c=new int[2][26];
for(int i=0;i<2;i++)for(byte a:args[i].getBytes())c[i][a-97]++;
System.out.print(Arrays.equals(c[0],c[1]));`

Це змушує масив підраховувати кількість появи кожної літери, а потім порівнює масиви, щоб перевірити, чи вони рівні.


1
Ласкаво просимо до PPCG! Гарний перший пост! Ви можете видалити два пробіли (c[0], c[1])та for (int i=0;.
Rɪᴋᴇʀ

3

JavaScript, 41

Функція порівняння (41) :

a=b=>''+[...b].sort()
b=(c,d)=>a(c)==a(d)
alert(b('abc', 'cba')) // true

Функція порівняння (21) :

a=b=>''+[...b].sort()
alert(a('abc') == a('bca')); //true

Функція порівняння (48):

function a(b){return String(b.split('').sort())}
alert(a('abc')==a('bca')); //true

Функція порівняння (78):

function a(b,c){return String(b.split('').sort())==String(c.split('').sort())}
alert(a('abc','bca')); //true

Припускає, що Stringмає splitі Arrayмає sort.


38 байт:c=>d=>(a=b=>''+[...b].sort())(c)==a(d)
Шиеру Асакото
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.