Explotar "espacio en blanco libre"

20

Supongamos que un desafío de codegolf no cuenta espacios en blanco en la duración de su programa. Haga trampa en este sistema codificando su secuencia de comandos en espacios en blanco y desarrolle una secuencia de comandos que decodifique y ejecute espacios en blanco integrados.

Ejemplo

Mi solución a JBernardo 's Meta desafío del golf fue para codificar código de Sage (o Python) en los espacios en blanco, y el golf el decodificador.

s = ' '
for c in '<lots of whitespace>'.split(s):
    s+=chr(len(c))
exec s

La codificación consiste en tomar un guión, anteponer una nueva línea y, para cada carácter cdel guión, generar ord(c)pestañas seguidas de un espacio. Es necesario anteponer una nueva línea ya que estoy usando Python y comienzo el script scon un espacio.

Puntuación

Una solución completa contiene una descripción de la codificación que usa (si es complicada, proporcione un script) y un script 'decodificar y ejecutar'. Su puntaje es el número de caracteres que no son espacios en blanco en el script de decodificación y ejecución.

El espacio en blanco (el idioma) está prohibido

Además, no se permite ningún lenguaje que tenga un conjunto completo de operadores que solo usen caracteres de espacio en blanco: aceptaré la puntuación más baja que no sea cero.

boothby
fuente

Respuestas:

8

Golfscript, 12 caracteres

La cadena delimitada por 'va antes de estos 10 caracteres:

n/{,}%''+~

Cada línea se decodifica en un carácter, cuyo valor ASCII (probablemente Unicode, de hecho) es la longitud de la línea.

Lamentablemente, si trato de pegar mi ejemplo Hello World, Markdown elimina los espacios adicionales, incluso en un <pre>bloque.

Peter Taylor
fuente
2
Dado que el espacio en blanco al comienzo de un programa siempre no es funcional, .n/{,}%+~también funcionaría.
Dennis
9

CPAN, 16

use Acme::Bleach;

CPAN lo tiene todo. O al menos, el módulo correcto.

JB
fuente
Me llamo trampas en esto, que es un conjunto completo de operadores que no es más que un espacio en blanco
monstruo de trinquete
55
Esto no es un truco. Es barato, pero aceptable.
Boothby
1
Este programa no hace nada. Ninguno de los WS está allí. BOOOOOO !!!! Vuelva a publicar esto con un programa que haga algo útil aquí. Mantenga el uso de Acme :: Bleach, pero aprovéchelo.
Thomas Eding
1
@trinithis: al igual que ninguno de los otros programas presentados aquí. ¿Por qué elegir específicamente en este?
JB
Lo noté y se destaca como lo que hace esto, solo parece que importa.
Thomas Eding
3

Perl, 29

$_="";s/     */chr length $&/ge;eval

Dentro de eso s/// hay una pestaña y luego un espacio. La codificación es una codificación ultra básica con espacios, precedida de pestañas.

Pruebe este en la línea de comando:

$ tr ST ' \t' <<< '$_="TSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSTSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSTSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSTSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSTSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSTSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSTSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSTSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSTSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSTSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSTSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSTSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSTSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSTSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSTSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSTSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSTSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSTSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSTSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSTSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSTSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSTSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSTSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS"; s/TS*/chr length $&/ge; eval' | perl

Editar: bueno, lol, no puedo encontrar una manera adecuada de copiar y pegar la mezcla de tabulación / espacio. Créeme, funciona en casa :) Actualización: allí, allí, codificado contr

JB
fuente
puedes poner pestañas \ty creemos que funciona con espacios en blanco ...
stand
@boothby: oh, mejor que eso, puedo hacer que el \tintérprete interprete y realmente hacer que la maldita cosa funcione de manera demostrable. Haciendo eso en unas pocas horas.
JB
3

JavaScript

Reemplazar \t con una pestaña para obtener el recuento de caracteres publicado.

Estándar (64 caracteres)

eval(eval("'<code here>'".replace(/\t */g,function(s){return"\\"+s.length})))

Función de flecha (49 caracteres)

eval(eval("'<code here>'".replace(/\t */g,(s)=>"\\"+s.length)))

Programa de codificador para ambos

for(var i = 0, si = prompt("Enter the code."), so = ""; i < si.length; ++i) so += '\t' + Array(+si.charCodeAt(i).toString(8)).join(' '); prompt("Here is the result.", so);
Por favor levantese
fuente
Reemplace (s)=>...en la función de flecha s=>...para guardar dos bytes
andrewarchi
Mantenga espacios entre dos caracteres y, en el peor de los casos, use jsfuck para que funcione (y mejor use " t " [ 1 ]para significar "t")
l4m2
44Beval("".replace(/ +/g,s=>' []+!()'[s.length]))
l4m2
2

Yabasic (88 caracteres)

a$ = "<code here>"
for a = 1 to len(a$)
    if mid$(a$, a) < " " then b = b + 1
    else b$ = b$ + chr$(b) : b = 0
    endif
next
compile(b$)
a()

Use el mismo programa codificador que para mi solución C, pero no elimine el primer carácter. Su código original debe tener la forma de una subrutina a(), por ejemplo:

sub a():?"hello, world":end sub
Por favor levantese
fuente
2

C (99 caracteres)

main(c, p)
{
    char *s = "<code here>";
    for (p = popen("cc -xc -oa -", "w"); *s;)
        *s++ - 9 ? c -= putc(c, p) : ++c;
    execl("a", pclose(p));
}

Probado solo con (y tal vez solo funciona con) GCC.

Programa codificador correspondiente (elimine manualmente el primer carácter de su salida):

#include <stdio.h>

int main()
{
    int c;
    while ((c = getchar()) != EOF) {
        while (c--) putchar(9);
        putchar(32);
    }
    return 0;
}
Por favor levantese
fuente
1

D (101 caracteres)

import std.algorithm;mixin((){char[]r;foreach(c;splitter("<lots of whitspace>"," "))r~=cast(char)c.length;return r;}());

misma codificación que en la pregunta (no se necesita la nueva línea)

monstruo de trinquete
fuente
2
El punto de esto es que el espacio en blanco es libre. Cuento 98 caracteres. ¡Siéntase libre de escribir código legible!
Boothby
1

Bash (solo incorporado, 44 ​​caracteres)

IFS=
eval `while read a
do printf '\'${#a}
done<<a
<code here>
a`

Script codificador correspondiente:

od -b | cut -b9- | tr ' ' '\n' | while read a
do
    for (( b = 0; b < $((10#$a)); ++b ))
    do
        echo -n ' '
    done
    echo
done
Por favor levantese
fuente
Muy agradable. Me considero un poco hacker de Bash, y tuve que manlevantarme un poco para asimilar esto.
Boothby
1

K5, 12 bytes

.`c$-':&9=" "

Ejecute ( .) la cadena formada a partir de los valores ascii ( `c$) dados por la diferencia entre cada par ( -':) de los índices donde ( &) la entrada es una pestaña (9=" " ).

La entrada es una cadena de caracteres con tabulación y sin tabulación, y los valores de los caracteres se codifican en el número de no tabulaciones (espacios o líneas nuevas) entre cada pestaña. Un codificador de ejemplo:

" ",/{(x#" "),"\t"}'-1+

Realice una combinación continua comenzando con un espacio sobre ( " ",/) x espacios ( x#" ") unidos con una pestaña ( ,"\t") donde X es cada uno de ( {...}') uno menos los valores de caracteres de la cadena de entrada (-1+ ).

En acción:

  enc: " ",/{(x#" "),"\t"}'-1+
  dec: .`c$-':&9=

  enc "2+3"
"                                                  \t                                          \t                                                  \t"
  dec enc "2+3"
5
JohnE
fuente
0

Rubí, 43

Muy sencillo, la codificación es poner x espacios por línea, donde x es el valor ascii del carácter, la decodificación es inversa.

El siguiente script es solo un conversor unario a ASCII y funciona incluso cuando las cosas que no sean espacios son libres:

eval("".split("\n").map{|x|x.length.chr}.join)

Simplemente reemplace la cadena vacía con el programa que le agrade.

La cosa en un formato más reutilizable:

from_space = lambda {|text| text.split("\n").map{|x| x.length.chr}.join}
to_space = lambda {|text| text.chars.map{|x| " " * x.ord}.join("\n")}

p from_space [ to_space [ "abc" ] ] #=> "abc"
Caridorc
fuente