ควิน… แต่ขยับไปทีละอัน


15

อ้างถึงรหัสอักขระ ASCII ที่พิมพ์ได้เป็นทศนิยมเรารู้ว่าจาก 32 ถึง 126 เรามีอักขระที่พิมพ์ได้โดยมี 32 เป็น (เว้นวรรค) ความท้าทายของคุณคือการเขียนโปรแกรมโดยใช้เฉพาะอักขระจาก 32 ถึง 125 (ไม่รวม 126) ซึ่งเมื่อเรียกใช้งานให้พิมพ์ซอร์สโค้ดของตัวเองยกเว้นว่าอักขระแต่ละตัวในซอร์สโค้ดมีรหัส ASCII เพิ่มขึ้นหนึ่งตัว

ตัวอย่างเช่นถ้าซอร์สโค้ดเป็น

main(){printf("Hello World");}

ผลลัพธ์ของมันจะเป็น

nbjo)*|qsjoug)#Ifmmp!Xpsme#*<~

ต่อไปนี้เป็นสิ่งต้องห้าม:

  • การอ่าน / เขียน / ใช้ไฟล์ภายนอกหรือที่เก็บข้อมูล (รวมถึงอินเทอร์เน็ต)
  • การอ่าน / การสะท้อนซอร์สโค้ดของคุณเอง
  • ซอร์สโค้ดที่มีอักขระน้อยกว่า 2 ตัว (ไม่สนุก) ต้องมากกว่าหรือเท่ากับ 2

ทำให้การประกวดเป็นที่นิยมซึ่งหลังจากรออย่างน้อยสองสัปดาห์คำตอบในภาษาใด ๆ ด้วยการ upvotes ที่สูงที่สุดจะเป็นผู้ชนะด้วยจำนวนตัวอักษรที่เล็กกว่านั้นคือ tie-breaker


ทำไมไม่อนุญาตให้ใช้ 126 แต่ต้องไปที่ 32 (ฉันไม่รู้ว่าทำไม / ทุกคนจะทำสิ่งนี้ได้อย่างไร)
Justin

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

3
การไร้ความสามารถที่จะใช้~sucks จริงๆสำหรับ GolfScript พนันได้เลยว่าคุณตั้งใจ :-)
Ilmari Karonen

1
กำหนด "อ่านซอร์สโค้ดของคุณเอง" เราได้รับอนุญาตให้ทำให้ฟังก์ชั่นเป็น stringify หรือเราต้องทำการ eval string แทนหรือไม่?
John Dvorak

1
ปัญหานี้ดูเหมือนจะไม่เหมาะสมสำหรับการประกวดความนิยม
l4m2

คำตอบ:


46

Python (27 ตัวอักษร)

ใน Python shell สคริปต์ต่อไปนี้จะแสดงผลลัพธ์ที่ต้องการ:

TzoubyFssps;!jowbmje!tzouby

ใช่ มันเอาท์พุท:

SyntaxError: invalid syntax

6
โอ้มนุษย์ไม่เห็นการมานี้ :-D
แก้ไขจุด

9
ที่จริงแล้วผลลัพธ์นั้นเปลี่ยนไปในทางที่ผิด: P
Erbureth พูดว่า Reinstate Monica

@Erbureth นี้มีความเกี่ยวข้องกับคำตอบอื่น ๆ อีกมากมายที่นี่ ... =)
Gari BN

การเคลื่อนไหวอย่างชาญฉลาดแม้ว่าจะไม่ใช่ระยะสั้นก็ตาม xD
cjfaure

2
ฉันกำลังโทรหา Trollololololol
PyRulez

14

ฮะ? , 5 ตัวอักษร

Ntbg 

โปรดทราบว่าอักขระตัวที่ 5 เป็นช่องว่างหลังจากNtbgนั้น นี่คือเคล็ดลับเช่นเดียวกับในหนึ่งในคำตอบของฉันก่อนหน้า Ntbgเป็นเส้นทางที่ไม่ถูกต้องดังนั้นล่ามจะเอาท์พุทOuch!คุณควรเรียกใช้แบบนี้:

huh.exe Ntbg 

ฉันนึกภาพได้หลายเรื่องด้วย "หือ?" ตอนนี้ Reverse Quine:! hcuO Quine: อุ๊ย!
MilkyWay90

8

PHP (351)

ฉันแน่ใจว่ามีวิธีที่ดีกว่าในการทำเช่นนี้เพราะฉันใหม่กับ codegolfing แต่นี่เป็นโซลูชัน PHP ของฉัน:

function q(){$q=chr(39);$a=array('function q(){$q=chr(39);$a=array(',');@$r.=$a[0];foreach($a as$b)$r.=$q.$b.$q.",";$r=substr($r,0,-1);$r.=$a[1];for($i=0;$i<strlen($r);$i++)$r{$i}=chr(ord($r{$i})+1);return $r;}');@$r.=$a[0];foreach($a as$b)$r.=$q.$b.$q.",";$r=substr($r,0,-1);$r.=$a[1];for($i=0;$i<strlen($r);$i++)$r{$i}=chr(ord($r{$i})+1);return $r;}

เอาท์พุท:

gvodujpo!r)*|%r>dis)4:*<%b>bssbz)(gvodujpo!r)*|%r>dis)4:*<%b>bssbz)(-(*<A%s/>%b\1^<gpsfbdi)%b!bt%c*%s/>%r/%c/%r/#-#<%s>tvctus)%s-1-.2*<%s/>%b\2^<gps)%j>1<%j=tusmfo)%s*<%j,,*%s|%j~>dis)pse)%s|%j~*,2*<sfuvso!%s<~(*<A%s/>%b\1^<gpsfbdi)%b!bt%c*%s/>%r/%c/%r/#-#<%s>tvctus)%s-1-.2*<%s/>%b\2^<gps)%j>1<%j=tusmfo)%s*<%j,,*%s|%j~>dis)pse)%s|%j~*,2*<sfuvso!%s<~


6

GolfScript 15 ตัวอักษร

{`{)}%"/2+"}.1*

เอาท์พุท:

|a|*~&#03,#~/2+

ลองออนไลน์

วิธีการแก้ปัญหาอย่างเป็นธรรมตรงไปตรงมาบนพื้นฐานของเทคนิคที่ผมใช้สำหรับรายการของฉันไป "หมุนควิน" ความท้าทาย รายละเอียดที่ยุ่งยากอย่างหนึ่งคือตัวละคร~(ASCII 126) ไม่ได้รับอนุญาตตามกฎการท้าทายดังนั้นฉันจึงไม่สามารถใช้มันเพื่อรันโค้ดบล็อกของฉันได้ โชคดีที่1*สามารถใช้เป็นคำพ้องความหมายของมัน

คำอธิบาย:

บล็อกของรหัส{`{)}%"/2+"}ถูกทำซ้ำโดย., และสำเนาที่สองที่ดำเนินการโดย1*(ในทางเทคนิค, การวนซ้ำหนึ่งรอบ), ปล่อยสำเนาอื่นไว้บนสแต็ก ภายในบล็อกรหัสให้`สร้างบล็อกรหัสและ{)}%วนลูป (รหัส ASCII ของ) อักขระเพิ่มขึ้นทีละตัว ในที่สุด"/2+"กดสตริงตัวอักษร/2+(ซึ่งถูก.1*เลื่อนหนึ่ง) ไปยังสแต็ก ในตอนท้ายของโปรแกรมล่าม GolfScript แล้วพิมพ์ทุกอย่างบนสแต็กโดยอัตโนมัติ

ps ใช่ฉันรู้ว่านี่เป็นการมากกว่าเข้มงวดแต่ฉันต้องทำอะไรกับ GolfScript - ASCII art? ;-)


3

JavaScript, 117 ตัวอักษร

ฉันรู้ว่ามันไม่ใช่รหัสกอล์ฟ แต่ฉันก็เล่นกอล์ฟอยู่ดี

function f(){alert((f+';f()').split('').map(function(x){return String.fromCharCode(x.charCodeAt()+1)}).join(''))};f()

(ฉันไม่ได้อ่านซอร์สโค้ดของตัวเองฉันแค่ใช้ฟังก์ชั่นFunctionของวัตถุtoString)


2

Java - 1331 ไบต์, 618 ไบต์และ 504 ไบต์

ที่นี่มันอยู่ในจาวา สิ่งที่ยอดเยี่ยมคือมันสวยและอ่านง่าย คุณอาจทดลองเปลี่ยนSHIFTตัวแปรเป็น 0 และมันจะเป็นควิน คุณสามารถเปลี่ยนเป็นค่าใดก็ได้ที่คุณต้องการรวมถึงค่าลบและมันจะเปลี่ยนรหัสตาม

public class Quinex {

    private static final int SHIFT = 1;

    private static String next(String now, boolean mangles) {
        String sb = "";
        for (char c : now.toCharArray()) {
            if (!mangles && c == 87) {
                sb += next(String.valueOf(SHIFT), true);
            } else {
                sb += (char) ((mangles ? c : c == 94 ? 10 : c == 64 ? 34 : c) + SHIFT);
            }
        }
        return sb;
    }

    public static void main(String... args) {
        System.out.println(next(TEXT, false) + next(TEXT, true) + new String(new char[] { 34, 59, 10, 125 }));
    }

    private static final String TEXT = "public class Quinex {^^    private static final int SHIFT = W;^^    private static String next(String now, boolean mangles) {^        String sb = @@;^        for (char c : now.toCharArray()) {^            if (!mangles && c == 87) {^                sb += next(String.valueOf(SHIFT), true);^            } else {^                sb += (char) ((mangles ? c : c == 94 ? 10 : c == 64 ? 34 : c) + SHIFT);^            }^        }^        return sb;^    }^^    public static void main(String... args) {^        System.out.println(next(TEXT, false) + next(TEXT, true) + new String(new char[] { 34, 59, 10, 125 }));^    }^^    private static final String TEXT = @";
}

อย่างไรก็ตามข้อเสียเปรียบเพียงอย่างเดียวในคลาสก่อนหน้าคือการขึ้นบรรทัดใหม่ซึ่งไม่ได้รับอนุญาตในสเป็กคำถาม (อยู่นอกช่วง 32 ถึง 125) ดังนั้นฉันให้ที่นี่เป็นรุ่น golfed ที่ไม่มีการแบ่งบรรทัด คุณสามารถแก้ไขค่าของSตัวแปรเพื่อเปลี่ยนการเปลี่ยนแปลง มี 618 ไบต์:

class Q{static String g(String p,int m){int S=1;String u="";for(char c:p.toCharArray()){if(m==0&&c==87){u+=g(String.valueOf(S),1);}else{u+=(char)((m>0?c:c==64?34:c)+S);}}return u;}public static void main(String[]y){System.out.println(g(T,0)+g(T,1)+new String(new char[]{34,59,125}));}static final String T="class Q{static String g(String p,int m){int S=W;String u=@@;for(char c:p.toCharArray()){if(m==0&&c==87){u+=g(String.valueOf(S),1);}else{u+=(char)((m>0?c:c==64?34:c)+S);}}return u;}public static void main(String[]y){System.out.println(g(T,0)+g(T,1)+new String(new char[]{34,59,125}));}static final String T=@";}

แน่นอนถ้าเราวางการปรับค่าออฟเซ็ตและ hardcode ค่าของการเปลี่ยนแปลงอย่างละเอียดเราสามารถทำเวอร์ชั่นกอล์ฟที่สมบูรณ์ด้วยขนาด 504 ไบต์:

class Q{static String g(String p,int m){String u="";for(char c:p.toCharArray()){u+=(char)((m>0?c:c==64?34:c)+1);}return u;}public static void main(String[]y){System.out.println(g(T,0)+g(T,1)+new String(new char[]{34,59,125}));}static final String T="class Q{static String g(String p,int m){String u=@@;for(char c:p.toCharArray()){u+=(char)((m>0?c:c==64?34:c)+1);}return u;}public static void main(String[]y){System.out.println(g(T,0)+g(T,1)+new String(new char[]{34,59,125}));}static final String T=@";}

1

Perl 5, 284 ตัวอักษรรวมถึง linefeeds

ไม่ได้รับอนุญาตให้ใช้ ~ ทำให้ยุ่งยากขึ้นอีกเล็กน้อย

#!/usr/bin/perl
$_=<<X;
#!/usr/bin/perl
Y
\$a=\$_;
s/\\\\/\\\\\\\\/g;
s/\\\$/\\\\\\\$/g;
\$b=\$_;
\$_=\$a;
s/Y/\\\$\\_\\=\\<\\<X\\;\\n\${b}X/;
s/(.)/chr(ord(\$1)+1)/ge;
print;
X
$a=$_;
s/\\/\\\\/g;
s/\$/\\\$/g;
$b=$_;
$_=$a;
s/Y/\$\_\=\<\<X\;\n${b}X/;
s/(.)/chr(ord($1)+1)/ge;
print;

1

Python 99

s='import sys;sys.stdout.write("".join(chr(ord(c)+1)for c in a%(s,a)))';a='s=%r;a=%r;exec s';exec s

เอาท์พุท:

t>(jnqpsu!tzt<tzt/tuepvu/xsjuf)##/kpjo)dis)pse)d*,2*gps!d!jo!b&)t-b***(<b>(t>&s<b>&s<fyfd!t(<fyfd!t

สิ่งนี้สามารถย่อให้เหลือได้ถึง75 ตัวอักษรแต่มันจะพิมพ์อักขระบรรทัดใหม่หลังจากเอาต์พุตซึ่งจะทำลายกฎทางเทคนิค:

s='print"".join(chr(ord(c)+1)for c in a%(s,a))';a='s=%r;a=%r;exec s';exec s

1
ทำไมคุณไม่ใส่แท็บ ( \x09) ไว้ท้ายสุดเนื่องจากแท็บที่ถูกแท็บหนึ่งเปลี่ยนเป็นบรรทัดใหม่ ( \x0A) จากนั้นเวอร์ชันที่ย่อของคุณจะใช้งานได้ 76 ไบต์
mbomb007


0

ลัวะ - 192

ตรงไปตรงมาสวย

s=[[print((('s=['..'['..s..']'..']'..s):gsub('.',function(x)return string.char(x:byte()+1)end)))]]print((('s=['..'['..s..']'..'];'..s):gsub('.',function(x)return string.char(x:byte()+1)end)))

0

C - 156

char*f="char*f=%c%s%c,q[200];i;main(){sprintf(q,f,34,f,34);while(q[i])q[i++]++;puts(q);}",q[200];i;main(){sprintf(q,f,34,f,34);while(q[i])q[i++]++;puts(q);}

เพียงแค่คลาสสิกซี Quine พร้อมการแก้ไขที่จำเป็น

PS, เห็นได้ชัดว่าsprintf(f,...,f,...)เป็น segfault


0

จาวาสคริปต์ (276)

โดยไม่ต้องใช้.toString():

function q(){x=String.fromCharCode;y=x(39);a=['function q(){x=String.fromCharCode;y=x(39);a=[','];r=a[0]+y+a[0]+y+","+y+a[1]+y+a[1];q="";for(c in r)q+=x(r[c].charCodeAt(0)+1);return q;}'];r=a[0]+y+a[0]+y+","+y+a[1]+y+a[1];q="";for(c in r)q+=x(r[c].charCodeAt(0)+1);return q;}

0

ทับทิม, 63

Darn ใช้ heredoc กับอันนี้ไม่ได้

s="s=%p;(s%%s).chars{|c|$><<c.succ}";(s%s).chars{|c|$><<c.succ}

Ruby มีวิธีเนทีฟ.succที่ทำกับตัวละครและการพิมพ์โดยไม่ต้องขึ้นบรรทัดใหม่จะสั้นกว่าการพิมพ์ด้วยดังนั้นจึงสามารถใช้งานได้อย่างเรียบร้อย


0

C, 153

main(a){char b[999];sprintf(b,a="main(a){char b[999];printf(a=%c%s%c,34,a,34);for(a=0;b[a];)b[a++]++;puts(b);}",34,a,34);for(a=0;b[a];)b[a++]++;puts(b);}

การปรับเปลี่ยนคลาสสิกอีกครั้งในค ...


0

> <>, 16 ไบต์

" r:2+l?!;1+o50.

ลองที่นี่!

นี่เป็นเพียงควินมาตรฐานใน> <> (โดยไม่ต้องใช้ gคำสั่ง) ความแตกต่างเพียงอย่างเดียวคือมันไม่ได้อ่านซอร์สโค้ดของตัวเองและเพิ่มอักขระแต่ละตัวทีละ 1 ก่อนที่จะส่งออก

เอาท์พุท

#!s;3,m@"<2,p61/

*> <> , 15 ไบต์ (ไม่แข่งขัน)

" r:2+Ol?!;1+ou

ลองที่นี่!






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