Toán học, 72 65 61 byte
Print@@@Tuples@{a=##/(b=#5#9#15#21#25#)&@@Alphabet[],b,a,b,a}
Để thử nghiệm, tôi khuyên bạn nên thay thế Print@@@
bằng ""<>#&/@
. Mathicala sau đó sẽ hiển thị một hình thức rút gọn hiển thị một vài từ đầu tiên và vài từ cuối cùng, thay vì mất mãi mãi để in 288.000 dòng.
Giải trình
Cuối cùng tôi đã tìm thấy một cách sử dụng để phân chia chuỗi. :)
Tôi đã bị thu hút bởi khả năng thêm hoặc nhân chuỗi trong một thời gian, nhưng các trường hợp sử dụng thực tế khá hạn chế. Vấn đề chính là cái gì đó như "foo"+"bar"
hoặc "foo"*"bar"
(và do đó, hình thức ngắn "foo""bar"
) là hoàn toàn hợp lệ trong Mathematica. Tuy nhiên, nó thực sự không biết phải làm gì với các chuỗi trong các biểu thức số học, vì vậy những điều này vẫn chưa được đánh giá. Mathematica không áp dụng đơn giản hóa áp dụng thường mặc dù. Cụ thể, các chuỗi sẽ được sắp xếp theo thứ tự chính tắc (khá rối trong Mathicala, một khi bạn bắt đầu sắp xếp các chuỗi chứa các chữ cái của các trường hợp khác nhau, chữ số và không phải chữ cái), thường là một công cụ giải quyết, nhưng không thành vấn đề ở đây . Hơn nữa, "abc""abc"
sẽ được đơn giản hóa để"abc"^2
(đó là một vấn đề khi bạn có các chuỗi lặp lại, nhưng chúng tôi cũng không có vấn đề đó) và một cái gì đó giống như "abc"/"abc"
sẽ thực sự hủy bỏ (mà chúng ta thậm chí sẽ sử dụng).
Vì vậy, những gì chúng ta đang cố gắng để chơi golf ở đây. Chúng tôi cần một danh sách các nguyên âm và một danh sách các phụ âm, vì vậy chúng tôi có thể cung cấp cho chúng Tuples
để tạo ra tất cả các kết hợp có thể. Cách tiếp cận đầu tiên của tôi là giải pháp ngây thơ:
Characters@{a="bcdfghjklmnpqrstvwxz",b="aeiouy",a,b,a}
Đó là danh sách các phụ âm được mã hóa cứng làm tổn thương một chút. Mathematica có tích Alphabet
hợp sẵn cho phép tôi tránh nó, nếu tôi có thể loại bỏ các nguyên âm một cách rẻ tiền. Đây là nơi nó trở nên khó khăn mặc dù. Cách đơn giản nhất để loại bỏ các phần tử là Complement
, nhưng cuối cùng lại dài hơn, sử dụng một trong các tùy chọn sau:
{a=Complement[Alphabet[],b=Characters@"aeiouy"],b,a,b,a}
{a=Complement[x=Alphabet[],b=x[[{1,5,9,15,21,25}]]],b,a,b,a}
(Lưu ý rằng chúng ta không cần phải áp dụng Characters
cho toàn bộ điều này nữa, vì Alphabet[]
đưa ra một danh sách các chữ cái, không phải là một chuỗi.)
Vì vậy, hãy thử kinh doanh số học. Nếu chúng ta biểu thị toàn bộ bảng chữ cái dưới dạng sản phẩm của các chữ cái thay vì danh sách, thì chúng ta có thể xóa các chữ cái bằng cách chia đơn giản, do quy tắc hủy. Điều đó tiết kiệm rất nhiều byte vì chúng ta sẽ không cần Complement
. Hơn nữa, "a""e""i""o""u""y"
thực sự là một byte ngắn hơn Characters@"aeiouy"
. Vì vậy, chúng tôi làm điều này với:
a=##/(b="a""e""i""o""u""y")&@@Alphabet[]
Trường hợp chúng tôi lưu trữ các sản phẩm phụ âm và nguyên âm trong a
và b
, tương ứng. Điều này hoạt động bằng cách viết một hàm nhân tất cả các đối số của nó ##
và chia chúng cho sản phẩm của các nguyên âm. Hàm này được áp dụng cho danh sách bảng chữ cái, chuyển từng chữ cái thành một đối số riêng biệt.
Cho đến nay rất tốt, nhưng bây giờ chúng ta có
{a=##/(b="a""e""i""o""u""y")&@@Alphabet[],b,a,b,a}
như là đối số Tuples
và những thứ đó vẫn là sản phẩm, không phải là danh sách. Thông thường, cách ngắn nhất để khắc phục đó là đặt List@@@
phía trước, giúp biến các sản phẩm thành danh sách một lần nữa. Thật không may, thêm 7 byte đó làm cho nó dài hơn cách tiếp cận ngây thơ.
Tuy nhiên, hóa ra Tuples
không quan tâm đến những người đứng đầu danh sách bên trong. Nếu bạn làm
Tuples[{f[1, 2], f[3, 4]}]
(Có, đối với một không xác định f
.) Bạn sẽ nhận được:
{{1, 3}, {1, 4}, {2, 3}, {2, 4}}
Giống như bạn đã sử dụng một List
thay vì f
. Vì vậy, chúng tôi thực sự có thể vượt qua những sản phẩm đó mà Tuples
vẫn nhận được kết quả đúng. Điều này tiết kiệm 5 byte theo cách tiếp cận ngây thơ bằng cách sử dụng hai chuỗi mã hóa cứng.
Bây giờ "a""e""i""o""u""y"
vẫn còn khá khó chịu. Nhưng chờ đã, chúng ta cũng có thể lưu một vài byte ở đây! Các đối số của chức năng của chúng tôi là các chữ cái riêng lẻ. Vì vậy, nếu chúng ta chỉ chọn ra các đối số phù hợp, chúng ta có thể sử dụng lại các đối số đó thay vì các chuỗi ký tự, ngắn hơn cho ba trong số chúng. Chúng tôi muốn lập luận #
(viết tắt #1
), #5
, #9
, #15
, #21
và #25
. Nếu chúng ta đặt #
ở cuối, thì chúng ta cũng không cần thêm bất kỳ *
để nhân chúng lại với nhau, bởi vì (regex) #\d+
là một mã thông báo hoàn chỉnh không thể có bất kỳ chữ số nào được thêm vào nó. Do đó, chúng tôi kết thúc với #5#9#15#21#25#
, tiết kiệm thêm 4 byte.