Quine… ale przesunięty o jeden


15

Odnosząc się do drukowanych kodów znaków ASCII w systemie dziesiętnym, wiemy, że od 32 do 126 mamy drukowalne znaki, przy czym 32 to (spacja). Wyzwanie polega na napisaniu programu zawierającego tylko znaki od 32 do 125 (z wyłączeniem 126), który po uruchomieniu drukuje własny kod źródłowy, z tym wyjątkiem, że każdy znak w kodzie źródłowym ma zwiększony o jeden kod ASCII.

Na przykład, jeśli kod źródłowy to

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

jego wyjście byłoby

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

Zabrania się:

  • Odczytywanie / pisanie / korzystanie z zewnętrznych plików lub pamięci (w tym Internetu)
  • Odczytywanie / echo własnego kodu źródłowego
  • Kody źródłowe zawierające mniej niż 2 znaki (nie są zabawne). Musi być większy lub równy 2.

Dzięki temu jest to konkurs popularności, w którym po odczekaniu co najmniej dwóch tygodni odpowiedź w dowolnym języku z najwyższymi ocenami wygrywa, a mniejsza liczba postaci decyduje o zwycięstwie.


Dlaczego nie pozwolić 126, ale musi on przejść do 32? (Nie wiem, dlaczego / jak ktokolwiek miałby to zrobić.)
Justin

Tego rodzaju pytania powinny również zabraniać uznawania komunikatów o błędach za „wynik” (przepraszam @GariBN). „Wyjście” to rzeczy celowo drukowane na standardowym wyjściu przez twój kod, a nie arbitralne skutki uboczne określone przez wykonywalny język.
l0b0

3
Niemożność korzystania ~z GolfScript naprawdę jest do kitu. Założę się, że zrobiłeś to celowo. :-)
Ilmari Karonen

1
zdefiniuj „czytanie własnego kodu źródłowego”. Czy możemy skreślić funkcję, czy zamiast tego musimy ewaluować ciąg?
John Dvorak

1
Ten problem nie wydaje się być odpowiedni jako konkurs popularności.
l4m2

Odpowiedzi:


46

Python (27 znaków)

W powłoce Pythona następujący skrypt wyświetli pożądany wynik:

TzoubyFssps;!jowbmje!tzouby

Tak! generuje:

SyntaxError: invalid syntax

6
O rany, nie widziałem, żeby to nadchodziło. :-D
Fixed Point

9
W rzeczywistości wynik jest przesunięty w niewłaściwy sposób: P
Erbureth mówi Przywróć Monikę

@Erbureth Dotyczy to również wielu innych odpowiedzi tutaj ... =)
Gari BN

Inteligentny ruch, choć nie jest najkrótszy. xD
cjfaure

2
Dzwonię Trollololololol.
PyRulez

14

co? , 5 znaków

Ntbg 

Zauważ, że piąty znak jest spacją poNtbg . To ta sama sztuczka, co w jednej z moich poprzednich odpowiedzi . Ntbgjest niepoprawną ścieżką, więc interpreter wyświetli Ouch!Powinieneś uruchomić ją w następujący sposób:

huh.exe Ntbg 

Mogę sobie wyobrazić wiele quinesów z „Huh?” teraz. Odwrócony Quine:! HcuO Quine: Ouch!
MilkyWay90

8

PHP (351)

Jestem pewien, że istnieje lepszy sposób, aby to zrobić, ponieważ jestem nowy w kodowaniu, ale oto moje rozwiązanie 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;}

Wynik:

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

TI-BASIC, 10

Do kalkulatora TI-83/84!

DQQ9RXMS@W

Wyjścia:

ERR:SYNTAX

6

GolfScript, 15 znaków

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

Wynik:

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

Wypróbuj online.

Dość proste rozwiązanie oparte na technice, której użyłem do wejścia na wyzwanie „rotating quine” . Jedynym trudnym szczegółem jest to, że znak ~(ASCII 126) jest niedozwolony przez reguły wyzwania, więc nie mogę go użyć do wykonania mojego bloku kodu. Na szczęście 1*może być używany jako jego synonim.

Wyjaśnienie:

Blok kodu {`{)}%"/2+"}jest powielany przez ., a druga kopia wykonywana przez 1*(technicznie, pętlę z jedną iteracją), pozostawiając drugą kopię na stosie. Wewnątrz bloku kodu, `uszeregowuje blok kodu i zapętla {)}%(kody ASCII) jego znaków, zwiększając każdy o jeden. Na koniec "/2+"wypycha dosłowny ciąg /2+(który jest .1*przesuwany o jeden) na stos. Na końcu programu interpreter GolfScript automatycznie drukuje wszystko na stosie.

Ps. Tak, wiem, że jest to a nie ścisłe , ale co jeszcze mam zrobić z GolfScript - sztuką ASCII? ;-)


3

JavaScript, 117 znaków

Wiem, że to nie jest golf golfowy, ale i tak grałem w golfa.

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

(Nie czytam własnego kodu źródłowego; po prostu używam funkcji Functionobiektu toString).


2

Java - 1331 bajtów, 618 bajtów i 504 bajtów

Oto java. Fajne jest to, że jest dość czytelny i elastyczny. Możesz eksperymentować, aby zmienić SHIFTzmienną na 0, a będzie to quine. Możesz go zmienić na dowolną wartość, w tym na wartości ujemne, i odpowiednio zmieni kod.

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 = @";
}

Jednak jedyną wadą w poprzedniej klasie są podziały wierszy, które nie są dozwolone w specyfikacji pytania (są poza zakresem od 32 do 125). Daję więc tutaj wersję golfa, która jest wolna od łamania linii (i nie ma dziwactw do ich obsługi). Możesz edytować wartość Szmiennej, aby zmienić przesunięcie. Ma 618 bajtów:

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=@";}

Z pewnością, jeśli porzucimy dokładną regulację przesunięcia i zakodujemy wartość przesunięcia, możemy wykonać całkowicie golfową wersję z 504 bajtami:

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 znaków zawiera linie

Niedopuszczenie do użycia ~ uczyniło to nieco trudniejszym.

#!/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

Wynik:

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

Można to skrócić do 75 znaków , ale po wydruku wyświetli nowy znak wiersza, co technicznie łamie zasady:

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

1
Dlaczego po prostu nie umieścisz tab ( \x09) na końcu, ponieważ tabulator przesunięty o jeden jest nową linią ( \x0A). Wtedy twoja skrócona wersja będzie działać z 76 bajtami.
mbomb007


0

Lua - 192

Całkiem proste,

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);}

Tylko klasyczny Quine C z wymaganymi modyfikacjami

PS, najwyraźniej sprintf(f,...,f,...)to segfault.


0

JavaScript (276)

Bez użycia .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

Ruby, 63

Cholera, nie mogę użyć heredoka na tym.

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

Ruby ma natywną metodę, .succktóra robi to na znaku, a drukowanie bez nowego wiersza jest krótsze niż drukowanie przy użyciu, więc działa to całkiem nieźle.


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);}

Kolejna modyfikacja klasycznego quine w c ...


0

> <>, 16 bajtów

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

Wypróbuj tutaj!

Jest to mniej więcej standardowy quine w> <> (bez użycia ginstrukcji). Jedyne różnice polegają na tym, że nie odczytuje własnego kodu źródłowego i zwiększa każdy znak o 1 przed wysłaniem.

Wyjścia

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

*> <> , 15 bajtów (niekonkurencyjne)

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

Wypróbuj tutaj!



0

Tcl , 89 bajtów

puts [join [lmap c [split [read [open $argv0]] ""] {format %c [expr [scan $c %c]+1]}] ""]

Wypróbuj online!


Tcl , 89 bajtów

puts [join [lmap c [split [read [open $argv0]] ""] {scan $c %c s;format %c [incr s]}] ""]

Wypróbuj online!


Dwa podejścia; ta sama długość bajtu!




Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.