Quine ... pero desplazado por uno


15

En referencia a los códigos de caracteres ASCII imprimibles en decimal, sabemos que del 32 al 126 tenemos los caracteres imprimibles con 32 siendo (espacio). Su desafío es escribir un programa utilizando solo caracteres del 32 al 125 (excluyendo 126) que, cuando se ejecuta, imprime su propio código fuente, excepto que cada carácter en el código fuente tiene su código ASCII aumentado en uno.

Por ejemplo, si el código fuente era

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

su salida sería

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

Lo siguiente está prohibido:

  • Lectura / escritura / uso de cualquier archivo externo o almacenamiento (incluido Internet)
  • Lectura / eco de su propio código fuente
  • Códigos fuente con menos de 2 caracteres (no son divertidos). Debe ser mayor o igual que 2.

Lo que lo convierte en un concurso de popularidad donde, después de esperar al menos dos semanas, la respuesta, en cualquier idioma, con los votos más altos gana y el recuento de caracteres más pequeños es el desempate.


¿Por qué no permitir 126, pero tiene que ir a 32? (No sé por qué / cómo alguien haría esto.)
Justin

Este tipo de preguntas también deberían prohibir que los mensajes de error se consideren como "salida" (lo siento @GariBN). "Salida" es material impreso deliberadamente en la salida estándar por su código, no efectos secundarios arbitrarios determinados por el lenguaje ejecutable.
l0b0

3
La imposibilidad de usar ~realmente apesta para GolfScript. Apuesto a que lo hiciste a propósito. :-)
Ilmari Karonen

1
defina "leer su propio código fuente". ¿Se nos permite stringificar una función, o tenemos que evaluar una cadena en su lugar?
John Dvorak

1
Este problema no parece tan adecuado como un concurso de popularidad.
l4m2

Respuestas:


46

Python (27 caracteres)

En el shell de Python, el siguiente script generará el resultado deseado:

TzoubyFssps;!jowbmje!tzouby

¡Si! produce:

SyntaxError: invalid syntax

66
Oh hombre, no vi venir esto. :-D
Punto fijo

99
En realidad, el resultado se cambia de la manera incorrecta: P
Erbureth dice que reinstalar a Monica el

@Erbureth Esto es relevante también para muchas otras respuestas aquí ... =)
Gari BN

Movimiento inteligente, aunque no es el más corto. xD
cjfaure

2
Estoy llamando a Trollololololol.
PyRulez

14

eh? , 5 caracteres

Ntbg 

Tenga en cuenta que el quinto carácter es un espacio despuésNtbg . Este es el mismo truco que en una de mis respuestas anteriores . Ntbges una ruta no válida, por lo que el intérprete dará salida Ouch!. Debe ejecutarlo así:

huh.exe Ntbg 

Me puedo imaginar las muchas frases con "¿Eh?" ahora. Quine invertido:! HcuO Quine: ¡Ay!
MilkyWay90

8

PHP (351)

Estoy seguro de que hay una mejor manera de hacerlo, ya que soy nuevo en codegolfing, pero aquí está mi solución 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;}

Salida:

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

¡Para su calculadora TI-83/84!

DQQ9RXMS@W

Salidas:

ERR:SYNTAX

6

GolfScript, 15 caracteres

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

Salida:

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

Pruébalo en línea.

Una solución bastante sencilla basada en la técnica que utilicé para mi entrada al desafío "quine rotativo" . El único detalle complicado es que el carácter ~(ASCII 126) no está permitido por las reglas de desafío, por lo que no puedo usarlo para ejecutar mi bloque de código. Afortunadamente, 1*se puede utilizar como sinónimo de ello.

Explicación:

El bloque de código {`{)}%"/2+"}es duplicado por ., y la segunda copia ejecutada por 1*(técnicamente, un bucle de una iteración), dejando la otra copia en la pila. Dentro del bloque de código, `stringifica el bloque de código y {)}%recorre (los códigos ASCII de) sus caracteres, incrementando cada uno en uno. Finalmente, "/2+"empuja la cadena literal /2+(que se .1*desplaza por una) en la pila. Al final del programa, el intérprete de GolfScript imprime automáticamente todo en la pila.

PD. Sí, sé que este es un lugar de un estricto , pero ¿qué más voy a hacer con GolfScript - ASCII art? ;-)


3

JavaScript, 117 caracteres

Sé que no es golf de código, pero lo jugué de todos modos.

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

(No estoy leyendo mi propio código fuente; simplemente estoy usando la función Functiondel objeto toString).


2

Java: 1331 bytes, 618 bytes y 504 bytes

Aquí está en java. Lo bueno es que es bastante legible y flexible. Puede experimentar para cambiar la SHIFTvariable a 0 y será una quine. Puede cambiarlo al valor que desee, incluidos los valores negativos, y cambiará el código en consecuencia.

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

Sin embargo, el único inconveniente en la clase anterior son los saltos de línea, que no están permitidos en la especificación de la pregunta (están fuera del rango de 32 a 125). Así que doy aquí una versión de golf que está libre de saltos de línea (y sin las peculiaridades para manejarlos). Puede editar el valor de la Svariable para cambiar el turno. Esto tiene 618 bytes:

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

Seguramente, si eliminamos el ajuste fino del desplazamiento y codificamos el valor del cambio, podemos hacer una versión completamente golfizada con 504 bytes:

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 caracteres incluyen los avances de línea

No se le permitió usar ~ lo hizo un poco más complicado.

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

Salida:

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

Esto se puede acortar a 75 caracteres , pero imprimirá un nuevo carácter de línea después de la salida, técnicamente rompiendo las reglas:

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

1
¿Por qué no pones una pestaña ( \x09) al final, ya que una pestaña desplazada por una es una nueva línea ( \x0A)? Entonces su versión acortada funcionaría con 76 bytes.
mbomb007


0

Lua - 192

Muy claro,

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

Solo el clásico C quine con las modificaciones requeridas

PD: aparentemente sprintf(f,...,f,...)es una segfault.


0

JavaScript (276)

Sin usar .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

Rubí, 63

Maldición, no puedo usar un heredoc en este caso.

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

Ruby tiene un método nativo .succque hace esto en un personaje, y la impresión sin una nueva línea es más corta que la impresión con, por lo que esto funciona bastante bien.


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

Otra modificación del clásico quine en c ...


0

> <>, 16 bytes

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

Pruébalo aquí!

Esto es más o menos una quine estándar en> <> (sin usar las ginstrucciones). Las únicas diferencias son que no lee su propio código fuente e incrementa cada carácter en 1 antes de generarlo.

Salidas

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

*> <> , 15 bytes (no competitivos)

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

Pruébalo aquí!



0

Tcl , 89 bytes

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

Pruébalo en línea!


Tcl , 89 bytes

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

Pruébalo en línea!


Dos enfoques; ¡la misma longitud de byte!




Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.