จัดเรียงเรเดอเรชัน


14

งานของคุณคือการเขียนโปรแกรมคอมพิวเตอร์เพื่อที่ว่าเมื่อมันถูกตัดเป็นเส้น (แยกตัวอักษรขึ้นบรรทัดใหม่) การจัดเรียงของบรรทัดทุกบรรทัดจะส่งออกตัวเลขที่แตกต่างกันระหว่าง1ถึงn! (โดยที่nคือจำนวนบรรทัดทั้งหมด) ไม่ควรมีเอาต์พุตจำนวนโดยการจัดเรียงสองแบบที่ต่างกันและการเรียงทุกครั้งควรส่งออกตัวเลขในช่วงนี้ เนื่องจากมีn! วิธีในการจัดเรียงบรรทัดของโปรแกรมซึ่งหมายความว่าแต่ละหมายเลขควรแสดงผลลัพธ์ด้วยการจัดเรียงใหม่

เช่นโปรแกรมไพ ธ อน

print 1;"""
print 2;"""

มีสองวิธี

print 1;"""
print 2;"""

และ

print 2;"""
print 1;"""

ผลที่แรกและเอาท์พุทที่สอง12

คุณสามารถใช้รูปแบบเอาต์พุตใดก็ได้ที่เป็นมาตรฐานในภาษาที่คุณใช้ คุณไม่สามารถสันนิษฐานได้ว่าแผ่นสำเร็จรูปใด ๆ ฉันคิดว่าความท้าทายนี้น่าสนใจมากขึ้นถ้าคุณต้องหลีกเลี่ยงรูปแบบที่ภาษายืนยัน

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

คะแนนของคุณจะเป็นจำนวนบรรทัดในโปรแกรมของคุณด้วยคะแนนที่สูงขึ้นจะดีกว่า คุณอาจเลือกที่จะเอาท์พุทตัวเลขจาก0ถึงn! -1หากคุณต้องการ


3
สิ่งที่เกี่ยวกับคำตอบที่ก่อสร้างในปัจจุบันที่มีการทำงานสำหรับการใด ๆn? พวกเขาทุกคนผูกด้วยคะแนน∞หรือไม่?
Martin Ender

@ มาร์ตินใช่ ∞เป็นคะแนนที่ดี หากคุณพบสิ่งก่อสร้างเช่นนั้นคุณก็จะชนะ
โพสต์ Rock Garf Hunter

@AdmBorkBork ใช่การจัดการแต่ละรายการควรส่งออกหมายเลขหนึ่ง มันชัดเจนกว่านี้ไหม?
โพสต์ Rock Garf Hunter

1
@totallyhuman กฎเอาต์พุตมาตรฐานสำหรับภาษาใดก็ตามที่คุณใช้ ฉันจะอัปเดตคำถามเพื่อให้ชัดเจนในเรื่องนี้
โพสต์ Rock Garf Hunter

1
@EriktheOutgolfer ไม่มีตัวตัดไท่ มาร์ตินอาจพบวิธีที่จะทำคะแนนอินฟินิตี้ใน CJam แต่มีภาษาอื่นอีกมากมายให้ลอง
โพสต์ Rock Garf Hunter

คำตอบ:


7

CJam , คะแนน: ∞

แต่ละบรรทัดมีรูปแบบ

];Lx+:L{__(f<0+:+\,,(;1+:**\(;}h]:+

ซึ่งxเป็นตัวเลขจากการ0 n-1ผลที่ได้คือในช่วงที่จะ0n!-1

ลองออนไลน์! (สำหรับn=3.)

เครดิตสำหรับjimmy23013สำหรับรหัสที่คำนวณดัชนีการเปลี่ยนแปลงที่แท้จริง ฉันได้แทนที่บิตที่อ่านอินพุต];Lx+:Lที่ทิ้งผลลัพธ์จากบรรทัดก่อนหน้าแล้วเพิ่มดัชนีของบรรทัดปัจจุบันให้กับตัวแปรL(ซึ่งตอนแรกคืออาร์เรย์ว่าง)


โอ้ฉันเขียนไว้ แต่มันก็ดูไม่เหมือนกอล์ฟ ... (เช่น0+:+) ฉันคิดว่าคุณสามารถใช้เวอร์ชั่นที่สั้นกว่า,m!#นี้ได้
jimmy23013

4

Perl: ∞

$z.="-1,";$_.=A;END{$m.=!!s/./{${z}B}/g,map(/B/||s/\d+\K/,/g*/(-\d*,).*\1/||($n{$_}||=$m++),sort glob),print$n{$z}if/A/}
$z.="-2,";$_.=A;END{$m.=!!s/./{${z}B}/g,map(/B/||s/\d+\K/,/g*/(-\d*,).*\1/||($n{$_}||=$m++),sort glob),print$n{$z}if/A/}
$z.="-3,";$_.=A;END{$m.=!!s/./{${z}B}/g,map(/B/||s/\d+\K/,/g*/(-\d*,).*\1/||($n{$_}||=$m++),sort glob),print$n{$z}if/A/}

ขยายความยาวตามที่คุณต้องการ

จะหมดหน่วยความจำอย่างรวดเร็วเนื่องจากการใช้หน่วยความจำเหมือน O (n ^ n) อย่างไรก็ตามมันจะง่ายต่อการแทนที่ตัวเปลี่ยนดัชนีโดยรหัส O (n) อีกต่อไป ฉันแค่แสดงให้เห็นถึงวิธีที่คุณสามารถใช้END{}สำหรับงานนี้ใน Perl END{}บล็อกทั้งหมดรันที่เวลาออก แต่เฉพาะบล็อกแรกที่ถูกเรียก (บล็อกสุดท้ายในโค้ด) จะแสดงผลอะไรก็ได้เนื่องจากการ/A/ทดสอบซึ่งเป็นจริงเพียงครั้งเดียว

โปรดสังเกตว่าตัว$mนับต้องนับเป็นสตริงเพราะเป็นตัวเลขมันจะล้น (ภายหลังจากจุดจบของจักรวาล แต่เป็นหลักการที่นับ) ด้วยเหตุผลเดียวกันฉัน "นับ" จำนวนบรรทัดโดยการสร้างสตริงของAแทนที่จะใช้ตัวนับจริงแม้ว่าล้นนี้จะเกิดขึ้นในภายหลัง

อีกวิธีในการทำเช่นนี้ใน perl:

@{$b.=A; if($a eq $b) {use bigint; $n=0;$n++for@F;$c=0;$c=$c*$n--+map{$z=$_;$a=grep$_&&$_>$z,@F;$_=0;}@F;print$c}}=()x push@F,"1".!($a.=A),
@{$b.=A; if($a eq $b) {use bigint; $n=0;$n++for@F;$c=0;$c=$c*$n--+map{$z=$_;$a=grep$_&&$_>$z,@F;$_=0;}@F;print$c}}=()x push@F,"2".!($a.=A),
@{$b.=A; if($a eq $b) {use bigint; $n=0;$n++for@F;$c=0;$c=$c*$n--+map{$z=$_;$a=grep$_&&$_>$z,@F;$_=0;}@F;print$c}}=()x push@F,"3".!($a.=A),

การใช้งานนี้ความจริงที่ว่าในการที่จะดำเนินการหลังจากที่foo = bar bar fooเวอร์ชั่นนี้ไม่ได้บ้าไปตามกาลเวลา แต่ก็ทำให้โค้ดยาวขึ้น

อีกแนวคิดหนึ่งคือการใช้DESTROYซึ่งมีข้อได้เปรียบที่มีเพียงหนึ่งในนั้นเท่านั้นที่จะถูกประหารชีวิต ฉันจะไม่ทำซ้ำรหัสการจัดทำดัชนีการเปลี่ยนแปลงซึ่งฉันได้ให้สองตัวอย่าง

push@F,"1";bless\@F;DESTROY{print"Work out permutation index of @{$_[0]}\n" }
push@F,"2";bless\@F;DESTROY{print"Work out permutation index of @{$_[0]}\n" }
push@F,"3";bless\@F;DESTROY{print"Work out permutation index of @{$_[0]}\n" }

หรือใช้BEGIN:

BEGIN{push@F,"1"} print"Work out permutation index of @F\n"; exit;
BEGIN{push@F,"2"} print"Work out permutation index of @F\n"; exit;
BEGIN{push@F,"3"} print"Work out permutation index of @F\n"; exit;

3

เยลลี่ , ∞

;3ÇQŒ¿$⁼Q$?
;2ÇQŒ¿$⁼Q$?
;1ÇQŒ¿$⁼Q$?

(ตัวอย่างด้วยn=3)

ลองออนไลน์!

23 13 11 ไบต์ต่อบรรทัด

สำหรับโปรแกรมที่มีnเส้นบรรทัดจะมีรูปแบบ

; <i> ÇQŒ¿$⁼Q$?

ที่<i>แสดงให้เห็นถึงตัวอักษรตัวเลขiและแต่ละบรรทัดมีค่าแตกต่างกันสำหรับiตั้งแต่การ1 n(ค่าสำหรับiไม่จำเป็นต้องเป็นตัวเลขเฉพาะเหล่านี้ แต่ต้องมีค่าบวกที่ไม่ซ้ำกัน) โปรแกรมนี้ไม่ได้ใช้nในโครงสร้างเส้นอีกต่อไป

อย่างไร?

  • 0โดยไม่ต้องโต้แย้งวุ้นเริ่มต้นด้วย
  • ;1ผนวก1ไป0หรือรายการที่ใช้งานอยู่
  • ⁼Q$เป็น monad แบบมีเงื่อนไขสำหรับคำสั่ง if ( ?) ที่ตรวจสอบว่าองค์ประกอบของรายการนั้นไม่ซ้ำกันหรือไม่ หากเป็นเช่นนั้นลิงก์ด้านบนจะถูกเรียกว่า ( Ç) และหมายเลขอื่นจะถูกต่อท้ายรายการ หากพวกเขาไม่ได้เป็นเอกลักษณ์นั่นหมายความว่าเราได้ห่อไปที่ลิงค์แรก องค์ประกอบซ้ำจะถูกลบออกจากรายการ ( Q) และดัชนีของการเปลี่ยนแปลงที่พบ ( Œ¿) โปรดทราบว่ามี0จุดเริ่มต้นของรายการเมื่อŒ¿ถูกนำมาใช้ แต่จะไม่ส่งผลกระทบต่อเอาต์พุตเนื่องจากค่าสำหรับiทั้งหมดเป็นค่าบวก

คุณสมบัติใหม่ของเยลลี่

ด้วยการเพิ่มƑอย่างรวดเร็วใหม่เราสามารถลด⁼Q$การบันทึกไบต์

10 ไบต์ / บรรทัด (สำหรับตัวเลขหลักเดียว)

;1ÇQŒ¿$QƑ?

ลองออนไลน์!


2

Brain-Flak , 3

(({}){})
({}())
(()(){([()()]{})()(){[()()](<{}>)}}{})

ลองออนไลน์!

ฉันโพสต์สิ่งนี้ในการแชทก่อนหน้านี้ แต่หวังว่าจะโพสต์ไว้ที่นี่ผู้คนสามารถต่อยอดได้

คำอธิบาย

เราเริ่มต้นด้วยโปรแกรมพื้นฐาน

(({}){})
({}())

คะแนนนี้ 2 ด้วยตัวเอง เพื่อก้าวขึ้นไปสู่ระดับถัดไปฉันต้องการเพิ่มบรรทัดใหม่ การคาดเดาที่เริ่มต้นของฉันคือ

(()(){[()()]{}(<()>)}{})

นี่เป็นการตั้งค่า TOS เป็น2ถ้ามันเป็นศูนย์และไม่ทำอะไรอย่างอื่น นี่เป็นการเริ่มต้นที่ดีจริงๆ ด้วยอีกสองบรรทัดเราสามารถรับจำนวนทั้งหมดจาก1ถึง6ยกเว้น4เนื่องจากมี2วิธีการส่งออก2:

({}())
(({}){})
(()(){[()()]{}(<()>)}{})

และ

({}())
(()(){[()()]{}(<()>)}{})
(({}){})

เพื่อที่จะแก้ไขปัญหานี้เราจะทำให้สายของเรายังตั้งให้เป็น2 4ซึ่งสามารถทำได้ด้วย

(()(){([()()]{})()(){[()()](<{}>)}}{})

เพื่อความชัดเจนสิ่งนี้จะใช้ฟังก์ชัน Haskell

f 0 = 2
f 2 = 4
f x = x

วิธีนี้ช่วยแก้ไขปัญหาของเราเนื่องจากหนึ่งในโปรแกรมที่ก่อนหน้านี้กำลังแสดง2ผลในขณะนี้4มีผลลัพธ์โดยไม่มีการเปลี่ยนแปลงโปรแกรมอื่น


2

Java 7, คะแนน: ∞

public class DerangedRearrangements implements B{public void a(){System.out.println("0");}public static void main(String[]a)throws Exception{java.util.regex.Pattern p=java.util.regex.Pattern.compile("^(?:public )?class ([\\w]+).*");java.io.BufferedReader r=new java.io.BufferedReader(new java.io.FileReader("./DerangedRearrangements.java"));String line; while((line=r.readLine())!=null){java.util.regex.Matcher m=p.matcher(line);if(m.matches()){((B)Class.forName(m.group(1)).getDeclaredConstructor().newInstance()).a();}}}}interface B{void a();}
class b1 implements B{public void a(){System.out.println(getClass().getName().substring(1));}}

ลองออนไลน์!

นี่คือสามารถพิมพ์0เพื่อn! -1 บรรทัดเพิ่มเติมเป็นรูปแบบต่อไปนี้ (โดยที่ INDEX เป็นตัวเลขตั้งแต่1ถึงn! -1 ):

class b<INDEX> implements B{public void a(){System.out.println(getClass().getName().substring(1));}}

วิธีการนี้ทำงานได้โดยการอ่านแหล่งที่มาของตัวเองเพื่อกำหนดคลาสการสั่งซื้อที่มีการระบุไว้ในนั้น น่าเสียดายที่ไม่มีวิธีการที่ดีกว่านี้ที่ฉันสามารถค้นหาได้โดยการแยกวิเคราะห์ไฟล์ที่คอมไพล์หรือสร้าง ClassLoader ที่กำหนดเองด้วยวิธีที่ Java ทำการคอมไพล์ JIT ฉันคิดว่าฉันสามารถมีคลาสเพิ่มเติมแต่ละอันได้เพียงพิมพ์หมายเลขที่กำหนดไว้แบบคงที่ แต่ดูเหมือนจะสนุกกว่านี้ นั่นจะทำให้ฉันสามารถเอาBอินเทอร์เฟซออกได้ แต่การให้คะแนนไม่ได้ขึ้นกับจำนวนไบต์ดังนั้นฉันจะปล่อยมันไว้เพื่อความสนุก

มันทำงานอย่างไร (ระดับสูง):

อ่านบรรทัดซอร์สโค้ดของตัวเองทีละบรรทัด เนื่องจากแต่ละบรรทัดประกาศคลาสใหม่เราใช้การสะท้อนเพื่อสร้างอินสแตนซ์ของคลาสใหม่และเรียกใช้aเมธอดที่ต้องการเนื่องจากใช้Bอินเทอร์เฟซ


1

ทับทิมคะแนน: ∞

(a||=[])<<2;a.size<3?0:(p 1+a.sort.permutation.to_a.index(a))
(a||=[])<<1;a.size<3?0:(p 1+a.sort.permutation.to_a.index(a))
(a||=[])<<3;a.size<3?0:(p 1+a.sort.permutation.to_a.index(a))

ลองออนไลน์!

โปรแกรมนี้มี 61 ไบต์ต่อบรรทัด (สำหรับ n <10) มันมีรูปแบบพื้นฐานเช่นเดียวกับวิธีการแก้ปัญหาของ dylnan ; หมายเลขแรกในแต่ละบรรทัดจะมีค่าแตกต่างกันระหว่าง1และnและหมายเลขที่สองในแต่ละบรรทัดจะเป็นnและหมายเลขที่สองในแต่ละบรรทัดจะ

ฉันหวังว่าจะหาวิธีหลีกเลี่ยงการรวมnไว้ในโปรแกรม แต่ฉันไม่สามารถหาได้



0

05AB1Eคะแนน: 1,114,112

0ˆ¯JD{œsk
1ˆ¯JD{œsk
2ˆ¯JD{œsk

ลองออนไลน์! 0 การจัดทำดัชนี ˆ ที่จุดเริ่มต้นของแต่ละบรรทัดผลักอักขระที่แตกต่างไปยังอาร์เรย์ทั่วโลก ส่วนที่เหลือของรหัสจะถูกดำเนินการอย่างไร้ประโยชน์ยกเว้นในบรรทัดสุดท้ายที่มันเชื่อมต่อค่าลงในสตริงแล้วหาดัชนีการเปลี่ยนแปลงของมัน 1,114,112 คือจำนวนตัวอักษร Unicode ที่เป็นไปได้ในขณะที่เขียน (คะแนนรหัส 48-57 นั้นเป็นวิธีที่ง่ายที่สุดในการสาธิตด้วย)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.