알파벳 판 킨치


14

Fannkuch 는 고전적인 벤치 마크 프로그램입니다. 이 이름은 팬케익 스택을 뒤집는 것과 알고리즘의 유사성을 위해 독일 "Pfannkuchen"-팬케이크에서 유래했습니다. Fannkuch 일련의 숫자 는 다음과 같이 구성됩니다.

{1 ..... n}의 순열을 취하십시오 (예 : {4,2,1,5,3}). 첫 번째 요소 (여기서는 4)를 가져 와서 첫 번째 4 개 요소의 순서를 바꾸십시오 : {5,1,2,4,3}. 첫 번째 요소가 1이 될 때까지이 과정을 반복하므로 뒤집어도 더 이상 변경되지 않습니다 : {3,4,2,1,5}, {2,4,3,1,5}, {4,2,3, 1,5}, {1,3,2,4,5}

알파벳 문자 문자열에 대한 Fannkuch와 유사한 시퀀스를 계산하는 프로그램이나 함수를 작성해야합니다. 매번 뒤집어 야 할 요소 수를 나타내는 데 숫자를 사용하는 대신 알파벳에서 글자의 위치를 ​​사용해야합니다. 예를 들어, 선행 c은 처음 세 요소의 순서를 반대로해야한다는 a것을 나타내고 , 선행 은 시퀀스가 ​​완료되었음을 나타냅니다.

입력

입력은 stdin을 통해 문자열로 제공되거나 함수 인수로 제공됩니다. 문자열은 1-26 개의 소문자를 포함합니다. 문자열은 동등한 색인으로 인해 Fannkuch 알고리즘이 존재하는 것보다 많은 요소를 뒤집는 문자를 포함하지 않습니다.

산출

프로그램 또는 함수는 a초기 문자열을 포함하여 선행 이 발생할 때까지 Fannkuch 알고리즘을 적용하여 생성 된 용어 시퀀스를 나타 내기 위해 반환하거나 인쇄해야 합니다. 예를 들어, 입력이 인 bca경우 다음을 인쇄 할 수 있습니다.

bca
cba
abc

인쇄 된 결과에는 합리적인 구분 기호, 줄 바꿈 등을 사용할 수 있습니다. 여백을 선택할 수 있습니다.

다른 예로, 입력 한 경우 다음을 eabdc반환 할 수 있습니다.

("eabdc"
 "cdbae"
 "bdcae"
 "dbcae"
 "acbde")

규칙과 채점

이것은 -가장 짧은 프로그램이 승리합니다. 표준 허점은 허용되지 않습니다.

답변:


11

Pyth, 16 바이트

.u+_<NJhxGhN>NJz

데모.

Pyth의 Reduce 기능의 "변경이 멈출 때까지 반복"기능은 여기서 매우 편리합니다. .u누적 감소 함수 인와 함께 사용하여 모든 결과를 출력합니다. 감소의 몸은 가능한 순진하지만 더 좋은 것을 찾을 수 없었습니다.


5

T-SQL, 213 바이트

물론 SQL이기 때문에 실제로는 크지 만 재미있었습니다. 재귀 CTE 쿼리를 사용하여 인라인 테이블 함수로 작성되었습니다.

CREATE FUNCTION F(@ CHAR(26))RETURNS TABLE RETURN WITH R AS(SELECT @ S UNION ALL SELECT CAST(STUFF(S,1,ASCII(LEFT(S,1))-96,REVERSE(LEFT(S,ASCII(LEFT(S,1))-96)))AS CHAR(26))FROM R WHERE LEFT(S,1)<>'a')SELECT*FROM R

넓히는

CREATE FUNCTION F(@ CHAR(26))
RETURNS TABLE 
RETURN WITH R AS(
    SELECT @ S            -- Initial string as an anchor for the recursion
    UNION ALL 
    SELECT CAST(
        STUFF(                                    -- Stuff into 
            S,                                    -- string S
            1,                                    -- from position 1
            ASCII(LEFT(S,1))-96,                  -- to index value of first char
            REVERSE(LEFT(S,ASCII(LEFT(S,1))-96))  -- the reverse of the index first chars
            )
        AS CHAR(26))
    FROM R 
    WHERE LEFT(S,1)<>'a'  -- recurse until first char is a
)SELECT*FROM R

다음과 같이 사용

SELECT * FROM F('eabdc')
S
--------------------------
eabdc                     
cdbae                     
bdcae                     
dbcae                     
acbde                     

(5 row(s) affected)


3

파이썬 2, 59 바이트

def p(l):
 print l;o=ord(l[0])-97
 if o:p(l[o::-1]+l[o+1:])

나는 이것이 다소 간단한 대답이라고 생각합니다. 재귀와 파이썬의 조각 구문을 사용합니다. 로 전화하십시오 : p('eabdc').


3

SAS, 131 바이트

sub a(s$);outargs s;put s;do while(b ne 1);b=rank(char(s,1))-96;substr(s,1,b)=reverse(substr(s,1,b));if b>1 then put s;end;endsub;

FCMP 통화 루틴. 아래에서 골프를 치지 마십시오 (추가 검사를 통해 FCMP 루틴이 무한 루프에 들어가면 SAS가 충돌하는 것이 좋습니다).


options cmplib=work.funcs;
proc fcmp outlib=work.funcs.funcs;
  sub a(s$);
    outargs s;
    put s=;
    do while (b ne 1 and z<1e5);
        b=rank(char(s,1))-96;
        substr(s,1,b) = reverse(substr(s,1,b));
        if b>1 then put s=;
        z+1;
    end;
  endsub;
quit;

잘 했어. 우리는 proc fcmp여기서 많이 가지 않습니다 .
Alex A.

2

하스켈, 78 바이트

f l@(h:_)|h=='a'=[l]|1<2=l:f(reverse(take d l)++drop d l)where d=fromEnum h-96

사용법 : f "eabdc"-> ["eabdc","cdbae","bdcae","dbcae","acbde"].


사용을 고려하십시오 splitAt-71 바이트로 줄일 수 있습니다!
MtnViewMark

@MtnViewMark 잘 68 바이트까지 정확히 같은 알고리즘을 가지고있는 것 같습니다
자부심 haskeller

2

K5, 21 바이트

{(|v#x),(v:*x-96)_x}\

@JohnE 덕분에 5 바이트를 절약하고 식을 다시 정렬하여 다른 바이트를 절약했습니다.

지구상에서 처음으로 K가 CJam을 이겼다고 생각합니다!

27 바이트 버전

(~97=*){(|v#x),(v:-96+*x)_x}\

고정 소수점 형태의 "스캔"을 사용하면 이것을 약간 더 짧게 만들 수 있습니다.
JohnE

@JohnE 감사합니다! 첫 글자가 a~ 일 때 문자열이 변경 되지 않는다는 것을 알지 못했습니다 .
kirbyfan64sos

0

하스켈, 68

f l@(x:_)|x<'b'=[l]|(x,y)<-splitAt(fromEnum x-96)l=l:f(reverse x++y)

내가 생각했던 더 복잡한 전술에는 더 많은 바이트가 필요했습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.