회 문인 문자열 순열 수


13

입력은 작은 영어 문자로 구성된 문자열입니다.

당신의 임무는 회문 인 원래 문자열의 별개의 순열 수를 결정하는 것입니다.

입력 문자열은 최대 100 자입니다. 더 긴 문자열의 경우 결과가 매우 클 수 있으므로 출력은 순열 수 모듈로 666013이어야합니다.

예를 들어

cababaa -> 3

가능한 순열은 다음과 같습니다.

aabcbaa
abacaba
baacaab

이것은 이므로 가장 짧은 답변이 이깁니다!


2
"문자열에 최대 100 자리 숫자가 부여되면 결과는 % 666013이어야합니다." 그렇다면 해당 테스트 사례를 포함하는 것이 좋습니다.
Martin Ender

4
% 666013 줄을 이해하지 못합니다. 그러나 이것은 유망한 도전이며, 일단 설명이 다시 열리면 기꺼이 투표 할 것입니다.

12
오, 이제 편집이 완료되었습니다. 나는 그 라인이 도전에 추가한다고 생각하지 않는다. 그것은 대부분 임의 정밀도 정수가없는 언어를 처벌합니다. 일반적으로 "무제한 정수를 사용하여 가상의 언어 버전으로 실행하는 경우 정답이 맞아야합니다"와 같은 작업을 수행합니다.

7
실제로 더 많은 테스트 사례를 사용할 수 있습니다.
smls

3
테스트 케이스에 대한 제안 (하지만 그들을 확인하시기 바랍니다) : abcdabcddddd -> 120 (어떤 이상한 글자 수) , abcdabcdddddd -> 120 (홀수 번째 글자 수) , abcdabcddddddeee -> 0 (이 이상한 문자 카운트) , aabbccddeeffgghhiijj -> 298735 (모듈로 영향을받는) .
smls

답변:


5

Brachylog (2), 15 바이트

{p.↔}ᶠdl%₆₆₆₀₁₃

온라인으로 사용해보십시오!

설명

{p.↔}ᶠdl%₆₆₆₀₁₃
{   }ᶠdl          Count (l) the number of distinct (d) results (ᶠ) obtainable by:
 p                  permuting {the input}
  .                 to produce an output
   ↔                that, if reversed, is still the output
        %₆₆₆₀₁₃   then take that number modulo 666013

2
나는 그 "고유 한 것을 찾아라"는 것을 확실히 구현할 필요가있다.
Fatalize

2
@ 운명 : 예! "독특한 수"조차도 1 바이트 표현의 가치가있는 도전에서 충분히 발생한다고 생각합니다. 반면에 "modulo 666013"은 거의 확실하지 않습니다 ;-)

5

05AB1E , 17 16 13 바이트

Jonathon Allan에서 -1 바이트

Emigna와 Adnan에서 -3 바이트

œÙvyÂQO•E›j•%

설명:

œÙ                # Unique permutations of [implicit] input
  vy              # For each permutation...
    ÂQ            # Check if it is a palindrome
      O           # If so, increment the counter
       •E›j•%     # Modulo 666013 (no clue why this number, or even why this rule is in place)

온라인으로 사용해보십시오!


1
내용 은을 기준으로 변환 된 E›j숫자 [14, 116, 45]를 나타내며이 214됩니다 14*214^2 + 116*214 + 45 = 666013. 나는 숫자에 대한 참조가 어디에 있는지 잘 모르겠지만 정보 페이지 의 순서와 일치하는 것처럼 보입니다 (ish?) . @Adnan은 우리를 깨우칠 수 있습니다.
Jonathan Allan

1
@Emigna 당신이 언어를 알고있을 때 쉬움 : D
Jonathan Allan

1
스택에 필요한 값만 있기 때문에 if 문을 제거하여 2 바이트를 절약 할 수 있습니다.œÙvyÂQ}O•E›j•%
Emigna

2
@JonathanAllan 전체 자릿수 (및 문자)는 여기 에서 찾을 수 있습니다 . :)
Adnan

1
@Emigna의 의견을 바탕으로 닫는 대괄호를 제거하여 다른 바이트를 저장할 수 있습니다 œÙvyÂQO•E›j•%.
Adnan

4

펄 (6) , 104 (108) 88 84 바이트

{my &f={[*] 1..$_ div 2}
.comb.Bag{*}.&{(2>.grep(*%2))*f(.sum)/[*]($_».&f)%666013}}

온라인으로 사용해보십시오!

작동 원리

천문학적 런타임이 허용되는 경우에도 Perl 6의 내장 permutations루틴은 20 개 이상의 요소 목록을 바꾸지 않고 작업 설명에 최대 100 개의 입력이 필요 하기 때문에 모든 순열을 쉽게 생성하고 필터링 할 수 없습니다. 문자.

대신 입력의 문자 주파수를 기반으로 직접 수식을 사용합니다.

  1. 내 & f = {[*] 1 .. $ _ div 2}

    숫자를 반으로 나누고 가장 가까운 정수로 내림 한 다음 그 계승을 취하는 도우미 함수입니다.

  2. .comb.Bag {*}. & {};

    입력 문자열에서 문자 빈도를 계산 하고 나머지 코드에 대한 주제 로 만듭니다 . 예를 들어 입력을 위해 abcdabcdddddd이것은 목록이 될 것 (2, 2, 2, 7)입니다.

  3. (2> .grep (* % 2)) *

    홀수 문자 빈도가 둘 이상인 경우 회문이 불가능하므로 결과에 0을 곱하십시오.

  4. f (.sum) / [*] ($ _». & f)

    각 회 문의 "한쪽"에있을 문자의 가능한 순열 수를 계산합니다 (입력 문자 빈도를 반으로 줄임으로써 다중성을 갖는 다중 집합에 해당) . 사용 된 공식은 이 PDF의 것입니다 :
    (n 1 + ... + n k )! / (n은 1 ! ⋅ ⋅n ... K (1))
    예 : 문자 입력 주파수에 대해 (2,2,2,7), 문자에 하나 개 회문 형태와 다중성 MULTISET 측면 (1,1,1,3)및 순열의 개수는 따라서이다 (1+1+1+3)! / (1!⋅1!⋅1!⋅3!) = 120.

  5. % 666013

    결과 모듈로 666013을 가져옵니다.


대체 방법이 유효 하다는 것을 알게되어 기쁩니다!
Jonathan Allan

3

Python3, 81 80 바이트

from itertools import*
lambda s:sum(a==a[::-1]for a in{*permutations(s)})%666013

이것은 내가 생각해 낼 수있는 가장 짧은 것입니다. 순열을 더 쉽게 생성 할 수 있는지 확실하지 않습니다 ...

설명

lambda s:                       # Anonymous function taking a parameter <s>. 
    sum(                        # Sum the following terms.
        a==a[::-1]              # Check whether the permutation <a> is a palindrome,
        for a in                # for each element <a>,
        {                       # inside a set that can only contain distinct elements.
            *                   # Splat the elements of the following object:
            permutations(s)     # the permutations of the input parameter <s>.
        }                       #
    )%666013                    # Modulo the sum by 666013.

노트

  1. 이 검사 a==a[::-1]는 부울 값을 반환하지만 sum(...)함수는이를 암시 적으로 정수 (0 또는 1)로 캐스팅하고 그에 따라 합산합니다.
  2. 객체에서 요소를 추출하려면 실제 이름이 아닌 ' splat operator ' 를 사용해야 합니다 permutations(...). 그렇지 않으면 집합 ( {...})에는 하나의 요소 인 개체 자체 만 포함됩니다.
  3. {...}내부에 고유 한 순열 만 유지하기 위해 집합 ( )을 사용합니다 .

Floroid에서 이것은 (거의) z(T(a==aDKaIW(cb(L)))%666013)이지만 대신 결과를 인쇄하고 명령 행을 통해 입력을받습니다.

바이트를 저장해 준 @Jonathan Allan 에게 감사합니다 ! -> import스타일 변경

온라인으로 사용해보십시오!


3

젤리 , 13 바이트

Œ!QŒḂ€S%“µɲ€’

온라인으로 사용해보십시오!

어떻게?

무차별 대입.

Œ!QŒḂ€S%“µɲ€’ - Main link: string
Œ!            - all permutations
  Q           - unique
     €        - for each
   ŒḂ         - isPalindromic? (yep a built-in!)
      S       - sum
       %      - mod
        “µɲ€’ - base 250 compressed number 666013

내가 믿는 것을 보다 효율적으로 그것을 할 것입니다,하지만 그건 30 바이트 (편집 : 이 PDF는 그것을 확인하는 것,의 호의 개의 SML의 대답 )

ÑHḞµS!÷!P$ - Link 1, palindrome count: string a    e.g. 'abcabcd'
Ñ          - call the next link (2) as a monad(a)  e.g. [2, 2, 2, 1]
 H         - halve                                 e.g. [1, 1, 1, 0.5]
  Ḟ        - floor (get pair counts)               e.g. [1, 1, 1, 0]
   µ       - start a new monadic chain - call that p
    S      - sum(p)                                e.g. 3
     !     - factorial                             e.g. 6
         $ - last 2 links as a monad:
       !   -     factorial(p) (vectorises)         e.g. [1, 1, 1, 1]
        P  -     product                           e.g. 1
      :    - integer division                      e.g. 6

ĠL€ - Link 2, count characters: string a           e.g. 'abcabcd'
Ġ   - group indexes                                e.g. [[1, 4], [2, 5], [3, 6], 7]
 L€ - length of €ach                               e.g. [2, 2, 2, 1]

ÇḂS⁼LḂ$aÑ%“µɲ€’ - Main link: string a              e.g. 'abcabcd'
                - first check to see if any palindromes will be possible:
Ç               - last link (2) as a monad         e.g. [2, 2, 2, 1]
 Ḃ              - mod 2                            e.g. [0, 0, 0, 1]
  S             - sum                              e.g. 1
      $         - last two links as a monad:
    L           -     length(a string)             e.g. 7
     Ḃ          -     mod 2                        e.g. 1
   ⁼            - equal?                           e.g. 1 (1 when palindromes are possible)
       a        - and
        Ñ       - next link as a monad             e.g. 6
         %“µɲ€’ - mod 666013, as in the brute force version.

그렇습니다, %모드입니다.
Jonathan Allan

Gah, 나는 이 답변을 정확히 게시 하려고했지만 Brachylog 답변을 먼저 게시했기 때문에 제 시간에 도착하지 못했습니다. 두 번째 문제는 제 생각입니다. Jelly는 Brachylog보다 더 대중적인 언어라는 것을 분명히 기억해야하므로 먼저 해당 제출 작업을 수행해야합니다.

와우 바이트? 나는 또 다른 13도 가지고 있지만 약간 덜 효율적이라고 생각합니다 :)
Jonathan Allan

숫자가 다른 기준으로 압축되어 있습니까? : P
Yytsi

내 TIO 탭에서 Œ!QŒḂ€S%“µɲ€’. 그것은 바이트와 동일하게 보입니다.

2

수학, 46 바이트

Permutations@#~Count~_?PalindromeQ~Mod~666013&

문자 목록을 입력으로 사용합니다.

실제로 입력의 모든 순열을 생성 한 다음 회문을 계산하기 때문에 매우 비효율적입니다.


0문자열에 이상한 다중도 (예 :)가 여러 문자로 표시되어 있으면 이것이 아닌 긍정적 인 대답을 제공한다고 생각합니다 "abcdabcddddddeee".
Greg Martin

@GregMartin 감사합니다. 어쨌든 이것은 불필요하게 복잡했습니다.
Martin Ender

2

Mathematica, 68 바이트

If[i=Floor[t=Last/@Tally@#/2];Tr[t-i]<1,Multinomial@@i,0]~Mod~666013

문자 목록을 입력으로 받아서 정수를 리턴하는 순수 함수. Martin Ender의 Mathematica 답변 만큼 짧지는 않지만 그럼에도 불구하고 smls의 Perl 6 답변 과 동일한 접근법 인 것처럼 보이는 귀여운 접근법 입니다.

먼저 t=Last/@Tally@#/2입력의 모든 고유 문자 수를 2;로 나눈 값을 계산합니다 . 그런 다음 i=Floor에서 발생하는 분수 를 반올림합니다 t. 입력의 회문 치환은 원래 카운트 중 홀수가 최대 1 개일 때, 즉에 최대 1 개의 분수가있을 때 정확하게 존재합니다 t. 우리는 t-i(을 사용하여 Tr) 의 모든 요소를 ​​간단히 추가하여 테스트 할 수 있습니다 . 답이보다 작 으면 1회문 순열이 있습니다.

있는 경우 i순열의 왼쪽 절반에있는 개별 문자의 수 를 나타내며 임의로 배열 할 수 있습니다. 그렇게하는 방법의 수는 MultinomialMathematica가 내장 한 계수 (특정 계승의 몫)입니다.


1

k, 23 바이트

{666013!+/{x~|x}'cmb x}

oK를 사용 하거나 cmb존재하지 않는 경우 prm대신을 사용하십시오 cmb.



1

C ++ 14, 161 바이트

명명되지 않은 람다처럼 입력을 가정 std::string하고 참조 매개 변수를 통해 반환 한다고 가정합니다 .

#import<algorithm>
[](auto s,int&n){auto a=s.begin(),b=s.end();std::sort(a,b);n=0;do n=(n+std::equal(a,b,s.rbegin()))%666013;while(std::next_permutation(a,b));}

언 골프 및 사용법 :

#include<iostream>
#include<string>

#import<algorithm>
auto f=
[](auto s,int&n){
 auto a=s.begin(),b=s.end();
 std::sort(a,b);
 n=0;
 do
  n=(n+std::equal(a,b,s.rbegin()))%666013;
 while(std::next_permutation(a,b));
}
;

using namespace std;


int main(){
 string s;
 s = "cababaa";
 s = "abcdabcddddd";
 int n;
 f(s,n);
 cout << n << endl;
}

1

루비, 67 57 52 59 자

->s{s.chars.permutation.uniq.count{|t|t.reverse==t}%666013}

Codegolf 제출은 스 니펫이 아닌 적절한 프로그램 / 기능 / 람다 여야합니다 . 나는 루비 프로그래머가 아니지만 이것을 감싸서 람다로 바꿀 수 있다고 생각 ->s{ }합니다.
smls

또한 documentation 에 따르면 (s.size)인수가 중복 되지 않습니까?
smls

1
Ruby 2.4에서 테스트했으며 .to_a너무 작동하지 않습니다.
smls

@smls하지 않습니다 루비 2.3.3 (에 작업 undefined method , 감사 :) # <Enumerator`에 대한 UNIQ '),하지만 지금은 루비 2.4에서 작동
도리안

결과를 가져와야합니까 mod 666013?
NonlinearFruit


0

MATL, 13 바이트

Y@Xu!"@tP=Avs

MATL Online 에서 사용해보십시오

설명

        % Implicitly grab input as a string
Y@      % Compute all permutations of the inputs (one per row)
Xu      % Determine the unique rows
!       % Take the transpose so each permutation is a column
"       % For each unique permutation
  @     % Take this permutation
  tP=A  % Duplicate it, reverse it, and compare (yields 1 for palindrome and 0 otherwise)
  v     % Vertically concatenate the entire stack
  s     % Compute the sum of all elements
        % Implicitly end for loop and display the result

0

CJam , 19 바이트

qe!{_W%=}%:+666013%

온라인으로 사용해보십시오!

설명:

qe! {_ W % =} % : + 666013 % e # 전체 프로그램.
qe # 모든 입력을받습니다.
 이자형! e # 고유 순열을 모두 구합니다.
   {_W % =} e # 목록이 회문인지 확인하는 함수.
    _ e # 중복 된 ToS.
     W % e # Reverse ToS (-1을 누르고 ToS의 모듈 식 인덱스).
       = e # ToS가 SToS와 같은지 확인하십시오.
         % e # 맵.
          : + e # Sum (더하기로 줄임).
            666013 e # 666013을 누릅니다.
                  % e # 모듈로.


0

옴, 17 바이트

I⌐:_₧?¡;;¼,

설명:

I⌐:_₧?¡;;¼,  ■Main wire
I⌐:     ;    ■for _ in permutations(input()){
   _₧? ;     ■  if(palindrome(_)){
      ¡      ■    counter++;
       ;     ■  }
        ;    ■}
         ¼,  ■print(counter)

0

PHP, 182 바이트

function f($a,$b=1){return$a?f($a-1,bcmul($a,$b)):$b;}$a=count_chars($argv[1],$r=1);foreach($a as$v){$c+=$v%2?:0;$c>1?die("0"):$z+=$f=$v/2^0;$r=bcmul(f($f),$r);}echo bcdiv(f($z),$r);

온라인 버전

고장

function f($a,$b=1){  #Factorial
    return$a?f($a-1,bcmul($a,$b)):$b;
}
$a=count_chars($argv[1],$r=1); # Array count for every char
foreach($a as$v){
    $c+=$v%2?:0; # counter mod 2 ==1
    $c>1?die("0"):$z+=$f=$v/2^0; # end program if there are 2 chars which cannot divide by 2
    $r=bcmul(f($f),$r);
}
echo bcdiv(f($z),$r);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.