Определите, являются ли строки анаграммами


85

Вызов

Учитывая две строки, определите, есть ли в них одинаковые символы.

пример

вход

слово

Это возвращается, 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 взглядах ... вау!
Том Гуллен

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

5
Запрос названия: Треска Эльф, Иди!

5
"Соколиная ярость, сходи с ума!"
Geobits

7
Мое предложение: «Являются ли они анаграммы» → «Управлять массивами»
Esolanging Fruit

Ответы:


39

Python, 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
@ Томас, ерунда. В вопросе не указана полная программа, поэтому приемлемы либо функция, либо полная программа.
gnibbler

2
@Tomas, большинство ответов здесь не соответствуют вашим критериям. Почему бы не поддержать всех, кто это делает?
gnibbler

4
@ Томас, это не нарушение правил. Некоторые вопросы преднамеренно открыты, как этот, кажется. Сравните с хорошо заданным вопросом, как этот . Если вам не нравится эти ответы жалуются на вопрос спрашивающего
gnibbler

27

Golfscript, 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 к количеству символов для символов quote ( ').
Томас Эдинг

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

20

J, 8

-:&(/:~)

В буквальном смысле, match ( -:) на ( &) сортировать ( /:~)

Образец использования:

   '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"));

Отличная идея с использованием простых чисел.

@ Спасибо, спасибо! Дошло до 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
@Tom, зависит от того, насколько хорошо оптимизированы процедуры сортировки, учитывая, что вы ограничили ввод 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}
Дэвид Мердок

15

Golfscript, 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

Престижность lambdabot и его pointfree рефакторинга .


Может ли код на Haskell, который делает только то, что требуется в runghc, но не при компиляции, все еще называться «программой»?
JB

3
@JB: Может ли Perl-код, который выполняет только то, что perlтребуется, все еще называться «программой»? :-)
Джои Адамс,

JB: Сегодняшние функциональные языки искажают значение программы, делая ее абстракцией более высокого порядка. Вместо того, чтобы просто список инструкций, которые должны быть выполнены, поскольку программа на Haskell может рассматриваться как набор функций, даже если они не вызываются.
Каллум Роджерс

@Callum Rogers: моя точка зрения такова: его код ведет себя по-разному, независимо от того, выполняется ли он в runghc или скомпилирован, в чувствительной к проблеме области. «Функция» в порядке. «Программа» не решает проблему ни при чем, кроме runghc, и runghc - не единственный законный способ запуска программ на Haskell. В этом контексте это делает фрагмент «сценарием runghc», а не «программой на Haskell». - не то, чтобы я считал проблему важной, как я уже сказал, функция в любом случае в порядке и она короче.
JB

2
x#y=sort x==sort yна 1 символ короче
Rotsor

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;вместо пространства имен?
Stackstuck

10

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

Используя схему ввода-вывода решения 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
Рассматривали ли вы заявку на IOCCC ?
Матеин Улхак

9
@muntoo: ты видел что-нибудь в IOCCC? Это слишком читабельно для этого.
Р. Мартиньо Фернандес

@ Martinho Да, исходные коды IOCCC такие красивые. Симфонии. Но он должен хотя бы попытаться сочинить небольшой кусочек. :)
Матин Улхак

@muntoo: я даже не знал, что они все еще активны.
Джои Адамс

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 ++.
Джои Адамс

Локальные переменные, с другой стороны, не обнуляются автоматически.
Джои Адамс

Хорошо, я удалил свое предупреждение, так как я нашел способы обойтись без него.
Мэтью Рид

1
Bzzzt. Вы проходите тестовые случаи, но «helle» и «hollo», очевидно, одинаковы. Легкое исправление: измените один из ++ на -. Тогда просто if (u [i ++]) return 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()вместо строкового бокса:

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. поздравить
TheDoctor


4

Ява

(очевидно, у всех любимый язык!)

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 символа из печати)

Скомпилируйте и запустите:

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

Сед, 45 символов

Это даже возможно в моем любимом - sed! Только одно регулярное выражение для решения анаграммы ! Просто продолжайте удалять соответствующие буквы:

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

(для вызова -nE)

Perl, 48

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

Чтобы быть вызванным с -p.

Perl-функция, 39

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

4

APL, 2 символа

≡⍦

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

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

Просто любопытно, сколько это байтов? 4? 6?
Maltysen

Это зависит от кодировки. 6 байтов в UTF-8, 4 байта в UCS-2, 2 байта, если какой-либо из старых однобайтовых кодировок 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 символов

Проблема ввода / вывода не очень хорошо определена; это читает две строки из стандартного ввода и выводит истину или ложь в стандартный вывод.

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

Python 3, 107 97 76 64

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

Очевидно, что это может быть сокращено, если мы не принимаем буквально формулировку ОП и строчные буквы "правда" и "ложь" ...


Вы можете сбрить несколько символов , если добавить ;s=sortedк первой строке , а затем заменить два экземпляра sortedс sво второй строке. Должны сохранить ... 3 символа?
Алекс Ван Лью

1
На самом деле. Python 3 также экономит место и, вероятно, разумно использовать сейчас, через 5 лет после публикации этого ответа. Кроме того, .strip () был избыточным, учитывая указанные входные данные.
Wooble

Да жаль. Я не заметил, сколько лет было этому вопросу, когда я прокомментировал, только то, что он был на главной странице. ^^;
Алекс Ван Лью

4

Python, 32 байта

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

Ничего не делает в питоне. Вы уверены, что это полная программа, которая принимает входные данные и выдает выходные данные в соответствии с запросом?
Томас

1
@Tomas Это функция
TuxCrafting


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

Функция Скала (43)

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

Скала программа (61)

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

Они используют удобную особенность Scala, благодаря которой строку также можно рассматривать как последовательность символов ( 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! Хороший первый пост! Есть 2 пробела, которые вы можете удалить, (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.