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


85

도전

두 개의 줄이 주어지면 둘 다 정확히 같은 문자가 있는지 확인하십시오.

입력

단어, wrdo

이것은 true동일하지만 스크램블 되었기 때문에 반환 됩니다.

입력

단어, wwro

이 반환합니다 false.

입력

보트, 토바

이 반환 true

규칙

여기 규칙이 있습니다!

  • 입력이 1 자 이상이고 8 자 이하 여야한다고 가정하십시오.
  • 특별한 문자는없고 az
  • 모든 입력은 소문자로 가정 할 수 있습니다

테스트 사례

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 구현 중 하나 인 Nars2000Multiset 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

Stringsplit있고 Array있다고 가정합니다 sort.


38 바이트 :c=>d=>(a=b=>''+[...b].sort())(c)==a(d)
Shieru Asakoto
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.