เอาต์พุตสตริงทั้งหมด


34

ให้ชุดของตัวอักษรเอาท์พุทสายทั้งหมดที่ทำจากตัวอักษรเหล่านั้น (นี่คือดาว Kleeneของชุด) ตัวอย่างเช่นสำหรับ{'a','b'}สตริงคือ:

'', 'a', 'b', 'aa', 'ab', 'ba', 'bb', 'aaa', 'aab', ...

: การป้อนข้อมูลa..zคอลเลกชันที่ไม่ว่างเปล่าของตัวอักษรที่แตกต่างกัน สิ่งเหล่านี้อาจเป็นอักขระหรือสตริงอักขระเดี่ยว

เอาท์พุท:สตริงทั้งหมดในตัวอักษรเหล่านั้นในลำดับใด ๆ โดยไม่ต้องทำซ้ำ คุณสามารถใช้รายการตัวอักษรเป็นสตริง

นี่คือรายการที่ไม่มีที่สิ้นสุดดังนั้นคุณสามารถส่งออกได้โดย:

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

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

คุณไม่สามารถส่งออกได้โดย

  • การผลิตnสตริงที่ได้รับn
  • จัดเตรียม Oracle oracle สำหรับสมาชิกที่ตัดสินใจว่าสตริงที่กำหนดนั้นเป็นของชุดหรือไม่

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


@Cyoce ไม่แน่ใจว่าคุณหมายถึงอะไร ฉันชี้แจงว่าต้องแยกสตริงดังนั้นคุณสามารถบอกสตริงว่างจากอะไร
xnor

กรุณาอธิบายว่าทำไม "ไม่อนุญาตให้สร้างสตริง Nth ที่ N"
CalculatorFeline

4
@CatsAreFluffy มันเป็นการเรียกการตัดสิน ฉันคิดว่าการสร้างสตริง Nth นั้นง่ายเกินไปเมื่อเทียบกับทางเลือกและทำให้ความท้าทายน่าสนใจน้อยลงโดยเฉพาะอย่างยิ่งเนื่องจากบางภาษามีการแปลงฐานในตัวเอง นอกจากนี้ฉันไม่คิดว่ามันจะจับความคิดในการสร้างเซตที่ไม่มีที่สิ้นสุดแทนที่จะทำการสืบค้น
xnor

คุณช่วยอธิบาย "สร้างวัตถุที่ไม่มีที่สิ้นสุด" ได้ไหม? นั่นหมายความว่าเราสามารถยกตัวอย่างเช่นแต่ละสตริงลงบนสแต็ก (สำหรับภาษาสแต็ก) และปล่อยให้มันรัน "ถาวร" แม้ว่าจะไม่มีการสร้างผลลัพธ์เพราะโปรแกรมจะไม่จบ
Luis Mendo

@DonMuesli เอาต์พุตไปยังสแต็กเป็นวิธีการแสดงผลที่ยอมรับสำหรับภาษาดังกล่าวหรือไม่? และสแต็กจะมีสตริงเหล่านี้เท่านั้น ณ เวลาใด ๆ ?
xnor

คำตอบ:


26

Python 2, 53 56

-3 หลังจากตระหนักว่าyield xสามารถใช้เป็นนิพจน์ได้

def f(s):yield'';[(yield w+c)for w in f(s)for c in s]

หนึ่งไบต์สั้น แต่เริ่มต้นที่'aa'มากกว่าที่:'' S=lambda s:(c+w for f in[str,S]for w in f(s)for c in s)ยังใช้ไม่ได้กับอินพุตว่าง
orlp

20

Haskell, 24 ไบต์

f s=[]:[b:a|a<-f s,b<-s]

สร้างรายการที่ไม่มีที่สิ้นสุด

*Main> f "abc"
["","a","b","c","aa","ba","ca","ab","bb","cb","ac","bc","cc","aaa","baa","caa","aba","bba","cba",…

น่าเสียดายที่(:)<$>s<*>f sจะให้คำสั่งที่ไม่ถูกต้อง มีf s="":(flip(:)<$>f s<*>s)แต่มันอีกต่อไป
xnor

ใช่. ฉันได้พบ 23 ไบต์f s=[]:(f s<**>map(:)s)ยกเว้นว่าไม่ได้อยู่ใน<**> Prelude
Anders Kaseorg

11

JavaScript (ES6), 61 ไบต์

function*g(s){yield'';for(let r of g(s))for(c of s)yield c+r}

เครื่องมือสร้าง Python ของพอร์ตของ @ feersum letเป็นสิ่งที่จำเป็น บันทึก 2 ไบต์โดยใช้ array comprehension (ข้อเสนอ ES7 ล้มเหลว แต่ทำงานใน Firefox 30-57):

function*g(s){yield'';[for(r of g(s))for(c of s)yield c+r]}

รุ่นทางเลือกสำหรับ 73 ไบต์ที่ส่งกลับnองค์ประกอบแรกที่ให้กำเนิดโดยตัวสร้างด้านบน:

(s,n)=>Array(n).fill('').map(g=(r,i)=>i--?g(r+s[i%l],i/l|0):r,l=s.length)

JS มีเครื่องกำเนิดไฟฟ้าไหม? : 0000000
แมว


8

Perl, 39 37 35 ไบต์

(ขั้นแรกอธิบายถึงเวอร์ชั่นที่เก่ากว่าโปรแกรมที่สั้นกว่าใหม่อยู่ที่ท้ายสุด)

รวมถึง +3 สำหรับ -alp

รันด้วยชุดอักขระบน STDIN เช่น perl -alp kleene.pl <<< "a b c"

kleene.pl (รุ่นนี้คือ 34 + 3 ไบต์):

$#a=$"=","}for(@a){push@a,<{@F}$_>

เพิ่ม +2 สำหรับ-F(ปล่อยโดยปริยาย-aหากไม่มีช่องว่างระหว่างอักขระอินพุตหรือ -6 ( @a=""ก่อนหน้านี้เท่านั้น}) หากเราใส่เครื่องหมายจุลภาคระหว่างอักขระบน STDIN

คำอธิบาย:

-alpตัวเลือกทำให้โค้ดได้อย่างมีประสิทธิภาพ:

BEGIN { $/ = "\n"; $\ = "\n"; }
LINE: while (defined($_ = <ARGV>)) {
    chomp $_;
    our @F = split(' ', $_, 0);
    $#a = $" = ',';
}
foreach $_ (@a) {
    use File::Glob ();
    push @a, glob('{' . join($", @F) . '}' . $_);
}

อย่างที่คุณเห็น<>ใน perl ไม่เพียง แต่ใช้สำหรับ readline เท่านั้น แต่ยังสามารถทำเชลล์สไตล์ได้อีกด้วย (ในความเป็นจริงใน perls โบราณมันถูกนำมาใช้

เช่น<{a,b}{1,2}>จะขยายไป"a1","a2","b1","b2"

ดังนั้นถ้าเรามีองค์ประกอบใน@Fเราก็ต้องเพิ่มเครื่องหมายจุลภาคในระหว่าง ตัวละคร inbetween $"เริ่มต้นสำหรับการแก้ไขเป็นพื้นที่ซึ่งเป็นที่เก็บไว้ในตัวแปรพิเศษ ดังนั้นการตั้งค่า$"เป็น,จะกลาย"{@F}"เป็น{a,b}ถ้า@F=qw(a b)(globs ขยายเป็นสตริง)

อันที่จริงฉันชอบวนรอบกับสิ่งที่ชอบglob"{@F}"x$n++แต่ฉันยังคงพบปัญหาที่บรรทัดว่างแรกไม่ได้ถูกสร้างขึ้นและวิธีแก้ไขทั้งหมดที่ฉันพบทำให้รหัสยาวเกินไป

ส่วนที่สำคัญอีกอย่างของรหัสนี้คือถ้าคุณใช้ a forto loop บน array คุณสามารถผลักองค์ประกอบพิเศษเข้าไปในระหว่าง loop และ loop ก็จะเลือกองค์ประกอบใหม่เหล่านี้ ดังนั้นถ้าในวงเราเช่นที่องค์ประกอบ"ab"แล้ว<{@F}$_>จะขยายไปยังที่อยู่ในรายการบริบทจะกลายเป็น<{a,b}ab> ("aab", "bab")ดังนั้นถ้าฉันกดมันลง@aไปสตริงก็จะขยายไปทางซ้ายด้วยเช่นกัน

ทั้งหมดที่ฉันยังต้องทำก็คือไพร์มลูปด้วยสตริงว่าง ที่ทำโดยใช้$#a = 0( ,ในบริบทตัวเลขกลายเป็น0) ซึ่งทำให้องค์ประกอบแรกและเดียวของ@aการเป็น undef ซึ่งจะทำตัวเหมือน""เมื่อฉันใช้มัน

การปรับปรุง

ในความเป็นจริงด้วยการทำแบบทดสอบสำหรับคำอธิบายนี้ฉันพบวิธีสั้น ๆ ในการใช้ glob ที่เพิ่มขึ้นซึ่งจัดการรายการที่ว่างเปล่าเป็นครั้งแรก ทำงานเป็นperl -ap kleene0.pl <<< "a b"(เพื่อเพิ่ม 2 ไบต์สำหรับ-ap)

kleene0.pl (รุ่นนี้มี 33 + 2 ไบต์):

$"=",";print<$z,>;$z.="{@F}";redo

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


คุณช่วยอธิบายสิ่งที่เกิดขึ้นได้<{@F}$_>ไหม: ขอบคุณ!
andlrc

6

Pyth, 7

<s^LzQQ

ลองที่นี่

สิ่งนี้จะคำนวณผลิตภัณฑ์คาร์ทีเซียนของอินพุตกับแต่ละหมายเลขจาก0..n-1เชื่อมเข้ากับพวกมันแล้วเก็บไว้ก่อนnเท่านั้น นี่จะเป็นการหมดเวลาออนไลน์สำหรับตัวเลขหรือสตริงที่มีขนาดใหญ่กว่า 3-4

อีกทางเลือกหนึ่งที่จะได้รับการมองการส่งออกที่ไม่มีที่สิ้นสุดที่ Jakube ของคำตอบ


5

เยลลี่, 8 6 ไบต์

⁷³p$Ȯ¿

นี่คือลิงก์ monadic ที่ยอมรับตัวอักษรและพิมพ์รายการสตริงที่ไม่สิ้นสุด ลองออนไลน์!

มันทำงานอย่างไร

⁷³p$Ȯ¿    Monadic link. Argument: A (alphabet)

⁷         Set the return value to '\n'.
     ¿    While loop.
            Condition:
    Ȯ         Print the current return value and return it (always truthy).
            Body:
   $          Combine the two links to the left into a single, monadic link.
 ³              Yield A.
  p             Perform the Cartesian product of A and the current return value,
                updating the return value in the process.

รุ่นสำรอง 6 ไบต์ (ไม่แข่งขัน)

R’ḃL}ị

นี่คือลิงก์ dyadic ที่ยอมรับตัวอักษรและจำนวนสตริงที่ต้องการเป็นอาร์กิวเมนต์ซ้ายและขวาตามลำดับ

ฉันคิดว่ารุ่นนี้ไม่ใช่แบบแข่งขันเนื่องจากใช้การแปลงฐานแบบ bijective ซึ่งถูกนำมาใช้หลังจากการทดลองนี้ถูก Sandbox แล้ว ลองออนไลน์!

มันทำงานอย่างไร

R’ḃL}ị    Dyadic link. Arguments: n (integer), A (alphabet)

R         Range; yield [1, ..., n].
 ’        Decrement; yield [0, ..., n-1].
   L}     Yield l, the length of A.
  ḃ       Convert every i in [0, ..., n-1] to bijective base l.
     ị    For each array of digits, retrieve the corresponding characters of A.


4

CJam, 16 10 ไบต์

ขอบคุณ jimmy23013 สำหรับการบันทึก 6 ไบต์

N{eam*_o}h

อินพุตเป็นอาร์กิวเมนต์บรรทัดคำสั่งหนึ่งตัวต่ออักขระ เอาต์พุตคือหนึ่งสตริงในแต่ละบรรทัด

ลองออนไลน์! (แต่ฆ่ามันทันที ... )

คำอธิบาย

N      e# Push [\n]. At each step this array will contain all strings of length N,
       e# each followed by a linefeed.
{      e# Infinite loop...
  ea   e#   Read command-line arguments.
  m*   e#   Cartesian product: pairs each letter with each string in the list.
  _o   e#   Output all the strings of the current length.
}h

3

Pyth, 7 ไบต์

.V0j^zb

ทางเลือกเพื่อ @fry โปรแกรมนี้อ่านสตริงและเก็บไว้บนการพิมพ์สตริงจนกระทั่งไม่มีที่สิ้นสุด

คำอธิบาย:

.V0      for b in (0 to infinity):
    ^zb     compute all strings of length b consisting of the input alphabet
   j        print each one on a separate line

อีกวิธีหนึ่งดังต่อไปนี้ยังสามารถใช้งานได้ แม้ว่าจะมีแฮ็คเพิ่มขึ้นเล็กน้อย

u
M^zH7

3

Haskell, 33 ไบต์

k u=do s<-[0..];mapM(\_->u)[1..s]

สำหรับ exampe k "xyz"เป็นรายการที่ไม่มีที่สิ้นสุด["","x","y","z","xx","xy","xz","yx","yy","yz","zx","zy","zz","xxx",...]


3

MATL 10 ไบต์

0cD`G@Z^DT

ลองออนไลน์! แต่อย่าปล่อยให้มันรันเป็นเวลานานเพื่อหลีกเลี่ยงการโหลดบนคอมพิวเตอร์ขนาดใหญ่

โปรแกรมแสดงสตริงแบบไดนามิกแต่ละสตริงบนบรรทัดที่แตกต่างกัน

0cD             % force display of a newline to represent the empty string
   `      T     % infinite do-while loop
    G           % push input, or nothing if no input has been taken yet
     @          % push iteration. Gives 1, 2,... in each iteration
      Z^        % Cartesian power. In the first iteration takes input implicitly 
       D        % display

2

Python 3, 95

from itertools import*
def f(x,l=0):
 while 1:print(*combinations_with_replacement(x*l,l));l+=1

ทำไมฟังก์ชั่น itertools จึงต้องมีชื่อยาว ๆ


3
combinations_with_replacementไม่คุ้มค่า ฉันค่อนข้างแน่ใจว่ามันสั้นกว่าที่จะใช้ลูป เสมอ.
mbomb007

2

Ruby, 65 60 ไบต์

->a{n=-1;loop{puts a.repeated_permutation(n+=1).map &:join}}

ชื่อบิวอินที่มีความยาว ...


1
AFAIK คุณไม่ต้องการพื้นที่ก่อน & และคุณสามารถใช้ p แทนการใส่ได้
Nic Hartley

@QPaysTaxes พื้นที่ไม่สามารถลดลงได้และpเรียกinspectการขัดแย้งที่จะสร้างผลลัพธ์เช่น[] ["a","b"] ["aa", "ab", ...
Doorknob

ฉันเข้าใจคำตอบของคุณผิด ฉันคิดว่ามันสร้างอาร์เรย์ที่ไม่มีที่สิ้นสุดและพิมพ์มัน อย่างไรก็ตามฉันค่อนข้างแน่ใจว่าใน Array, to_s นั้นมีนามแฝงในการตรวจสอบดังนั้น put และ p จึงมีเอาต์พุตเหมือนกัน ruby-doc.org/core-2.2.0/Array.html#method-i-to_s WRT พื้นที่: คุณตรวจสอบหรือไม่ เป็นที่ยอมรับฉันไม่แน่ใจ แต่ฉันค่อนข้างแน่ใจเกี่ยวกับเรื่องนี้
Nic Hartley


1

สกาลา, 69

def f[A](s:Set[A]):Stream[List[A]]=Nil#::f(s).flatMap(x=>s.map(_::x))

ลำธารขี้เกียจค่อนข้างดีสำหรับสิ่งนี้


1

Japtap, 50 40 34 28 ไบต์

V²o ®s1+Ul)£UgXnH)¯X¦0}Ãâ ¯V

"string", number of itemsการป้อนข้อมูลเป็น เอาต์พุตเรียงตามความยาวจากนั้นเรียงลำดับตัวอักษรกลับด้าน ทดสอบออนไลน์!

มันทำงานอย่างไร

V²  o ®   s1+Ul)£  UgXnH)¯  X¦ 0}Ã â ¯  V
Vp2 o mZ{Zs1+Ul)mX{UgXnH)s0,X!=0}} â s0,V

Vp2 o      // Create the range [0..V²).
mZ{     }  // Map each item Z in this range to:
Zs1+Ul)    //  Take the base-(1+U.length) representation of Z.
mX{     }  //  Map each char X in this to:
XnH        //   Parse X as a base-32 number.
Ug   )     //   Take the char at index -^ in U.
s0,X!=0    //   If X is 0, slice it to an empty string.
â          // Uniquify the result.
s0,V       // Slice to the first V items.

รุ่นนี้ใช้เวลาสักครู่หากคุณต้องการทำมากกว่า 100 รายการ หากคุณต้องการรุ่นที่เร็วกว่าให้ลองรุ่น32- ไบต์นี้ :

V*2 o ms1+Ul)f@!Xf'0î£UgXnH}ïV

1

หมากฝรั่งอบเชย, 6 ไบต์

0000000: 6801 301c e74b                           h.0..K

ไม่ใช่การแข่งขันเนื่องจาก Cinnamon Gum ถูกสร้างขึ้นหลังจากความท้าทายนี้

ลองใช้ออนไลน์ (เอาต์พุต จำกัด TIO)

คำอธิบาย

hทำให้อบเชยหมากฝรั่งในรูปแบบและโหมดสร้าง ส่วนที่เหลือของสตริง decompresses [%s]*ไป %sจะถูกแทนที่แล้วกับการป้อนข้อมูลและเครื่องกำเนิดไฟฟ้าจะถูกสร้างขึ้นเอาท์พุทที่สตริงที่เป็นไปได้ทั้งหมดที่ตรงกับ regex ไม่



0

Python ขนาด 55 ไบต์

s=input();l=['']
for x in l:print x;l+=[x+c for c in s]

นี่ยาวกว่าโซลูชัน 53- ไบต์ของ feersumแต่มันแสดงวิธีการต่าง ๆ ที่มีผลงานพิมพ์ รายการlจะถูกอัปเดตขณะที่มีการวนซ้ำโดยการต่อท้ายอักขระหนึ่งตัวต่อท้ายของแต่ละสตริงที่อ่าน

ใช้งานได้นานพอ ๆ กันmap:

s=input();l=['']
for x in l:print x;l+=map(x.__add__,s) 

ความยาวเท่ากันสามารถทำได้ใน Python 3 ทำให้เสียรูปแบบprint()และบันทึกได้ด้วยการเปิดกล่องออก

s,*l=input(),''
for x in l:print(x);l+=[x+c for c in s]

0

Zsh , 31 ไบต์

f(){<<<${(F)a};a=($^a$^@);f $@}

ลองออนไลน์!

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

for ((;;))<<<${(F)a}&&a=($^a$^@)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.