นับรวมตัวอักษรที่เป็นไปได้ทั้งหมดใน Word


12

คุณได้รับสตริงซึ่งจะมีอักขระ az สามัญ (คุณสามารถสันนิษฐานได้ว่านี่จะเป็นกรณีในการทดสอบใด ๆ และสมมติว่าตัวอักษรทั้งหมดจะเป็นตัวพิมพ์เล็กเช่นกัน) คุณต้องพิจารณาจำนวนชุดค่าผสมที่ไม่ซ้ำกันที่สามารถทำจากอักขระแต่ละตัวในสตริงและพิมพ์หมายเลขนั้น

อย่างไรก็ตามตัวอักษรที่ซ้ำกันสามารถละเว้นได้ในการนับชุดค่าผสมที่เป็นไปได้ กล่าวอีกนัยหนึ่งถ้าสตริงที่กำหนดคือ "สวัสดี" การเปลี่ยนตำแหน่งของทั้งสองlนั้นไม่ถือว่าเป็นวลีที่ไม่ซ้ำกันดังนั้นจึงไม่สามารถนับรวมได้

จำนวนไบต์ที่สั้นที่สุดจะเป็นผู้ชนะรอคอยที่จะเห็นโซลูชันสร้างสรรค์ในภาษาที่ไม่ใช่กอล์ฟ!

ตัวอย่าง:

hello -> 60
aaaaa -> 1
abcde -> 120


4
@Giuseppe ฉันไม่คิดว่านี่เป็นคนหลอกลวง คำถามเฉพาะของคำถามนี้อนุญาตให้มีการนำไปใช้งานที่สั้นกว่ามาก
ArBo

4
การเพิ่มตัวอย่างทดสอบอาจช่วยได้
TSH

1
@JonathanAllan คำแนะนำที่ดี! เปลี่ยนชื่อแล้ว
SimpleGeek

คำตอบ:


29

Python 2 , 50 48 ไบต์

f=lambda s:s==''or len(s)*f(s[1:])/s.count(s[0])

ลองออนไลน์!

ไม่มีบิวด์อินที่น่าเบื่อ! ความประหลาดใจของฉันนี่เป็นวิธีที่สั้นกว่าวิธีเดรัจฉานแรงโดยคำนวณการเรียงสับเปลี่ยนทั้งหมดด้วยitertoolsความยาว

ฟังก์ชั่นนี้ใช้สูตร

# of unique permutations=(# of elements)!unique elements(# of occurences of that element)!

และคำนวณได้ทันที แฟคทอเรียลในตัวเศษคำนวณโดยการคูณด้วยlen(s)ในแต่ละการเรียกใช้ฟังก์ชัน ตัวส่วนนั้นบอบบางกว่าอีกเล็กน้อย ในการโทรแต่ละครั้งเราหารด้วยจำนวนการปรากฏขององค์ประกอบนั้นในสิ่งที่เหลืออยู่ของสตริงเพื่อให้แน่ใจว่าสำหรับตัวละครทุกตัวcตัวเลขทั้งหมดระหว่าง 1 และจำนวนการเกิดของc(รวม) จะถูกหารด้วยหนึ่งครั้ง เนื่องจากเราแบ่งตอนท้ายที่สุดเท่านั้นเราจึงรับประกันว่าจะไม่เกิดปัญหากับการแบ่งพื้นเริ่มต้นของ Python 2


itertools มีความละเอียดมากในชื่อฟังก์ชัน
qwr


7

CJam , 4 ไบต์

le!,

ลองออนไลน์!

คำอธิบาย

อ่านบรรทัดเป็นสตริง ( l), การเรียงสับเปลี่ยนที่ไม่ซ้ำกันเป็นอาร์เรย์ของสตริง ( e!), ความยาว ( ,), การแสดงผลโดยนัย


4
ดูเหมือนว่า "lel" +1! : D
KeyWeeUsr

5

R , 69 65 ไบต์

function(s,`!`=factorial)(!nchar(s))/prod(!table(strsplit(s,"")))

ลองออนไลน์!

บันทึกได้ 4 ไบต์ขอบคุณZahiro Morทั้งสองคำตอบ

คำนวณสัมประสิทธิ์ multinomial โดยตรง

R , 72 68 ไบต์

function(s,x=table(strsplit(s,"")))dmultinom(x,,!!x)*sum(1|x)^sum(x)

ลองออนไลน์!

ใช้ฟังก์ชันการแจกแจงพหุนามที่จัดทำโดยdmultinomเพื่อแยกค่าสัมประสิทธิ์พหุนาม

โปรดทราบว่าปกติ (นักกอล์ฟ) x<-table(strsplit(s,""))ไม่ทำงานภายในการdmultinomโทรด้วยเหตุผลที่ไม่รู้จัก


2
function(s,! =factorial)(!nchar(s))/prod(!table(strsplit(s,""))) จะทำงาน. เอล () เป็น reduntant - โต๊ะรู้ที่จะมองหาองค์ประกอบ ....
Zahiro Mor

1
@ZahiroMor ah แน่นอน ฉันตั้งใจจะทดสอบสิ่งนั้น แต่ไม่เคยไปถึงมัน
Giuseppe

5

JavaScript (Node.js) , 49 ไบต์

t=t*ถูกใช้แทนt*=เพื่อหลีกเลี่ยงข้อผิดพลาดในการปัดเศษ ( |tปัดเศษตัวเลขลง) เพื่อt=t*รับประกันว่าผลลัพธ์กลางทั้งหมด (ตัวดำเนินการที่ชาญฉลาด) เป็นตัวเลขทั้งหมด

a=>[...a].map(g=x=>t=t*y++/(g[x]=-~g[x]),t=y=1)|t

ลองออนไลน์!

a=>
 [...a].map(        // Loop over the characters
  g=x=>
   t=t*             // using t*= instead may result in rounding error 
    y++             // (Length of string)!
    /(g[x]=-~g[x])  // divided by product of (Count of character)!
  ,t=y=1            // Initialization
 )
 |t

2
(ข้อผิดพลาดในการปัดเศษจุดลอยตัวที่เป็นไปได้ใช้t=t*ถ้าคุณต้องการหลีกเลี่ยงปัญหานั้น)
Neil

@Neil Yeah มันล้มเหลวเมื่ออินพุตนั้นaaadegfbbbcccเกิดจากข้อผิดพลาดในการปัดเศษทศนิยม
Shieru Asakoto

หืมคุณพบกรณีทดสอบนั้นได้อย่างไร
Neil

@Neil เพิ่มตัวอักษรลงในสตริงจนกว่าข้อผิดพลาดในการปัดเศษจะเกิดขึ้นฮ่า ๆ
Shieru Asakoto

@ShieruAsakoto เปลี่ยนชื่อแล้ว นับดีกว่ามาก ขอบคุณและคำตอบที่ดี!
SimpleGeek







2

Python 2 , 57 ไบต์

lambda s:len(set(permutations(s)))
from itertools import*

ลองออนไลน์!

การจัดทำเอกสารด้วยตนเอง: คืนความยาวของชุดการเรียงสับเปลี่ยนที่ไม่ซ้ำกันของสตริงอินพุต

Python 3 , 55 ไบต์

เครดิตไปที่ArBoในรายการนี้:

lambda s:len({*permutations(s)})
from itertools import*

ลองออนไลน์!


2

APL (Dyalog Unicode)ขนาด 24 ไบต์

CY'dfns'
{≢∪↓⍵[pmat≢⍵]}

ลองออนไลน์!

Simple Dfn รับค่าสตริงเป็นอาร์กิวเมนต์

วิธี:

CY'dfns'       Copies the 'dfns' namespace.
{≢∪↓⍵[pmat≢⍵]}  Main function
          ≢⍵    Number of elements in the argument (⍵)
      pmat      Permutation Matrix of the range [1..≢⍵]
    ⍵[      ]   Index the argument with that matrix, which generates all permutations of 
               Convert the matrix into a vector of strings
               Keep only the unique elements
               Tally the number of elements

2

Ruby , 41 ไบต์

f=->s{s.chars.permutation.to_a.uniq.size}

ลองออนไลน์!


1
ฉันไม่คิดว่าคุณต้องการto_a
ArBo

1
และสามารถใช้งานฟังก์ชั่นที่ไม่ระบุชื่อ / lambdas เพื่อให้คุณสามารถถอดชิ้นf=ส่วนออกได้ (ใน TIO ย้ายไปยังส่วนหัวจะไม่ได้รับการนับ.)
manatwork


2

Perl 6 , 33 30 ตัวอักษร ( 34 31 ไบต์)

Whateverบล็อก ข้างหน้าค่อนข้างตรง combแยกสตริงออกเป็นตัวอักษรpermutationsรับชุดค่าผสมที่เป็นไปได้ทั้งหมด เนื่องจากวิธีการบีบบังคับที่จะSetต้องแก้ไขjoinก่อน ( »ใช้joinกับแต่ละองค์ประกอบในรายการ)

+*.comb.permutations».join.Set

ลองออนไลน์!

(คำตอบก่อนหน้านี้ใช้.uniqueแต่Setรับประกันความเป็นเอกลักษณ์และนับจำนวนเดียวกันดังนั้นจึงประหยัดได้ 3)


2

K (oK) 12 ไบต์

วิธีการแก้:

#?x@prm@!#x:

ลองออนไลน์!

คำอธิบาย:

ใช้ oK ในตัวprm:

{[x]{[x]$[x;,/x ,''o'x ^/:x;,x]}@$[-8>@x;!x;x]}

... ซึ่งเนื่องจากx^/:xโดยทั่วไปแล้วจะสร้างการเรียงสับเปลี่ยน"helo"ไม่ใช่"hello"ดังนั้นเราต้องสร้างพีชคณิตของ0 1 2 3 4ใช้เพื่อสร้างดัชนีลงไป"hello"แล้วนับจำนวนที่ไม่ซ้ำกัน

#?x@prm@!#x: / the solution
          x: / store input as x
         #   / count (#) length
        !    / range (!) 0..n
    prm@     / apply (@) to function prm
  x@         / apply permutations to input x
 ?           / take the distinct (?)
#            / count (#)

prm เป็นโอเปอเรเตอร์ที่ระบุหรือไม่ ฉันไม่คิดว่าวานิลลา k มีหรือไม่?
Henry Henrinson

Yup - เพียงอยู่ใน oK ตามคู่มือ
streetster

@HenryHenrinson afaik มันไม่ได้อยู่ใน k4 ใน K5 !-nต้นมันเป็น ในช่วงปลาย K5 และ K6 prmมันก็กลายเป็น k7 (shakti) ก็มีprmเหมือนกัน
นิก

2

Java 8, 103 102 ไบต์

s->{int r=1,i=s.length();for(;i>0;)r=r*i/~-s.substring(--i).split(s.charAt(i)+"",-1).length;return r;}

พอร์ตของ @ArBo 's งูหลาม 2 คำตอบ
-1 ไบต์ต้องขอบคุณ @ OlivierGrégoireด้วยการทำซ้ำซ้ำแล้วซ้ำอีก

ลองออนไลน์

สร้างพีชคณิตที่ไม่เหมือนใครทั้งหมดใน Set และรับขนาดจริง 221 ไบต์ :

import java.util.*;s->{Set S=new HashSet();p(s,S,0,s.length()-1);return S.size();}void p(String s,Set S,int l,int r){for(int i=l;i<=r;p(s.replaceAll("(.{"+l+"})(.)(.{"+(i++-l)+"})(.)(.*)","$1$4$3$2$5"),S,l+1,r))S.add(s);}

ลองออนไลน์


เอาล่ะฉันจะทำได้กอล์ฟไบต์โดยการทำให้มันซ้ำแทน recursive s->{int r=1,i=s.length();for(;i>0;)r=r*i/~-s.substring(--i).split(s.charAt(i)+"",-1).length;return r;}นี้:
Olivier Grégoire

@ OlivierGrégoireขอบคุณ! แต่คุณเห็นอะไรที่จะทำให้แนวทางที่สอง (สร้างการเรียงสับเปลี่ยนที่ไม่ซ้ำกันทั้งหมดในชุด) สั้นลงหรือไม่? ฉันมีความรู้สึกว่าสามารถบันทึกบางไบต์ได้ แต่ลองทำบางสิ่งและส่วนใหญ่ยาวกว่าเล็กน้อยแทนที่จะสั้นกว่า .. แต่ก็ยังดูยาวเกินไป
Kevin Cruijssen

ฉันใช้มันพยายามใช้กระแสและนับเช่นนี้s->{long r=1,i=s.length();for(;i>0;)r=r*i/(s.chars().skip(--i).filter(c -> c==s.charAt(i)).count()+1);return r;}แต่ไม่ประสบความสำเร็จ ...
Olivier Grégoire

1

MATL , 9 ไบต์

jY@XuZy1)

ลองออนไลน์!

คำอธิบาย:

j input as string
Y@ get permutations
Xu unique members
Zy size matrix
1) first member of size matrix

2
คุณสามารถรับอินพุตด้วยเครื่องหมายคำพูดดังนั้นjกลายเป็นiซึ่งสามารถปล่อยให้อยู่โดยปริยาย นอกจากนี้&nxจะบันทึกไบต์ด้วยZy1) tio.run/##y00syfn/P9IholQtr@L/f/WM1JycfHUA
Luis Mendo

1

ระดับแปดเสียง / MATLAB, 35 ไบต์

@(s)size(unique(perms(s),'rows'),1)

ฟังก์ชั่นไม่ระบุชื่อที่ใช้เวกเตอร์อักขระและสร้างตัวเลข

ใน MATLAB สามารถย่อให้เหลือsize(unique(perms(s),'ro'),1)(33 ไบต์)

ลองออนไลน์!

คำอธิบาย

@(s)                                  % Anonymous function with input s
                perms(s)              % Permutations. Gives a char matrix
         unique(        ,'rows')      % Deduplicate rows
    size(                       ,1)   % Number of rows

1
ฉันคิดว่าuniqueคืนแถวที่ไม่ซ้ำกันแล้ว? หรือว่าเฉพาะสำหรับtables?
Giuseppe

@Giuseppe สำหรับอาร์เรย์ 2 มิติที่เป็นตัวเลข / อักขระuniqueจะเป็นเชิงเส้นก่อน สำหรับตารางฉันคิดว่าคุณพูดถูก ฉันไม่รู้ว่า!
Luis Mendo ใน

1
โอ้ฉันรู้ว่าฉันมีความคิด - uniqueใน MATLAB จะใช้เวลาแถวสำหรับtables; R's uniqueรับแถวของเมทริกซ์หรือเฟรมข้อมูลที่ไม่ซ้ำกัน ภาษาอาเรย์จำนวนมากเกินไปที่มีคำสั่งเดียวกับที่ทำสิ่งที่แตกต่างออกไปเล็กน้อย ...
จูเซปเป้

1

เรติน่า 0.8.2 , 73 ไบต์

(.)(?=(.*?\1)*)
/1$#2$*1x1$.'$*
^
1
+`1(?=1*/(1+)x(\1)+$)|/1+x1+$
$#2$*
1

ลองออนไลน์! ใช้สูตรของ @ ArBo แต่ประเมินจากขวาไปซ้ายเนื่องจากสามารถดำเนินการเป็นเลขจำนวนเต็มในขณะที่ยังลดขนาดของค่า unary ที่เกี่ยวข้อง คำอธิบาย:

(.)(?=(.*?\1)*)
/1$#2$*1x1$.'$*

สำหรับตัวละครแต่ละตัวให้นับจำนวนที่ซ้ำกันที่เหลืออยู่และจำนวนตัวละครที่เหลืออยู่เพิ่มอีกหนึ่งตัวเพื่อนำตัวละครปัจจุบันเข้ามาพิจารณาและแยกค่าเพื่อให้เรารู้ว่าตัวไหนจะถูกแบ่งและที่จะคูณ .

^
1

นำหน้า 1 เพื่อสร้างนิพจน์ที่สมบูรณ์

+`1(?=1*/(1+)x(\1)+$)|/1+x1+$
$#2$*

ทวีคูณทวีคูณตัวเลขสุดท้ายและสามในขณะที่หารด้วยตัวเลขสุดท้ายที่สอง สิ่งนี้จะแทนที่ตัวเลขสามตัวสุดท้าย

1

แปลงเป็นทศนิยม


1

K, 27 ไบต์

*/[1+!#:x]%*/{*/1+!x}'#:'x:

K, 16 ไบต์ - ไม่ใช่คำตอบที่แท้จริง

#?(999999#0N)?\:

ใช้การเปลี่ยนลำดับแบบสุ่ม 999999 ของสตริงอินพุตนำชุดที่ไม่ซ้ำกันและนับความยาว ส่วนใหญ่เวลาจะให้คำตอบที่ถูกต้องสำหรับสตริงสั้น ๆ

ปรับปรุงด้วย @Sriotchilism O'Zaic @Selcuk


2
ยินดีต้อนรับสู่เว็บไซต์! ไม่สำคัญเพราะมันไม่ถูกต้อง แต่คุณสามารถทำให้คำตอบที่ไม่ถูกต้องแม่นยำยิ่งขึ้นโดยใช้999999แทนได้100000หรือไม่?
Ad Hoc Garf Hunter

ใช่ความคิดที่ดีขอบคุณ
Henry Henrinson

1
และอาจแก้ไขคำอธิบายเพื่อสะท้อนการเปลี่ยนแปลงนั้นด้วย
Selcuk

1

ภาษา Wolfram (Mathematica)ขนาด 32 ไบต์

Characters/*Permutations/*Length

ลองออนไลน์!

คำอธิบาย: การจัดองค์ประกอบด้านขวาด้วยการ/*ใช้ตัวดำเนินการทั้งสามนี้อย่างใดอย่างหนึ่งหลังจากที่อื่น ๆ เพื่อโต้แย้งฟังก์ชั่นจากซ้ายไปขวา:

  • Characters แปลงสตริงอินพุตเป็นรายการของอักขระ

  • Permutations ทำรายการการเรียงสับเปลี่ยนที่ไม่ซ้ำกันทั้งหมดของรายการตัวละครนี้

  • Length ส่งคืนความยาวของรายการการเปลี่ยนลำดับที่ไม่ซ้ำกันนี้

วิธีนี้จะสิ้นเปลืองมากสำหรับสตริงที่ยาว: การเรียงสับเปลี่ยนที่ไม่ซ้ำกันจริง ๆ แล้วจะแสดงรายการและนับแทนการใช้ a Multinomialเพื่อคำนวณจำนวนโดยไม่ต้องแสดงรายการ



1

Pyth , 5 4 ไบต์

l{.p

ลองออนไลน์!

นี่ถือว่าการป้อนข้อมูลเป็นสตริงตัวอักษรหลาม หากอินพุตต้องเป็นข้อความแบบดิบเวอร์ชัน 5 ไบต์นี้จะทำงาน:

l{.pz

ไม่ว่าจะด้วยวิธีใดก็เพียงคำนวณพีชคณิตทั้งหมดของอินพุตเป็นรายการขจัดข้อมูลซ้ำซ้อนและรับจำนวนองค์ประกอบในนั้นและพิมพ์ตัวเลขนั้นโดยปริยาย

-1 ไบต์ขอบคุณ @ hakr14


{deduplicates .{รายการไบต์น้อยกว่า
hakr14




โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.