สร้างชุดค่าผสมที่มีคำสั่งด้วยการทำซ้ำ


9

กำหนดสตริงของอักขระที่แตกต่างกันและตัวเลข n สร้างชุดค่าผสมที่เรียงลำดับทั้งหมดด้วยการทำซ้ำความยาว 1 ถึง n โดยใช้อักขระเหล่านั้น

อีกวิธีในการกำหนดคือดูอักขระที่กำหนดเป็นตัวเลข "กำหนดเอง" ในฐาน (radix) ของจำนวนอักขระจากนั้นโปรแกรมควรสร้าง "ตัวเลข" ทั้งหมดที่มี 1 ถึง n หลักในฐานนั้น "ศูนย์" รวมอยู่ด้วย

ชุดค่าผสมควรเรียงตามความยาว (1 ตัวอักษรก่อนจากนั้น 2 และอื่น ๆ ) แต่นอกเหนือจากนั้นสามารถเรียงลำดับได้ คุณสามารถเลือกวิธีที่สะดวกที่สุดในการจัดการอินพุตและเอาต์พุต รหัสที่สั้นที่สุดชนะ

ตัวอย่าง:

ab, 3-> a,b,aa,ab,ba,bb,aaa,aab,aba,baa,abb,bab,bba,bbb
0123456789, 2->0,1,2,3,4,5,6,7,8,9,00,01,...,09,10,11,...,99


อย่างจริงจัง? "นับ"?
Peter Taylor

@PeterTaylor คุณหมายถึงอะไร?
aditsu ออกจากเพราะ SE นั้นชั่วร้าย

2
คุณรับรู้ในปัญหา thep ที่คุณเพียงแค่ขอให้ผู้คนนับ คุณไม่คิดว่ามันเป็นคนที่มักน้อยหรือเปล่า?
Peter Taylor

3
@PeterTaylor มันไม่ได้นับตรงไปตรงมาแม้แต่ตอนที่ใช้ฐาน 10 หลัก ฉันต้องการจะดูวิธีการทำในรหัสที่สั้นที่สุด มันไม่ได้ตั้งใจจะเป็นเรื่องยาก ฉันได้เห็นคำถามที่น่ารำคาญมากขึ้นและไม่คิดว่าจะเป็นปัญหา
aditsu เลิกเพราะ SE นั้นชั่วร้าย

นอกจากนี้ยังมีปัญหาอย่างน้อยสองสามข้อที่ฉันสามารถใช้สิ่งนี้ได้ :)
aditsu ออกเพราะ SE นั้นชั่วร้าย

คำตอบ:


4

APL (Dyalog Unicode) , 13 ไบต์SBCS

⊃,/,¨∘.,\⎕⍴⊂⍞

ลองออนไลน์!

ไม่เคยพลาดโอกาสที่จะใช้การสแกน :)

แจ้งให้มีสตริงของ "หลัก" และจากนั้นสำหรับ n

ขอบคุณ @ Adámที่บอกวิธีเปิดใช้งาน]boxTIO


5

Python 2, 56 ไบต์

nคือความยาวสูงสุดและsคาดว่าจะเป็นรายการอักขระ ไม่ชัดเจนสำหรับฉันว่าn = 0หรือรายการอักขระว่างเปล่าเป็นอินพุตที่ถูกต้อง แต่ฟังก์ชั่นนี้ยังจัดการกับมันได้อย่างถูกต้อง

f=lambda s,n:n*s and s+[x+c for x in f(s,n-1)for c in s]


3

APL (31)

{,/⍺∘{↓⍉⍺[1+(⍵⍴⍴⍺)⊤⍳⍵*⍨⍴⍺]}¨⍳⍵}

การใช้งาน: อาร์กิวเมนต์ซ้ายคือสตริงและอาร์กิวเมนต์ขวาคือตัวเลขดังนี้:

    'ab'{,/⍺∘{↓⍉⍺[1+(⍵⍴⍴⍺)⊤⍳⍵*⍨⍴⍺]}¨⍳⍵}3
b  a  ab  ba  bb  aa  aab  aba  abb  baa  bab  bba  bbb  aaa  

เอาต์พุตเรียงตามความยาว แต่ภายในกลุ่มความยาวที่ถูกเลื่อนไปทางซ้ายนี่เป็นวิธีที่ง่ายที่สุด

คำอธิบาย:

  • ,/⍺∘{... }¨⍳⍵: สำหรับ1..⍵ใช้ฟังก์ชั่นกับ⍺และเข้าร่วมผลลัพธ์ด้วยกัน
  • (⍵⍴⍴⍺)⊤⍳⍵*⍨⍴⍺: สำหรับแต่ละหมายเลขตั้งแต่ 1 ถึง (⍵ = (ความยาวปัจจุบัน)) ^ (⍴⍺ = (จำนวนตัวอักษร)) ให้แปลงเป็นฐาน⍴⍺โดยใช้ตัวเลข.
  • 1+: เพิ่มหนึ่งรายการเนื่องจากอาร์เรย์ได้รับการจัดทำดัชนี 1 รายการ
  • ⍺[... ]: ใช้สิ่งเหล่านี้เป็นดัชนีในสตริง
  • ↓⍉: หมุนเมทริกซ์ดังนั้น 'ตัวเลข' จึงอยู่ในแถวแทนที่จะอยู่ในคอลัมน์แล้วแยกเมทริกซ์ขึ้นเป็นแถว

1
APL มีการเข้ารหัสไบต์เดียวสำหรับสัญลักษณ์หรือไม่
aditsu ออกจากเพราะ SE นั้นชั่วร้าย

@aditsu: Dyalog APL ใช้ Unicode ฉันเดาว่า APL ที่ทันสมัยอื่น ๆ จะทำเช่นเดียวกัน อย่างไรก็ตามก่อนที่จะมี Unicode คุณต้องใช้เพจรหัสดังนั้นจึงเป็นไปได้
marinus

ฉันถามเป็นหลักเพราะฉันกังวลเกี่ยวกับไม่ ของไบต์เทียบกับไม่ ของตัวละคร ฉันไม่ทราบว่ามีสัญลักษณ์ที่แตกต่างกันมากมายที่ใช้ APL
aditsu ออกเพราะ SE ไม่ทำงาน

นอกจากว่าฉันลืมบางอย่างหรือผิดพลาดไปแล้ว Dyalog APL มีฟังก์ชั่นและตัวดำเนินการ 74 ตัวซึ่งจะประกอบไปด้วยไบต์พร้อมกับ ASCII 7 บิตได้ดี และยังมีการทับซ้อนกันระหว่างตัวละครกับตัวละครปกติอย่างเช่น?!/\-+*~&=,.|และอาจมากกว่า มีการเข้ารหัส APL ไบต์เดียว แต่ Unicode นั้นใช้งานได้ง่ายกว่า
marinus

3

Haskell, 34 ตัวอักษร

x%n=do k<-[1..n];mapM(\_->x)[1..k]

การใช้รายการ monad อย่างตรงไปตรงมา สนามกอล์ฟที่จริงเท่านั้นคือการใช้mapMแทนการใช้สำนวนมากขึ้น (และสั้น) ซึ่งจะต้องมีการนำเข้าreplicateMControl.Monad

การใช้

> "ab" % 3
["a","b","aa","ab","ba","bb","aaa","aab","aba","abb","baa","bab","bba","bbb"]

2

Python, 97 94

from itertools import*
s,n=input()
L=t=[]
exec"t=t+[s];L+=map(''.join,product(*t));"*n
print L

t=t+[s]ไม่สามารถย่อให้สั้นได้t+=[s]เนื่องจาก L และ t จะชี้ไปที่รายการเดียวกัน

การป้อนข้อมูล: 'ab', 3

เอาท์พุท:

['a', 'b', 'aa', 'ab', 'ba', 'bb', 'aaa', 'aab', 'aba', 'abb', 'baa', 'bab', 'bb
a', 'bbb']

2

Mathematica 29 19 28

Join@@(i~Tuples~#&/@Range@n)

การใช้

i={a, 4, 3.2};n=3;

Join@@(i~Tuples~#&/@Range@n)

{{a}, {4}, {3.2}, {a, a}, {a, 4}, {a, 3.2}, {4, a}, {4, 4}, {4, 3.2}, { 3.2, a}, {3.2, 4}, {3.2, 3.2}, {a, a, a}, {a, a, 4}, {a, a, 3.2}, {a, 4, a}, { a, 4, 4}, {a, 4, 3.2}, {a, 3.2, a}, {a, 3.2, 4}, {a, 3.2, 3.2}, {4, a, a}, {4, a, 4}, {4, a, 3.2}, {4, 4, a}, {4, 4, 4}, {4, 4, 3.2}, {4, 3.2, a}, {4, 3.2, 4}, {4, 3.2, 3.2}, {3.2, a,}, {3.2, a, 4}, {3.2, a, 3.2}, {3.2, 4, a}, {3.2, 4, 4} , {3.2, 4, 3.2}, {3.2, 3.2, a}, {3.2, 3.2, 4}, {3.2, 3.2, 3.2}}


เป็นไปได้ไหมที่จะเรียกใช้โดยไม่ต้องซื้อ Mathematica นอกจากนี้คุณสามารถ "แบน" เอาต์พุตเพื่อไม่ให้จัดกลุ่มตามความยาวได้หรือไม่
aditsu ออกจากเพราะ SE นั้นชั่วร้าย

คุณต้องซื้อ Mathematica (ในหลักการรหัสสามารถทดสอบบน WolframAlpha.com แต่ด้วยเหตุผลบางอย่างที่เชื่อมโยงทำงานไม่ถูกต้อง.)
DavidC

ซื้อ Mathematica หรือไม่ ขออภัยจะไม่เกิดขึ้น: p รหัสไม่ได้รับการแก้ไขบน wolframalpha แต่ฉันสามารถเห็นผลลัพธ์บางอย่างจากลิงค์ก่อนหน้าของคุณดังนั้นฉันก็ยอมรับว่ามันเป็นคำตอบที่สั้นที่สุด
aditsu ออกเพราะ SE ไม่ทำงาน

2

MATL, 9 8 ไบต์

x:"1G@Z^

ลองใช้กับ MATL Online!

(MATL ถูกสร้างขึ้นหลังจากความท้าทายนี้ถูกโพสต์ แต่ฉันเชื่อว่าไม่เป็นไรโดยฉันทามติเมตาวันนี้)

(-1 ไบต์ขอบคุณ @Luis Mendo)

x - ลบอินพุตสตริงออกจากสแต็ก (คัดลอกไปยังคลิปบอร์ด G โดยอัตโนมัติ)

:" - อินพุตโดยนัยของตัวเลข n, วนซ้ำตั้งแต่ 1 ถึง n

1G - วางสตริงอินพุตจากคลิปบอร์ด G บนสแต็ก

@ - กดดัชนีวนซ้ำปัจจุบัน

Z^- พลังงานคาร์ทีเซียน: ผลิตภัณฑ์คาร์ทีเซียนของอินพุตด้วยตัวเอง@จำนวนครั้ง

ผลลัพธ์พลังงานคาร์ทีเซียน ( @-digit "numbers" ในฐานที่กำหนด) จะถูกสะสมบนสแต็กและแสดงขึ้นโดยปริยายในตอนท้าย


1
คุณสามารถบันทึก 1 ไบต์ด้วยx:"1G@Z^
Luis Mendo

@LuisMendo อัปเดต (ในที่สุด!) ขอบคุณ
sundar - Reinstate Monica

1

Python - 106

ทางออกที่ตรงไปตรงมาและไม่สร้างสรรค์ หากคุณพบว่ามีการปรับปรุงที่สำคัญโปรดโพสต์เป็นคำตอบแยกต่างหาก

s,n=input()
l=len(s)
for i in range(1,n+1):
 for j in range(l**i):t='';x=j;exec't+=s[x%l];x/=l;'*i;print t

อินพุต: "ab",3
เอาต์พุต:

a
b
aa
ba
ab
bb
aaa
baa
aba
bba
aab
bab
abb
bbb

1

Python 100

ที่ได้มาจากการแก้ปัญหาของ @ aditsu

s,n=input()
L=len(s)
i=0
while i<n:i+=1;j=0;exec"x=j=j+1;t='';exec't+=s[x%L];x/=L;'*i;print t;"*L**i

การป้อนข้อมูล: 'ab', 3

เอาท์พุท:

b
a
ba
ab
bb
aa
baa
aba
bba
aab
bab
abb
bbb
aaa

1

Perl 5 + -nlF -M5.010 -MList::Util+(uniq), 41 ไบต์

$,=$"=",";say grep/./,uniq glob"{,@F}"x<>

ลองออนไลน์!

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


1
คุณสามารถบันทึกไบต์โดยใช้เครื่องหมายจุลภาคระหว่างรายการเอาท์พุท: ลองออนไลน์!
Xcali

@ Xcali Ah จุดดีขอบคุณ!
Dom Hastings

1

Pyth, 6 ไบต์

s^LQSE

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

ลองออนไลน์ได้ที่นี่

s^LQSE   Implicit: Q=input 1, E=evaluate next input
    SE   Range [1,2,...,E]
 ^LQ     Perform repeated cartesian product of Q for each element of the above
s        Flatten


0

PHP 180

ฉันไม่มีความคิด ... ฉันรู้สึกขี้เกียจ

<?php $f=fgetcsv(STDIN);$l=strlen($f[1]);$s=str_split($f[1]);for($i=1;$i<=$f[0];$i++)for($j=0;$j<pow($l,$i);$j++){$o="";$x=$j;for($q=0;$q<$i;$q++){$o.=$s[$x%$l];$x/=$l;}echo"$o ";}


0

เออร์แลง 89 (118)

รุ่นของโมดูล:

-module(g).
-export([g/2]).
h(_,0)->[[]];h(X,N)->[[A|B]||A<-X,B<-h(X,N-1)].
g(X,N)->[V||Y<-lists:seq(1,N),V<-h(X,Y)].

ตัวอักษรนับโดยไม่มีการทำบัญชีที่บังคับ (โมดูลและการส่งออก)




0

เยลลี่ 6 ไบต์

WẋŒpƤẎ

ลองออนไลน์!

การส่งฟังก์ชั่นรับรายการตัวเลขเป็นอาร์กิวเมนต์แรกและจำนวนหลักเป็นวินาที ตัวเลขตัวเองอาจเป็นประเภทข้อมูลใด ๆ ของเจลลี่ แต่ฉันใช้จำนวนเต็มในลิงค์ TIO ด้านบนเพราะมันสร้างผลลัพธ์ที่ดูดีที่สุดใน "ฟังก์ชั่น→โปรแกรมเต็มรูปแบบ" ของ wrapper

คำอธิบาย

WẋŒpƤẎ                      (called with arguments, e.g. [1,2,5], 3)
Wẋ       Make {argument 2} copies of {argument 1}  (e.g. [[1,2,5],[1,2,5],[1,2,5])
    Ƥ    For each prefix:                          (e.g. 1-3 copies of [1,2,5])
  Œp       take Cartesian product of its elements
     Ẏ   Flatten one level

ผลิตภัณฑ์คาร์ทีเซียนให้ตัวเลขทั้งหมดอย่างมีประสิทธิภาพด้วยตัวเลข (ตามคำนำหน้าที่เราใช้งานด้วย) ดังนั้นเราจึงจบลงด้วยรายชื่อของรายการรวมกัน (จัดกลุ่มตามความยาว) และสามารถแผ่ที่หนึ่งระดับเพื่อที่จะได้รับรายชื่อที่ไม่ได้จัดกลุ่ม ( แต่ซึ่งยังคงเรียงตามความยาวเป็นคำถามที่ต้องเป็นdoesn ไม่เปลี่ยนลำดับสัมพัทธ์ขององค์ประกอบและƤลองนำหน้าสั้นลงก่อน)


0

05AB1E , 6 ไบต์

「˜Ùé

ลองมันออนไลน์หรือตรวจสอบกรณีทดสอบทั้งหมด

คำอธิบาย:

ã         # Cartesian product of the second input repeated the first input amount of times
          #  i.e. 3 and 'ab' → ['aaa','aab','aba','abb','baa','bab','bba','bbb']
 €Œ       # Take all the substrings for each of those results
          #  i.e. 'aba' → ['a','ab','aba','b','ba','a']
   ˜      # Flatten the list of lists
    Ù     # Remove all duplicated values
     é    # Sort the list by length

ทางเลือก 6 ไบต์:

หมายเหตุ: เอาต์พุตที่ยืดหยุ่น: ส่งสัญญาณรายการใหม่สำหรับทุกความยาวทั้งหมดในสายการพิมพ์เดียวกัน
การแปลงเป็นรายการเดียวจะมีความยาว 2 ไบต์: Lv²yã`})( ลองออนไลน์ )

Lv²yã?

ลองมันออนไลน์หรือตรวจสอบกรณีทดสอบทั้งหมด

คำอธิบาย:

Lv        # Loop `y` in the range [1, integer_input]
  ²yã     #  Take the second input and create an `y` times repeated cartesian product of it
          #   i.e. y=2 and 'ab' → ['aa','ab','ba','bb']
     ?    #  Print this list (without new-line)

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