จำนวนการเปลี่ยนลำดับสตริงที่เป็น palindromes


13

ข้อมูลที่คุณป้อนจะเป็นสตริงที่ประกอบด้วยตัวอักษรภาษาอังกฤษตัวเล็ก ๆ

งานของคุณคือกำหนดจำนวนพีชคณิตที่แตกต่างกันของสตริงดั้งเดิมที่เป็นแบบ palindrome

สตริงอินพุตมีได้สูงสุด 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
ฉันต้องดำเนินการอย่างแน่นอนว่า "find unique" ...
Fatalize

2
@ กระชับ: ใช่! ฉันคิดว่าแม้กระทั่ง "นับไม่ซ้ำ" เกิดขึ้นบ่อยครั้งพอในความท้าทายที่อาจจะคุ้มค่ากับการเป็นตัวแทน 1 ไบต์ ในทางกลับกัน "modulo 666013" แทบจะไม่แน่นอน ;-)

5

05AB1E , 17 16 13 ไบต์

-1 ไบต์จาก Jonathon Allan

-3 ไบต์จาก Emigna และ Adnan

œÙ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
คุณสามารถบันทึก 2 ไบต์เพื่อลบคำสั่ง if เนื่องจากคุณมีค่าที่จำเป็นใน stack anyways:œÙvyÂQ}O•E›j•%
Emigna

2
@JonathanAllan คุณสามารถดูตัวเลข (และตัวอักษร) แบบเต็มได้ที่นี่ :)
Adnan

1
อาคาร @ คิดเห็น Emigna œÙvyÂQO•E›j•%ของคุณสามารถบันทึกไบต์อื่นโดยการลบวงเล็บปิด:
Adnan

4

Perl 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)) *

    หากมีความถี่จดหมายคี่มากกว่าหนึ่งความถี่ให้คูณผลลัพธ์ด้วยศูนย์เนื่องจากไม่มี palindromes ในกรณีนั้น

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

    คำนวณจำนวนพีชคณิตเป็นไปได้ของตัวละครที่จะอยู่บน "ด้านใดด้านหนึ่ง" ของแต่ละ palindrome (ซึ่งสอดคล้องกับ MultiSet กับ multiplicities ที่ได้จากการลดลงครึ่งหนึ่งและพื้นความถี่จดหมายใส่) สูตรที่ใช้มาจากPDF นี้ :
    (n 1 + ... + n k )! / (n 1 ! ⋅ ... ⋅n k 1)
    ตัวอย่างเช่นสำหรับความถี่จดหมายที่ป้อนเข้าตัว(2,2,2,7)อักษรที่ด้านหนึ่งของรูปแบบ palindrome เป็นชุดมัลติเซ็ตที่มีหลายหลาก(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. ฉันต้องใช้ ' ประกอบเครื่องหมาย ' (ไม่ใช่ชื่อจริง) permutations(...)เพื่อดึงองค์ประกอบจากวัตถุ มิฉะนั้นชุด ( {...}) จะมีเพียงองค์ประกอบเดียววัตถุตัวเอง
  3. ฉันใช้ set ( {...}) เพื่อเก็บพีชคณิตต่างกันเท่านั้น

ใน 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 นี้ดูเหมือนจะยืนยันคำตอบจากคำตอบของ smls ):

Ñ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.

ใช่มัน%คือ mod
Jonathan Allan

Gah ฉันเป็นเพียงเกี่ยวกับการโพสต์ว่าคำตอบนี้ แต่ไม่ได้มีเวลาเพราะผมโพสต์คำตอบ Brachylog แรก ฉันคิดว่าเป็นเรื่องที่สองในนั้น เห็นได้ชัดว่าฉันควรจำไว้ว่า Jelly เป็นภาษาที่นิยมมากกว่า Brachylog และดังนั้นฉันควรทำงานในการส่งที่แรก

ว้าวไบต์ต่อไบต์? ฉันมีอีก 13 เหมือนกัน แต่คิดว่ามันมีประสิทธิภาพน้อยกว่าเล็กน้อย :)
โจนาธานอัลลัน

ตัวเลขถูกบีบอัดในฐานที่แตกต่างหรืออะไร : P
Yytsi

จากแท็บ TIO Œ!QŒḂ€S%“µɲ€’ของฉัน ที่ดูเหมือน bytewise เหมือนกับฉัน

2

Mathematica ขนาด 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

ฟังก์ชั่นการถ่ายรายการของตัวละครที่เป็นอินพุตและส่งกลับจำนวนเต็ม ไม่สั้นที่สุดเท่าที่มาร์ตินพลิกคำตอบ Mathematicaแต่มันเป็นวิธีการที่น่ารักกระนั้นซึ่งดูเหมือนว่าจะเป็นวิธีการเช่นเดียวกับในsmls ของ Perl 6 คำตอบ

ก่อนอื่นให้t=Last/@Tally@#/2คำนวณจำนวนอักขระที่แตกต่างทั้งหมดในอินพุตหารด้วย2; แล้วi=Floorเดินลงเศษส่วนใด ๆ tที่เกิดขึ้นใน โปรดทราบว่าพีชคณิต palindromic tของที่มีอยู่การป้อนข้อมูลที่ว่าเมื่อมีที่มากที่สุดเลขคี่หนึ่งในข้อหาเดิมนั่นคือเมื่อมีมากที่สุดคนหนึ่งในส่วน เราสามารถทดสอบสิ่งนั้นได้โดยเพิ่มองค์ประกอบทั้งหมดของt-i(โดยใช้Tr): ถ้าคำตอบน้อยกว่า1จะมีวิธีเรียงสับเปลี่ยน palindromic มิฉะนั้นจะไม่

หากมีให้iแสดงจำนวนของอักขระที่แตกต่างในครึ่งซ้ายของพีชคณิตซึ่งสามารถจัดเรียงโดยพลการ จำนวนวิธีที่จะทำคือMultinomialสัมประสิทธิ์ (ความฉลาดของปัจจัยบางอย่าง) ซึ่ง Mathematica มีอยู่แล้วภายใน




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

Ungolfed และการใช้งาน:

#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

Ruby, 67 57 52 59 ตัวอักษร

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

ส่ง Codegolf ควรจะเหมาะสมโปรแกรม / ฟังก์ชั่น / lambdas ไม่เกร็ดเล็กเกร็ดน้อย ฉันไม่ใช่โปรแกรมเมอร์ของ Ruby แต่ฉันคิดว่าคุณสามารถเปลี่ยนมันให้เป็นแลมบ์ดาได้โดยการห่อไว้->s{ }ใช่ไหม?
smls

นอกจากนี้ตามเอกสารประกอบการ(s.size)โต้แย้งไม่ซ้ำซ้อนหรือไม่
smls

1
ฉันทดสอบกับ Ruby 2.4 และใช้งานได้ไม่.to_aดี
smls

@smls ไม่ทำงานบนทับทิม 2.3.3 ( undefined method UNIQ สำหรับ # <Enumerator`) แต่ตอนการทำงานบนทับทิม 2.4 ขอบคุณ :)
Dorian

ผลจะต้องมีการดำเนินการmod 666013?
NonlinearFruit

1

Japt , 20 18 ไบต์

á f_¥Zw} l %666013

บันทึก 2 ไบต์ด้วย ETHproductions

ลองออนไลน์!


เยี่ยมมากนั่นคือสิ่งที่ฉันจะทำ คุณสามารถบันทึกสองไบต์ด้วยf_¥Zw}โดย_ย่อสำหรับZ{Z
ETHproductions

á fêS â l %666013จะช่วยให้คุณประหยัดไบต์
powelles

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! e # รับพีชคณิตที่ไม่ซ้ำกันทั้งหมด
   {_W% =} e # Function เพื่อตรวจสอบว่ารายการเป็น Palindrome หรือไม่
    _ e # ซ้ำ ToS
     W% e # Reverse ToS (กด -1, ดัชนีแบบแยกส่วนของ ToS)
       = e # ตรวจสอบว่า ToS เท่ากับ SToS
         % e # แผนที่
          : + e # Sum (ลดตามการเพิ่ม)
            666013 e # Push 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.