Fannkuch Alfabet

14

Fannkuch adalah program benchmark klasik. Nama ini berasal dari bahasa Jerman "Pfannkuchen" - pancake- karena kemiripan algoritma untuk membalik tumpukan pancake. Urutan angka Fannkuch dibentuk sebagai berikut:

Ambil permutasi {1 ..... n}, misalnya: {4,2,1,5,3}. Ambil elemen pertama, di sini 4, dan membalikkan urutan 4 elemen pertama: {5,1,2,4,3}. Ulangi ini sampai elemen pertama adalah 1, jadi membalik tidak akan mengubah apa pun lagi: {3,4,2,1,5}, {2,4,3,1,5}, {4,2,3, 1,5}, {1,3,2,4,5}

Anda harus menulis program atau fungsi yang menghitung urutan seperti Fannkuch untuk string karakter alfabet. Alih-alih menggunakan angka untuk menunjukkan berapa banyak elemen daftar harus dibalik setiap kali, posisi huruf dalam alfabet harus digunakan. Sebagai contoh, sebuah lead cakan menunjukkan bahwa Anda harus membalik urutan 3 elemen pertama, sementara sebuah lead amenunjukkan bahwa urutannya selesai.

Memasukkan

Input akan diberikan sebagai string melalui stdin atau sebagai argumen fungsi. String akan berisi antara 1 dan 26 huruf kecil berbeda. String tidak akan berisi huruf yang indeks ekivalennya akan menyebabkan algoritma Fannkuch untuk membalik lebih banyak elemen daripada yang ada.

Keluaran

Program atau fungsi harus mengembalikan atau mencetak untuk mengetahui urutan istilah yang dihasilkan dengan menerapkan algoritma Fannkuch hingga ditemukan suatu pemimpin a, termasuk string awal. Misalnya, jika inputnya adalah bca, Anda dapat mencetak:

bca
cba
abc

Hasil cetak dapat menggunakan koma pemisah yang masuk akal, baris baru, dll. Setiap pilihan spasi putih dapat diterima.

Sebagai contoh lain, jika input eabdcAnda, Anda mungkin kembali:

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

Aturan dan Penilaian

Ini adalah - program terpendek yang menang. Celah Standar tidak diizinkan.

JohnE
sumber

Jawaban:

11

Pyth, 16 byte

.u+_<NJhxGhN>NJz

Demonstrasi.

Fitur "ulangi sampai berhenti berubah" dari fungsi pengurangan Pyth sangat berguna di sini. Ini digunakan dengan .u, fungsi pengurangan kumulatif, untuk menampilkan semua hasil. Tubuh reduksi itu sama naifnya, tetapi saya tidak bisa menemukan yang lebih baik.

isaacg
sumber
5

T-SQL, 213 byte

Tentu saja menjadi SQL itu sangat besar, tetapi itu menarik untuk dilakukan. Dibuat sebagai fungsi tabel inline menggunakan kueri CTE rekursif.

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

Diperluas

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

Digunakan sebagai berikut

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

(5 row(s) affected)
MickyT
sumber
4

CJam, 22 byte

Ini adalah fungsi anonim yang mengambil string pada stack dan mengembalikan daftar string pada stack.

{_,{_0='`-/(W%\+s_}*]}

Cobalah online di sini

Pengoptimal
sumber
3

Python 2, 59 byte

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

Saya kira ini adalah jawaban yang agak langsung. Menggunakan rekursi dan sintaks iris Python. Panggil sebagai: p('eabdc').

mathmandan
sumber
3

SAS, 131 byte

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;

Rutin panggilan FCMP. Nongolf di bawah ini (dengan pemeriksaan ekstra saya sangat merekomendasikan sebagai SAS crash jika rutin FCMP memasuki infinite loop).


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;
Joe
sumber
Kerja bagus. Kami tidak mendapat banyak hal proc fcmpdi sini.
Alex A.
2

Haskell, 78 byte

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

Penggunaan: f "eabdc"-> ["eabdc","cdbae","bdcae","dbcae","acbde"].

nimi
sumber
pertimbangkan untuk menggunakan splitAt- Anda bisa mendapatkannya hingga 71 byte!
MtnViewMark
@ MtnViewMark nampaknya saya memiliki algoritma yang sama persis, turun ke 68 byte
bangga haskeller
2

K5, 21 byte

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

Disimpan 5 byte berkat @JohnE dan byte lain dengan mengatur ulang ekspresi.

Untuk pertama kalinya di bumi, saya pikir K telah mengalahkan CJam!

Versi 27 byte

(~97=*){(|v#x),(v:-96+*x)_x}\
kirbyfan64sos
sumber
Anda dapat membuat ini sedikit lebih pendek jika Anda menggunakan bentuk "pemindaian" titik tetap.
JohnE
@ JohnE Terima kasih! Saya tidak menyadari bahwa, ketika huruf pertama adalah a, string tidak akan berubah.
kirbyfan64sos
0

Haskell, 68

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

Taktik yang lebih rumit apa pun yang saya pikirkan mengambil lebih banyak byte.

haskeller bangga
sumber