ตีกอล์ฟแอนนาแกรมของคุณเพื่อคุณภาพที่ดี!


12

งาน

ในความท้าทายนี้งานของคุณคือการเขียนโค้ดบางส่วนซึ่งส่งออกหนึ่งแอนนาแกรมที่เลือกแบบสุ่มด้วยการแจกแจงแบบสม่ำเสมอ แต่ไม่ควรเอาท์พุทตัวเองออกมา


รายละเอียดเพิ่มเติม

ไม่มีการป้อนข้อมูลโปรแกรมของคุณควรส่งออกหนึ่งในแอนนาแกรมของรหัสที่มา โปรแกรมของคุณไม่ควรส่งออกแหล่งที่มาของตัวเองเช่นมันไม่ควรจะเป็นควิน


อินพุต

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


เอาท์พุต

โปรแกรมของคุณสามารถแสดงผลในลักษณะใด ๆ ยกเว้นการเขียนลงในตัวแปร อนุญาตให้เขียนไฟล์คอนโซลหน้าจอและอื่น ๆ ได้ ฟังก์ชั่นreturnได้รับอนุญาตเช่นกัน


กฎเพิ่มเติม

  • ซอร์สโค้ดของโปรแกรมของคุณต้องมีอย่างน้อย 3 ตัวอักษร (ไม่ใช่ 3 ไบต์)

  • ซอร์สโค้ดของโปรแกรมของคุณจะต้องมีอย่างน้อย 3 แอนนาแกรม (ยกเว้นตัวเอง) ตัวอย่างเช่นaabไม่นับเป็นการส่งที่ถูกต้องเนื่องจากaabมีเพียงสองแอนนาแกรมที่ไม่ใช่aab( baaและaba)

  • โปรแกรมของคุณจะต้องไม่เกิดข้อผิดพลาดใด ๆ

  • โปรแกรมของคุณควรเอาท์พุทอักษรว่า

  • มาตรฐานช่องโหว่และมาตรฐานกฎควินใช้


ตัวอย่าง

abcสมมติว่ารหัสที่มาของโปรแกรมคือ มันควรสุ่มเอาท์พุทอย่างใดอย่างหนึ่งดังต่อไปนี้ (มีการแจกแจงแบบสม่ำเสมอ):

  1. acb
  2. bca
  3. bac
  4. cba
  5. cab

abcและก็ไม่ควรเอาท์พุท


เกณฑ์การชนะ

นี่คือดังนั้นโค้ดที่สั้นที่สุดในหน่วยไบต์ชนะ! ในกรณีที่เสมอกันโซลูชันที่โพสต์ก่อนหน้านี้ชนะ!


ที่เกี่ยวข้อง
Arjun

จำเป็นหรือไม่ที่จะต้องรับประกันว่ามันจะทำงานได้อย่างถูกต้องหรือมีโอกาส 1 เท่านั้น
PyRulez

@PyRulez ในความท้าทายนี้งานของคุณคือการเขียนโค้ดที่แสดงแอนนาแกรมแบบสุ่มที่มีการแจกแจงแบบสม่ำเสมอ ... (ประโยคแรก (ใต้ประโยคThe Task ))
Arjun

@Arjun มีโอกาส 0% ที่จะล้มเหลว
PyRulez

@PyRulez ล้มเหลวหรือไม่ รหัสควรจะส่งออกหนึ่งในนั้นคือแอนนาแกรม (ยกเว้นตัวเอง) เลือกแบบสุ่มโดยมีโอกาสเท่ากันของแอนนาแกรมใด ๆ ที่ถูกส่งออก ฉันไม่รู้ว่าคุณหมายถึงอะไรกับ "ล้มเหลว"
Arjun

คำตอบ:


5

เยลลี่ 15 ไบต์

“v0¡µṾ;ḢŒ!QḊX”v

เพียงเพื่อเริ่มต้นสิ่งต่าง ๆ ; นี่เป็นสิ่งที่เอาชนะได้อย่างแน่นอน นี่เป็นเพียงการรวมกันของตัวสร้างควินสากลและ "เลือกการเปลี่ยนแปลงแบบสุ่มนอกเหนือจากอินพุต" ฟังก์ชั่น; หลังอาจจะแก้ไขได้ในอดีตเกือบจะแน่นอน

คำอธิบาย

ตัวสร้าง quine สากล

“v0¡µṾ;Ḣ”v
“       ”v   Evaluate the following, given {itself} as argument:
 v0¡µ          No-op (which starts with "v")
     Ṿ         Escape string
      ;Ḣ       Append first character of {the argument}

นี้สามารถเห็นได้ว่าเป็นควินหากทำงานด้วยตัวเอง นอกจากนี้ยังเป็นควินที่เหมาะสมโดยคำจำกัดความส่วนใหญ่ที่ฉันรู้ มันไม่ได้อ่านแหล่งที่มาของตัวเอง (แต่มันมีตัวอักษรที่ "eval" ed และได้รับสำเนาของตัวเองเป็นอาร์กิวเมนต์) มันสามารถบรรทุกน้ำหนักบรรทุก (เท่าที่เห็นที่นี่!) และvนอกสตริง ตัวอักษรถูกเข้ารหัสโดยvภายใน

เลือกแอนนาแกรมแบบสุ่ม

Œ!QḊX
Œ!     All permutations
  Q    Discard duplicates
   Ḋ   Discard the first (i.e. the string itself)
    X  Choose random element

นี่มันไม่มีประสิทธิภาพจริง ๆ ในสายยาวนี้ดังนั้นฉันจึงไม่สามารถทดสอบโปรแกรมโดยรวมได้ แต่ฉันได้ทดสอบกับสตริงที่สั้นกว่าและดูเหมือนว่าจะทำงานได้อย่างถูกต้อง


เหตุใดจึงไม่ทำงานกับ TIO
Mr. Xcoder

@ Mr.Xcoder มันอาจจะเกินกำหนด 60 วินาที
Erik the Outgolfer

โอ้ใช่คุณพูดถูก
Mr. Xcoder

Qในขณะที่คุณมีมันอยู่ในไบต์ของคุณนับรหัสของคุณคิดถึงสิ่งที่จำเป็น อย่างไรก็ตามฉันคิดว่าคุณสามารถเปลี่ยนวิธี "การเปลี่ยนลำดับทั้งหมด" ด้วยวิธี"สับเปลี่ยน" ที่ใช้โดยẊ⁼¿บันทึกไบต์ในขณะที่อนุญาตให้ทำงานบน TIO
Jonathan Allan

4

CJam , 17 ไบต์

{`"_~"+m!(a-mR}_~

นี่จะไม่เสร็จเร็ว ๆ นี้ดังนั้นจึงไม่มีการเชื่อมโยง TIO ในเวลานี้

ในฐานะที่เป็นปลอบใจนี่เป็นวิธีแก้ปัญหา 20 ไบต์ที่จะยุติอย่างรวดเร็ว:

{`"_~"+:S{mr_S=}h}_~

ลองออนไลน์!

คำอธิบาย

{`"_~"+   e# Standard quine framework, leaves a string equal to the source
          e# code on the stack.
  m!      e# Get all permutations. The first one will always be the original order.
  (a      e# Remove that copy of the source code and wrap it in a new list.
  -       e# Remove all copies of the source code from the list of permutations.
  mR      e# Pick a random permutation.
}_~

โซลูชัน 20 ไบต์แทนสับรหัสต้นฉบับจนกว่าจะแตกต่างจากต้นฉบับ


4

Python 2, 117 ไบต์

น่าแปลกที่โซลูชันนี้สั้นกว่าที่ฉันคาดไว้ Shuffles ซอร์สโค้ดจนกว่าจะแตกต่างจากต้นฉบับ

-2 ไบต์ขอบคุณ @ mbomb007
-3 ไบต์ขอบคุณ @Wondercricket

ลองออนไลน์

s=r"""from random import*;R='s=r\"""'+s+'\"""'+';exec s';L=R
while L==R:L=''.join(sample(R,len(R)))
print L""";exec s

นี่เป็นหนึ่งใน quines พื้นฐานในหลามที่ฉันได้แก้ไข

s = r"print 's = r\"' + s + '\"' + '\nexec(s)'"
exec(s)

การสร้างแอนนาแกรมทำได้โดยการสุ่มโมดูล

L=R
while L==R:L=''.join(sample(L,len(L)))

ตำแหน่ง R มีซอร์สโค้ด

s=...
R='s=r\"""'+s+'\"""'+'\nexec s'

จำเป็นต้องมีการเสนอราคาสามเท่าเนื่องจากฉันถูกบังคับให้เก็บตัวแยกบรรทัดไว้ในรหัส แอนนาแกรมจะมี 3 บรรทัดอยู่แล้ว


1
exec sแทนexec(s)
mbomb007

เนื่องจากstrจะไม่เปลี่ยนรูปคุณสามารถบันทึกไบต์ด้วยการทำL=Rและการใช้sampleในLมากกว่าการใช้ ในshuffle repl.it แนวคิดนี้นำมาจากStackoverflowlist
Wondercricket

@Wondercricket Sample ส่งคืนรายการอักขระดังนั้นการเปรียบเทียบผลลัพธ์กับ R จะส่งคืนค่า False เสมอ แต่ช่วยจัดเรียงใหม่ขอบคุณสำหรับความคิด!
Dead Possum

3

Java 7, 376 428 426 428 ไบต์

import java.util.*;class M{public static void main(String[]a){String s="import java.util.*;class M{public static void main(String[]a){String s=%c%s%1$c,x=s=s.format(s,34,s);for(List l=Arrays.asList(x.split(%1$c%1$c));x.equals(s);s=s.join(%1$c%1$c,l))Collections.shuffle(l);System.out.print(s);}}",x=s=s.format(s,34,s);for(List l=Arrays.asList(x.split(""));x.equals(s);s=s.join("",l))Collections.shuffle(l);System.out.print(s);}}

+52 และ +2 ไบต์สำหรับการแก้ไขข้อบกพร่องสองรายการ .. ฉันไม่ได้ตรวจสอบ (อย่างถูกต้อง) หากการสร้างสตริงแบบสุ่มนั้นเท่ากับซอร์สโค้ดต้นฉบับ โอกาสนี้มีน้อยทางดาราศาสตร์พิจารณาจำนวนตัวละครที่เกี่ยวข้อง แต่ฉันต้องตรวจสอบโดยไม่คำนึงถึงการปฏิบัติตามกฎท้าทาย

คำตอบแรกของฉันใน Java ..
ลองที่นี่

คุณสามารถลบทั้งสองCollections.shuffle(l)และเพิ่ม!ด้านหน้าของทั้งสองx.equals(s)เพื่อตรวจสอบว่าผลลัพธ์ที่แท้จริงเท่ากับโปรแกรม:
ลองที่นี่

คำอธิบาย:

  • String sมีรหัสที่มาที่ยังไม่ฟอร์แมต
  • %sจะใช้ในการป้อนข้อมูล String s.format(...)นี้ลงในตัวเองด้วย
  • %c, %1$cและ34จะใช้ในการจัดรูปแบบราคาสองครั้ง
  • s.format(s,34,s) ทำให้มันเข้าด้วยกัน

และส่วนหนึ่งของรหัสนี้มีหน้าที่ในการแสดงผลแอนนาแกรมแบบสุ่ม:

// Strings `s` and `x` now both contain the source-code:
x=s=s.format(s,34,s);

// Create a list with the characters of this source-code-String and loop
for(List l=Arrays.asList(x.split(""));
    // as long as String `x` equals String `s`
    x.equals(s);
    // Shuffle the list, and set it to `s` in every iteration of the loop:
    s=s.join("",l))Collections.shuffle(l);
// End of loop (implicit / single-line body)

// And then print the random anagram to STDOUT:
System.out.print(x);

1

05AB1E , 22 ไบต์

"34çìDJœ¦.R"34çìDJœ¦.R

สิ่งนี้จะสร้างรายการที่ใหญ่เกินไปสำหรับ TIO ดังนั้นลิงก์ใช้สตริงที่เล็กกว่า แต่ความคิดนั้นเหมือนกัน

ลองออนไลน์!

"34çìDJœ¦.R"           # Push this string
            34ç        # Push "
               ì       # Prepend
                DJ     # Duplicate and join 
                  œ¦   # Push all permutations except the original
                    .R # Pick a random element

1

Javascript (ES6), 128 ไบต์

!function a(){b="!"+a+"()",c=b.split(""),c.sort(()=>Math.round(Math.random())-.5),c!=b.split("")?console.log(c.join("")):a()}();

ใช้ sort () คืนค่าสุ่ม -1,0 หรือ 1 เพื่อสุ่มเอาท์พุท


0

Bash, 27 96 ไบต์

i=`cat $0`&&e=`fold -w1 $0|shuf|tr -d '\n'`&&while [ "$e" = "$i" ]; do `$0`; exit; done&&echo $e

foldแบ่งรหัสในบรรทัดshufสับเส้นและtrใส่รหัสกลับมารวมกัน

แก้ไขปัญหาของมันที่ส่งออกเองตอนนี้มันจะไม่ส่งออกตัวเอง

ลองออนไลน์!


1
มีโอกาสที่จะส่งออกโค้ดเองโดยไม่มีการเปลี่ยนแปลงหรือไม่?
Possum ที่ตายแล้ว

นอกจากนี้ยังดูเหมือนจะสับเพียงเส้นจึงไม่พีชคณิตทั้งหมดที่เป็นไปได้โดยเฉพาะอย่างยิ่งตั้งแต่โปรแกรมมีเพียงบรรทัดเดียว ...
มาร์ตินเอนเดอร์

การเรียงสับเปลี่ยนทั้งหมดเป็นไปได้ทดสอบ ฉันกำลังแก้ไขปัญหาของมันอาจจะ
เอาท์พุท

1
ที่$0มีลักษณะเหมือนการละเมิดของ“โปรแกรมของคุณจะต้องไม่ใช้การป้อนข้อมูลใด ๆ .”
จัดการ

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