문자열이 아나그램인지 확인


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
13 개의보기에 9 개의 답변 ... 와우!
— Tom Gullen

@Tom, 모두 64 비트 정수 사용에 대한 귀하의 의견이 잘못된 방향을 가리키고 있음을 증명하고자했기 때문에 : P
— Peter Taylor

5
타이틀 요청 : Cod Elf, Go!

5
"팔콘 레이지, 화내!"
— Geobits

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을 lambda로 대체한다는 것입니다.
— gnibbler

1
@ Debanjan, 나는 당신에게 한 문자 만 절약한다고 생각합니다. 여기에 변형을 사용했지만 쉼표로 줄 바꿈을 바꾸기 때문에 길이가 동일합니다.
— gnibbler

4
@Tomas, 말도 안됩니다. 문제는 완전한 프로그램을 지정하지 않기 때문에 어느 함수 나 완전한 프로그램이 허용됩니다.
— gnibbler

2
@Tomas, 여기에 나오는 대부분의 답변이 기준을 통과하지 못했습니다. 왜 모든 사람들에게 공감대를 제공하지 않습니까?
— gnibbler

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, 진심으로? 나는 골프 스크립트를 모르지만 분명히 $ (정렬), $ (정렬), = (비교)
— Peter Taylor

11
이게 바람 피우지 않나요? 변수 입력이 아닙니다. 하드 코딩되어야합니다. 어쨌든 따옴표 ( ') 문자 의 문자 수에 4를 추가 합니다.
— 토마스 에딩

6
현재 규칙에 따라 유효하지 않습니다. 그러나 @JanDvorak의 4 바이트 함수로 변경하면 유효한 입력 형식을 통한 입력을 허용 합니다 .
— Doorknob

20

J, 8

-:&(/:~)

글자 그대로 ( -:)에서 ( &) 정렬 ( /:~)

샘플 사용 :

   '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(dyads) 에서 두 가지 인수를 취합니다 . 내가 제출 한 것은 명백히 dyad입니다. 나는 그것이 요청되지 않았고이 방법으로 더 짧기 때문에 이름을 짓지 않았습니다. 당신이해야 진짜 이름을 지정하려면, 당신은 같은 것을 할 줄 : is_anagram_of =: -:&(/:~)다음과 같이 사용합니다 'a' is_anagram_of 'aa'.
— JB

인수를 코드로 대체하는 것이 약간 저렴하다고 느꼈지만 이제는 본질적으로 dyad라는 것을 알았습니다. 신경 쓰지 마.

29
J는 항상 이모티콘 공장 폭발의 잔해처럼 보입니다.
— st0le

19

자바 스크립트, 192 (157) 152 (147) 125 바이트

이 언어들 중 일부는 생각보다 훨씬 유연합니다! 어쨌든 이것은 내가 추측하는 더 긴 방법이지만 적어도 다른 기술입니다.

압축

더 많은 캐릭터를 뽑아 낸 Peter와 David에게 감사합니다!

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로 줄였습니다.
— Tom Gullen

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}
— Peter Taylor

1
@Tom은 입력을 8 자로 제한했다는 가정하에 정렬 루틴이 얼마나 최적화되었는지에 달려 있습니다 .P
— Peter Taylor

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

하스켈, 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 리팩토링 .


runghc 하에서 원하는 것을 수행하지만 컴파일 할 때는하지 않는 Haskell 코드를 여전히 "프로그램"이라고 할 수 있습니까?
— JB

3
@JB : 원하는 것만하는 Perl 코드를 perl여전히 "프로그램"이라고 할 수 있습니까? :-)
— Joey Adams

JB : 오늘날의 기능적 언어는 프로그램의 의미를 왜곡하여 고차 추상화로 만듭니다. haskell 프로그램은 호출되지 않아도 실행되는 명령 목록이 아니라 함수 모음으로 볼 수 있습니다.
— Callum Rogers

@ Calum Rogers : 내 요점은 문제 코드 영역에서 runghc에서 실행되거나 컴파일되었는지에 관계없이 코드가 다르게 동작한다는 것입니다. "기능"은 괜찮습니다. "프로그램"은 runghc 이외의 다른 문제는 해결하지 못하며, runghc가 Haskell 프로그램을 실행하는 유일한 합법적 인 방법은 아닙니다. 이러한 맥락에서 스 니펫 은 "Haskell 프로그램"이 아니라 "runghc 스크립트 "가됩니다. 내가 말했듯이, 문제가 중요하다고 생각하지는 않습니다. 어쨌든 기능은 훌륭하고 짧습니다.
— JB

2
x#y=sort x==sort y1 자 짧음
— 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 바이트

Peter Taylors Perl 솔루션의 IO 체계 사용 :

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

오류 발생 :-e:1:in '<main>': undefined method 'chars' for nil:NilClass (NoMethodError)
— Tomas

9

C 프로그램, 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 신청을 고려한 적이 있습니까?
— Mateen Ulhaq

9
@muntoo : IOCCC에서 본 적이 있습니까? 이것은 너무 읽기 쉽습니다.
— R. Martinho Fernandes

@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초기화 트릭이 여전히 사용된다는 것입니다.
— ugoren

7

펄, 58 바이트

(기능 일 뿐인 다른 Perl 답변과 달리 완전한 프로그램)

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

함수로서 49

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

물론 "엄격한 / 경고를 사용하지 않고 베어 워드는 문자열이므로 around true 및 false 를 제거하여 프로그램에 4 개의 문자를 저장할 수 있습니다 .
— Joel Berger


나는 이것을 ($c,$d)=map{[sort split//]}@ARGV;exit("@$c"ne"@$d")(51 문자) 로 선호 하므로 명령 줄 인수를 가져 와서 명령 줄 종료 코드를 사용할 수 있습니다. <>여러 줄 입력으로 유지 되는 48 자 입니다.
— Adam Katz

6

클로저-23 자

익명 함수로 :

#(apply = (map sort %))

테스트 사례 예 :

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

좋아, 좋아
— Chiron

1
좋은 대답입니다. 나는 특히 당신이 선택한 테스트 문자열을 좋아한다 ;-)
— coredump

6

자바 스크립트

@zzzzBov의 솔루션을 기반으로합니다.

비교, 65 자 (기능이없는 40 자)

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

비교기, 43 자

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

+""문자열을 강제로 사용하는 영리한 .
— Casey Chu

6

C ++ (104 개의 비 WS 문자)


계산 정렬을 기준으로합니다. 참고 : 같은 길이의 문자열을 가정하고 질문에 의해 암시 된 것처럼 보입니다.

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에서 전역 범위에서 변수를 선언하면 변수가 0으로 초기화됩니다. C ++에서도 마찬가지입니다.
— Joey Adams

반면 지역 변수는 자동으로 0으로 초기화 되지 않습니다 .
— Joey Adams

OK, 나는 그것을하지 않고 할 수있는 방법을 찾았으므로주의를 제거했습니다.
— Matthew 읽기

1
Bzzzt. 테스트 사례를 통과했지만 "helle"과 "hollo"는 분명히 동일합니다. 쉬운 수정 : ++ 중 하나를-로 변경하십시오. 그런 다음 (u [i ++])가 0을 반환하면;
— Dave Gamble

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

자바 스크립트

@zzzzBov 솔루션의 약간 짧은 버전 ( .join() 으로 String boxing 대신 합니다.

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

자바

(모두가 가장 좋아하는 언어입니다!)

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

(println에서 2 문자를 저장하기 위해 개행 문자를 인쇄하지 않습니다)

컴파일하고 실행하십시오.

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

더 짧은 것을보고 싶어요 ...


6.5 년 이상 지속되었지만 (lol) 대신 다음을 추가 java.util.Arrays x=null;하고 사용 하여 10 바이트로 골프를 칠 수 있습니다 . ( 163 bytes ) Java 8로 변환하면 Java 8도 가능합니다. 2011 년에는 아직 없었으므로 유지 도 좋습니다. ; px.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));}}class g{public static void maininterface g{static void mainclass
— Kevin Cruijssen 2018 년

4

sed, 45 자

내가 좋아하는 것에서도 가능하다- sed! 아나그램을 해결하는 단 하나의 정규식 ! 해당 문자를 계속 제거하십시오.

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

(와 함께 호출 -nE )

펄, 48

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

로 호출 -p .

펄 함수, 39

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

4

APL, 2 자

≡⍦

이것은 최첨단 APL 구현 중 하나 인 Nars2000 의 Multiset Match 함수입니다 . 문자열에 적용되면 필요한 함수를 정확하게 계산합니다.

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

궁금한 점이 몇 바이트입니까? 4? 6?
— Maltysen

인코딩에 따라 다릅니다. UTF-8의 6 바이트, UCS-2의 4 바이트, 레거시 단일 바이트 APL 문자 세트 중 하나에 ⍦기호 가 있으면 2 바이트 입니다.
— Tobia

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

죄송합니다-몰랐습니다.
— Geno Racklin Asher

4

펄, 77 75 자

문제의 I / O가 제대로 지정되지 않았습니다. 이것은 stdin에서 두 줄을 읽고 stdout에 true 또는 false 를 출력 합니다 .

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

(77-> 75의 Tim에게 감사합니다)


뭔가 잘못되었다. $a=;? 또한의 괄호 sort와 공백을 건너 뛸 수 있습니다 print.

넷을 통해 코드를 공유하기 위해이 플랫폼을 개발 한 천재 인 @ 팀 (Tim)은 코드 블록에서 사람들이 문자 미만을 피해야한다고 결정했다. 그러나 이건 큰 문제가 아닙니다. 누군가 코드에서 그것들을 사용하는 것과는 다릅니다. 날 계속 잡아 줘
— 피터 테일러

2
좋아, 나는 downvote를 제거했다. 나중에 코드 형식을 사용할 수 있습니다 (예 : 공백이 4 개있는 들여 쓰기 코드).

1
따라서 코드를 형식화하는 방법 에는 세 가지 가 있으며 (하나의 인라인과 두 개의 블록) 두 블록 모두 서로 다른 방식으로 불편합니다. 한숨.
— Peter Taylor

4

펄, 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())

OP의 문구를 문자 그대로 사용하지 않고 소문자 "true"및 "false"를 사용하지 않으면 분명히 단축 될 수 있습니다.


당신이 추가하면 당신은 몇 가지 문자를 면도 할 수 있습니다 ;s=sorted첫 번째 줄에 다음의 두 인스턴스를 교체 sorted와 함께 s두 번째 줄입니다. 3자를 저장해야합니까?
— Alex Van Liew

1
과연. 파이썬 3은 또한 약간의 공간을 절약하며이 답변이 게시 된 지 5 년 후에 지금 사용하는 것이 합리적입니다. 또한 지정된 입력이 주어지면 .strip ()이 중복되었습니다.
— Wooble

그래, 미안 댓글을 달았을 때이 질문이 몇 살인지는 몰랐으며 첫 페이지에 있었다는 것만 알았습니다. ^^;
— Alex Van Liew

4

파이썬, 32 바이트

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

파이썬에서는 아무것도하지 않습니다. 입력을 받아 요청에 따라 출력을 생성하는 완전한 프로그램입니까?
— Tomas

1
@Tomas 그것은 기능입니다
— TuxCrafting

4

배쉬, 88 자

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


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

이것들은 스칼라의 깔끔한 기능을 활용하여 문자열을 일련의 문자 ( Seq) 로 취급 할 수 있으며 모든 작업을 Seq사용할 수 있습니다.


3

APL-13 자

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

이런 식으로 전화하십시오 :

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

마지막 예에서 'a'단일 문자를 나타내며 접두사 ,가 문자 로 변환합니다.


3

자바 (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

자바 스크립트, 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)
— Shieru Asakoto
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.