피스 , 25
shCoc/NhN/zhNm>o_/zZSzdUz
이 답변 에서 영감을 얻은 완전히 새로운 알고리즘을 사용합니다 .
(implicit) z = input()
(implicit) print
s combine list of strings into one string
h first list in
C matrix transpose of (e.g. first characters in first list, etc.)
o order_by(lambda N:
c float_div(
/NhN N.count(N[0]),
/zhN z.count(N[0])),
m map(lambda d:
> slice_head(
o order_by(lambda Z:
_/zZ -1*z.count(Z),
Sz sorted(z)),
d d),
Uz range(len(z))
단계별 :
먼저, 우리는 문자를 공통성, 알파벳순으로 분류하여 정렬했습니다. 이것은입니다 o_/zZSz
. o
파이썬과 동일하지만 sorted(<stuff>,key=<stuff>)
키에 대한 람다 식은 문자열로 유지한다는 점을 제외하고.
그런 다음 길이 len(z)
에서 길이 1 까지 해당 문자열의 접두사 목록을 생성합니다 . >
python 's와 같습니다 <stuff>[<int>:]
.
그런 다음이 접두사 문자열 목록을 질문에 표시된 사각형 레이아웃의 접두사 첫 번째 문자에서 분수 위치 (0은 왼쪽 가장자리, 1은 오른쪽)로 재정렬합니다. /NhN
접두사에서 첫 번째 문자가 접두사에서 몇 번 /zhN
나오는지 계산하고 문자열에서 접두사에서 첫 번째 문자가 나타나는 횟수를 구멍으로 나타냅니다. 이렇게하면 그룹의 각 문자가 이끄는 각 접두사가 1/k
해당 문자의 가장 오른쪽 k/k
에있는 것부터 가장 왼쪽에있는 것 까지 다른 분수로 할당됩니다 . 접두사 목록을이 번호로 재정렬하면 레이아웃에서 적절한 위치를 제공합니다. 타이는 사전 순서를 사용하여 끊어지며, 원하는 순서대로 알파벳순으로 계산됩니다.
마지막으로 각 접두사 문자열에서 첫 번째 문자를 추출하여 단일 문자열로 결합하여 인쇄해야합니다. 첫 문자 추출은 hC
입니다. C
실제로 zip(*x)
파이썬 3에서 목록에서 행렬 전치를 수행합니다 h
. 결과 행렬의 첫 번째 행을 추출합니다. 1 문자 접두어가 있으면 다른 완전한 행이 형성되지 않으므로 실제로 이것은 유일한 행입니다. s
이 튜플의 문자를 단일 문자열로 합산합니다. 인쇄는 암시 적입니다.
테스트:
$ pyth -c 'shCoc/NhN/zhNm>o_/zZSzdUz' <<< 'oroybgrbbyrorypoprr'
rorbyroprbyorrobypg
증분 프로그램 oroybgrbbyrorypoprr
:
Sub-Piece Output
Sz bbbgoooopprrrrrryyy
o_/zNSz rrrrrroooobbbyyyppg (uses N because o uses N on first use.)
m>o_/zNSzdUz ['rrrrrroooobbbyyyppg', 'rrrrroooobbbyyyppg', 'rrrroooobbbyyyppg', 'rrroooobbbyyyppg', 'rroooobbbyyyppg', 'roooobbbyyyppg', 'oooobbbyyyppg', 'ooobbbyyyppg', 'oobbbyyyppg', 'obbbyyyppg', 'bbbyyyppg', 'bbyyyppg', 'byyyppg', 'yyyppg', 'yyppg', 'yppg', 'ppg', 'pg', 'g']
oc/NhN/zhNm>o_/zZSzdUz ['roooobbbyyyppg', 'obbbyyyppg', 'rroooobbbyyyppg', 'byyyppg', 'yppg', 'rrroooobbbyyyppg', 'oobbbyyyppg', 'pg', 'rrrroooobbbyyyppg', 'bbyyyppg', 'yyppg', 'ooobbbyyyppg', 'rrrrroooobbbyyyppg', 'rrrrrroooobbbyyyppg', 'oooobbbyyyppg', 'bbbyyyppg', 'yyyppg', 'ppg', 'g']
Coc/NhN/zhNm>o_/zZSzdUz [('r', 'o', 'r', 'b', 'y', 'r', 'o', 'p', 'r', 'b', 'y', 'o', 'r', 'r', 'o', 'b', 'y', 'p', 'g')]
shCoc/NhN/zhNm>o_/zZSzdUz rorbyroprbyorrobypg
이전 답변 :
피스 , 34
ssCm*+t*u*G/zHS{-zd1]kd/zdo_/zNS{z
이 프로그램은 특정 하위 목록을 복제 할 횟수를 계산하여 작동합니다. 하위 목록은 다음과 같습니다 ['', '', '', '', ... , 'r']
. 이 하위 목록의 총 길이는 다른 모든 사탕의 발생 횟수의 곱입니다 u*G/zHS{-zd1
. 전체 하위 목록은 빈 문자열의 목록 ]k
을 여러 번 복제 한 다음 요소를 제거하고 t
끝에 사탕 이름을 추가하여 구성됩니다 +d
.
그런 다음이 하위 목록은 사탕이 입력에서 발견되는 횟수만큼 복제되어 /zd
각 사탕의 목록 길이가 동일합니다.
이제이 함수를 사용하여 고유 한 모든 사탕에 대해 올바른 정렬 순서 ( o_/zNS{z
)로 매핑 하면 질문 문에있는 것과 비슷한 사각형이 있지만 마침표 대신 빈 문자열이 있습니다. 행렬 전치 ( C
)와 두 개의 합산 ( ss
)을 수행하면 최종 문자열이 제공됩니다.
확인:
$ pyth programs/candy.pyth <<< 'oroybgrbbyrorypoprr'
rorbyroprbyorrobypg