アルファベットファンクッチ


14

Fannkuchは、古典的なベンチマークプログラムです。この名前は、パンケーキの山をひっくり返すアルゴリズムに似ているため、ドイツの「ファンクーヘン」-パンケーキ-に由来しています。番号の 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は、最初の3つの要素の順序を逆にする必要があることを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

Python 2、59バイト

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

これはかなり簡単な答えだと思います。再帰とPythonのスライス構文を使用します。次のように呼び出します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
アレックスA.

2

Haskell、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.