วรรณพันธ์


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จะระบุว่าคุณควรกลับลำดับของ 3 องค์ประกอบแรกในขณะที่ผู้นำaชี้ให้เห็นว่าลำดับเสร็จสมบูรณ์

อินพุต

อินพุตจะถูกจัดเตรียมเป็นสตริงผ่าน stdin หรือเป็นอาร์กิวเมนต์ของฟังก์ชัน สตริงจะมีตัวอักษรตัวพิมพ์เล็กระหว่าง 1 ถึง 26 ตัว สตริงจะไม่มีตัวอักษรที่มีดัชนีเทียบเท่าจะทำให้อัลกอริทึม Fannkuch พลิกองค์ประกอบมากกว่าที่มีอยู่

เอาท์พุต

โปรแกรมหรือฟังก์ชั่นควรส่งคืนหรือพิมพ์เพื่อ stdout ลำดับของคำที่สร้างขึ้นโดยใช้อัลกอริทึม Fannkuch จนกว่าaจะพบผู้นำหน้ารวมถึงสตริงเริ่มต้น ตัวอย่างเช่นหากอินพุตbcaคุณอาจพิมพ์:

bca
cba
abc

ผลลัพธ์ที่พิมพ์สามารถใช้ตัวคั่นที่เหมาะสมจุลภาคขึ้นบรรทัดใหม่ ฯลฯ ตัวเลือกใด ๆ ของช่องว่างเป็นที่ยอมรับ

เป็นอีกตัวอย่างหนึ่งถ้าข้อมูลของeabdcคุณคุณอาจกลับมา

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

กฎและเกณฑ์การให้คะแนน

นี่คือซึ่งเป็นโปรแกรมที่สั้นที่สุดชนะ ช่องโหว่มาตรฐานไม่ได้รับอนุญาต

คำตอบ:


11

Pyth, 16 ไบต์

.u+_<NJhxGhN>NJz

สาธิต.

คุณสมบัติ "ทำซ้ำจนกว่าจะหยุดการเปลี่ยนแปลง" ของฟังก์ชั่นการลดของ Pyth นั้นมีประโยชน์มากจริงๆ .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 Nongolfed ด้านล่าง (ด้วยการตรวจสอบพิเศษฉันขอแนะนำเป็น SAS ขัดข้องถ้ารูทีน FCMP เข้าสู่วงวนไม่สิ้นสุด)


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

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}\

บันทึก 5 ไบต์ด้วย @JohnE และอีกไบต์โดยจัดเรียงนิพจน์ใหม่

เป็นครั้งแรกในโลกที่ฉันคิดว่า K ได้พ่ายแพ้ CJam!

รุ่น 27 ไบต์

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

คุณสามารถทำให้สั้นลงได้เล็กน้อยถ้าคุณใช้รูปแบบจุดคงที่ของ "สแกน"
JohnE

@ JohnE ขอบคุณ! ฉันไม่ได้ตระหนักว่าเมื่อตัวอักษรตัวแรกคือaสตริงจะไม่เปลี่ยน
kirbyfan64sos

0

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