Mathematica, 72 65 61 바이트
Print@@@Tuples@{a=##/(b=#5#9#15#21#25#)&@@Alphabet[],b,a,b,a}
테스트를 위해로 교체 Print@@@
하는 것이 좋습니다 ""<>#&/@
. Mathematica는 288,000 줄을 영원히 인쇄하는 대신 처음 몇 단어와 마지막 몇 단어를 보여주는 잘린 형태를 표시합니다.
설명
마침내 문자열을 나누는 용도를 찾았습니다. :)
한동안 문자열을 추가하거나 곱할 가능성에 흥미가 있었지만 실제 사용 사례는 상당히 제한적입니다. 요점은 Mathematica에서 "foo"+"bar"
or "foo"*"bar"
와 같은 (따라서 짧은 형식 "foo""bar"
)이 완전히 유효하다는 것입니다. 그러나 실제로는 산술 표현식에서 문자열로 무엇을 해야할지 알지 못하므로 이러한 사항은 평가되지 않습니다. Mathematica 는 일반적으로 적용 가능한 단순화를 적용합니다. 특히 문자열은 정식 순서로 정렬되며 (대문자, 숫자 및 문자가 아닌 문자를 포함하는 문자열을 정렬하기 시작하면 Mathematica에서 상당히 엉망이 됨) 종종 거래를 중단하지만 여기서는 중요하지 않습니다. . 또한 다음과 "abc""abc"
같이 단순화됩니다"abc"^2
(이것은 문자열을 반복했을 때 문제가되지만 우리는 그것을 가지고 있지 않습니다 "abc"/"abc"
.)
그래서 우리는 여기서 골프를하려고합니다. 모음 목록과 자음 목록이 필요하므로 Tuples
가능한 모든 조합을 생성 하도록 피드 할 수 있습니다 . 첫 번째 접근 방식은 순진한 솔루션이었습니다.
Characters@{a="bcdfghjklmnpqrstvwxz",b="aeiouy",a,b,a}
하드 코딩 된 자음 목록은 약간 아 hurt니다. Mathematica에는 Alphabet
내장 된 모음이있어서 값싼 방식으로 모음을 제거 할 수 있다면 피할 수 있습니다. 이것은 까다로운 곳입니다. 요소를 제거하는 가장 간단한 방법은 Complement
이지만 다음 옵션 중 하나를 사용하여 더 길어집니다.
{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}
( 문자열이 아닌 문자 목록을 제공 Characters
하므로 더 이상 전체 에 적용 할 필요는 없습니다 Alphabet[]
.)
그 산술 사업을 시도해 봅시다. 전체 알파벳을 목록 대신 문자의 곱으로 표현하면 취소 규칙으로 인해 간단한 나눗셈으로 문자를 제거 할 수 있습니다. 우리가 필요하지 않기 때문에 많은 바이트를 절약합니다 Complement
. 또한 "a""e""i""o""u""y"
실제로는보다 짧은 바이트 Characters@"aeiouy"
입니다. 그래서 우리는 이것을 다음과 같이합니다 :
a=##/(b="a""e""i""o""u""y")&@@Alphabet[]
우리는 어디에서 자음과 모음의 제품을 저장하고 a
및 b
각각. 이것은 모든 논증을 곱하고 ##
모음의 곱으로 나누는 함수를 작성함으로써 작동 합니다. 이 함수는 알파벳 목록에 적용 되며, 각 문자를 별도의 인수로 전달합니다.
지금까지는 좋지만 이제는
{a=##/(b="a""e""i""o""u""y")&@@Alphabet[],b,a,b,a}
에 대한 주장으로 Tuples
, 그리고 그것들은 여전히 목록이 아닌 제품입니다. 일반적으로 수정하는 가장 짧은 방법 List@@@
은 앞에 제품을 배치하여 제품을 다시 목록으로 만드는 것입니다. 불행히도, 7 바이트를 추가하면 순진한 접근 방식보다 길어집니다.
그러나 Tuples
내부 목록의 머리는 전혀 신경 쓰지 않습니다. 당신이 할 경우
Tuples[{f[1, 2], f[3, 4]}]
(예, 정의되지 않은 경우) 다음과 같은 이점이 f
있습니다.
{{1, 3}, {1, 4}, {2, 3}, {2, 4}}
마치 List
대신을 사용한 것처럼 f
. 따라서 실제로 해당 제품을 바로 전달 Tuples
하여 올바른 결과를 얻을 수 있습니다. 이렇게하면 하드 코드 된 두 개의 문자열을 사용하여 순진한 접근 방식보다 5 바이트가 절약됩니다.
이제는 "a""e""i""o""u""y"
여전히 성가신 일입니다. 그러나 여기서도 몇 바이트를 절약 할 수 있습니다! 우리 기능의 주장은 개별 문자입니다. 따라서 올바른 인수를 선택하면 문자열 리터럴 대신 3 개보다 짧은 인수를 재사용 할 수 있습니다. 우리는 인수가 원하는 #
(짧은 #1
), #5
, #9
, #15
, #21
와 #25
. #
마지막에 넣을 경우 *
(정규식) #\d+
은 숫자가 아닌 숫자를 추가 할 수없는 완전한 토큰 이기 때문에 곱하기 위해 추가 할 필요가 없습니다 . 따라서 우리는 #5#9#15#21#25#
또 다른 4 바이트를 절약 하면서 끝납니다 .