Exploitez les «espaces libres»


20

Supposons qu'un défi de codegolf ne compte pas les espaces dans la longueur de votre programme. Trichez ce système en encodant votre script en espace blanc et jouez un script qui décode et exécute l'espace blanc intégré.

Exemple

Ma solution à JBernardo de Meta Golf Challenge est le code Sage pour coder (ou Python) dans les espaces, et le golf du décodeur.

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

L'encodage consiste à prendre un script, à ajouter une nouvelle ligne et, pour chaque caractère cdu script, des ord(c)onglets de sortie suivis d'un espace. L'ajout d'une nouvelle ligne est nécessaire car j'utilise Python et je démarre le script savec un espace.

Notation

Une solution complète contient une description de l'encodage que vous utilisez (si c'est compliqué, fournissez un script) et un script de «décodage et exécution». Votre score est le nombre de caractères non blancs dans le script de décodage et d'exécution.

Les espaces (la langue) sont interdits

De plus, toute langue qui possède un ensemble complet d'opérateurs qui n'utilisent que des espaces blancs n'est pas autorisée: j'accepte le score non nul le plus bas.

Réponses:


8

Golfscript, 12 caractères

La chaîne délimitée par 'va avant ces 10 caractères:

n/{,}%''+~

Chaque ligne est décodée en un caractère, dont la valeur ASCII (probablement Unicode, en fait) est la longueur de la ligne.

Malheureusement, si j'essaie de coller mon exemple Hello World, Markdown supprime les espaces supplémentaires, même dans un <pre>bloc.


2
Étant donné que les espaces au début d'un programme sont toujours non fonctionnels, .n/{,}%+~cela fonctionnerait également.
Dennis

9

CPAN, 16

use Acme::Bleach;

Le CPAN a tout pour plaire. Ou du moins, juste le bon module.


J'appelle tricher à ce sujet, c'est un ensemble complet d'opérateurs qui n'est rien d'autre que des espaces blancs
Ratchet Freak

5
Ce n'est pas une triche. C'est bon marché, mais acceptable.
stand

1
Ce programme ne fait rien. Aucun des WS n'est là. BOOOOOO !!!! Veuillez republier cela avec un programme qui fait quelque chose d'utile ici. Gardez l'utilisation d'Acme :: Bleach, mais profitez-en.
Thomas Eding

1
@trinithis: comme aucun des autres programmes présentés ici. Pourquoi choisir spécifiquement celui-ci?
JB

Je l'ai remarqué et ça se démarque comme quoi ça fait, on dirait juste qu'il importe.
Thomas Eding

3

Perl, 29

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

À l'intérieur, il s///y a un onglet puis un espace. L'encodage est un encodage ultra-basique avec des espaces, précédé de tabulations.

Essayez celui-ci sur la ligne de commande:

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

Edit: eh bien, lol, je ne peux pas trouver une bonne façon de copier-coller le mix tab / espace. Croyez-moi, cela fonctionne à la maison :) Mise à jour: là, là, encodé avectr


vous pouvez mettre des onglets avec \tet nous pensons que cela fonctionne avec les espaces blancs ...
boothby

@boothby: oh, mieux que cela, je peux faire \tinterpréter par le shell et faire en sorte que la putain de chose fonctionne de façon démontrable. Faire cela en quelques heures.
JB

3

Javascript

Remplacez-le \tpar un onglet pour obtenir le nombre de caractères publiés.

Standard (64 caractères)

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

Fonction flèche (49 caractères)

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

Programme d'encodeur pour les deux

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

Remplacer (s)=>...dans la fonction flèche s=>...pour enregistrer deux octets
andrewarchi

Gardez des espaces entre deux caractères et au pire utilisez jsfuck pour le faire fonctionner (et mieux utiliser " t " [ 1 ]pour signifier "t")
l4m2

44Beval("".replace(/ +/g,s=>' []+!()'[s.length]))
l4m2

2

Yabasic (88 caractères)

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()

Utilisez le même programme d'encodeur que pour ma solution C, mais ne supprimez pas le premier caractère. Votre code d'origine doit être sous la forme d'un sous-programme a(), par exemple:

sub a():?"hello, world":end sub

2

C (99 caractères)

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

Testé uniquement avec (et ne fonctionne peut-être qu'avec) GCC.

Programme d'encodeur correspondant (supprimez manuellement le premier caractère de sa sortie):

#include <stdio.h>

int main()
{
    int c;
    while ((c = getchar()) != EOF) {
        while (c--) putchar(9);
        putchar(32);
    }
    return 0;
}

1

D (101 caractères)

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

même encodage que dans la question (pas besoin de la nouvelle ligne)


2
Le fait est que l'espace est libre. Je compte 98 caractères. N'hésitez pas à écrire du code lisible!
stand le

1

Bash (builtins uniquement, 44 caractères)

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

Script d'encodeur correspondant:

od -b | cut -b9- | tr ' ' '\n' | while read a
do
    for (( b = 0; b < $((10#$a)); ++b ))
    do
        echo -n ' '
    done
    echo
done

Très agréable. Je me considère un peu comme un hacker Bash, et j'ai dû faire manun peu de mal pour comprendre ça.
boothby

1

K5, 12 octets

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

Exécutez ( .) la chaîne formée à partir des valeurs ascii ( `c$) données par la différence entre chaque paire ( -':) des indices où ( &) l'entrée est un onglet ( 9=" ").

L'entrée est une chaîne de caractères tabulés et non tabulés, et les valeurs des caractères sont codées en nombre de non tabulés (espaces ou sauts de ligne) entre chaque tabulation. Un exemple d'encodeur:

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

Effectuez une jointure en cours commençant par un espace sur ( " ",/) x espaces ( x#" ") joints à un onglet ( ,"\t") où X est chacun de ( {...}') un moins les valeurs de caractères de la chaîne d'entrée ( -1+).

En action:

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

  enc "2+3"
"                                                  \t                                          \t                                                  \t"
  dec enc "2+3"
5

0

Rubis, 43

Très simple, l'encodage met x espaces par ligne, où x est la valeur ascii du caractère, le décodage est inversé.

Le script suivant est juste un convertisseur unaire en ASCII et fonctionne même lorsque les choses autres que les espaces sont libres:

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

Remplacez simplement la chaîne vide par le programme qui vous plaît.

La chose dans un format plus réutilisable:

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"
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.