Écrire un programme qui utilise tous les symboles ASCII non alphanumériques imprimables


17

En particulier, utilisez chacun de ces symboles au moins une fois dans votre code source:

! " # $ % & ' () * + , - .  / : ; < = > ? @ [ \ ] ^ _ ` { | } ~

Les symboles à l'intérieur des commentaires, des littéraux de chaîne, des expressions régulières (ou tout autre type de littéral, etc.) ne comptent pas (mais leurs délimiteurs tels que /**/ou ""comptent).

Le programme ne doit effectuer aucune action. Il suffit de compiler et de ne rien faire lors de son exécution.

Si, pour une raison quelconque, certains symboles ne peuvent pas être utilisés dans la langue de votre choix, expliquez-le rigoureusement (ce qui et pourquoi doivent être exclus).

Mise à jour: quelques réponses utilisaient des symboles contenant des expressions régulières. Je considérerais cela un peu problématique, c'est la même chose que de les mettre dans des chaînes de caractères ou des commentaires (c'est pourquoi je mets etc. dans cette exigence). Veuillez essayer sans cela. J'ai également mis à jour l'exigence ci-dessus.

Mise à jour: gain de code le plus court (étiqueté comme code-golf ). Comme suggéré, nous aurons probablement besoin de quelques critères de départage. Je suggère que s'il y a égalité, celle gagnante est celle dans laquelle les symboles ASCII apparaissent le plus ordonnés possible. Formellement: filtrer la première occurrence de chacun des symboles répertoriés d'un programme. Cela se traduira par une permutation sur les symboles répertoriés. Le programme avec moins de nombre d'inversion de sa permutation gagne.

Mise à jour: je serais heureux de voir des solutions / plus dans les langages ordinaires / traditionnels, tels que C (++), Java, Scala, Haskell, etc.


1
Peut-on avoir une exception littérale pour les caractères qui n'apparaissent dans aucun mot-clé, syntaxe ou opérateur dans une langue particulière? Ce n'est @%ni le backtick peut apparaître en c sauf dans le cadre d'un littéral (dans des versions suffisamment nouvelles de c %peut apparaître dans les digraphes). (et #n'apparaît que dans les directives du préprocesseur, mais nous devrons simplement vivre avec cela)? Autrement dit, je demande que l'approche de Matt soit explicitement rendue légale.
dmckee

2
le code le plus court gagne? je soupçonne qu'il devra également y avoir un critère de départage
ardnew

1
En Javascript, les caractères #, @et `ne sont pas légaux en dehors de toute sorte de littéral
Peter Olson

6
Il s'agit essentiellement d'un concours de "trouver une langue qui peut utiliser tous ces caractères comme syntaxe". Code d'or assez merdique à mon avis
Earlz

1
Oui, je suis d'accord avec @Earlz, je pense que ce serait mieux s'il devait faire quelque chose d'utile, dans le montant du bail, de cette façon, les gens ne pourraient pas simplement fluffer pour obtenir tous les caractères mais ce ne serait pas la solution ardnew . Car en l'état, vous ne pouvez pas raccourcir alors cela, ainsi que toute langue dans laquelle certains des caractères ne sont pas valides en dehors des littéraux - comme cela a été souligné par plusieurs personnes - sont instantanément disqualifiés. Ce qui signifie qu'il n'y a que quelques réponses non seulement acceptables mais correctes.
Ryan

Réponses:


18

Brainf * ck, 32 caractères

!"#$%&'()*+.-/:;>=<?@[\]^_`{|}~,

Imprime un visage souriant (si votre console peut afficher le symbole ASCII 1)

Oui, une solution Branf * ck qui bat Golfscript! : P

Si vous n'insistez sur aucune sortie, échangez simplement le +et .:

!"#$%&'()*.+-/:;>=<?@[\]^_`{|}~,

6
Hm ... Je préfère dire qu'il fait des caractères cacher dans les commentaires, mais oh bien.
cessé de tourner dans

5
@leftaroundabout: Ce ne sont pas des commentaires techniques car vous ne pouvez pas les utiliser pour commenter des instructions valides. Ils sont traités comme des espaces. Soit dit en passant, je suis d'accord avec vous qu'il s'agit d'un étirement sans vergogne des règles.
vsz

3
@vsz Il n'y a rien de mal à contourner les règles.
Gareth

1
Le nombre d'inversion de cette solution est 24, c'est donc le gagnant selon les règles. J'ai quelques doutes à ce sujet, car ignorer les personnages est très proche des commentaires, mais je dirais que c'est ma mauvaise, je n'ai pas pensé à cette possibilité en écrivant la question.
Petr Pudlák

1
@BodoThiesen En effet, c'est assez ancien, je suppose que cela pourrait également être admissible à une solution gagnante, bien que celle-ci soit meilleure, même si elle étire un peu les règles.
Petr Pudlák

47

Perl, 32 caractères

pas de masquage de symboles dans les commentaires, les littéraux de chaîne ou les expressions régulières. utilise tous les symboles avec précision une seule fois.

$`<@"^[(\{_},)]/+-~%'?&|:!*.=>;#

La description

j'ai essayé d'indiquer la priorité de l'opérateur avec une indentation: les expressions les plus à droite sont évaluées avant celles à leur gauche

        $`            # scalar variable $ named `
      <               # numeric less-than inequality <
        @"            # array variable @ named "
                      #   (array evaluated in scalar context)
    ^                 # bitwise XOR ^
        [(\{_},)]     # array reference [] 
                      #   containing array () 
                      #     containing reference \
                      #       to anonymous hash reference {}
                      #         with one key "_" 
                      #           and no value (nothing following comma ,)
                      #             (reference evaluated in scalar context)
      /               # numeric division /
        +-~%'         # unary addition +
                      #   and unary negation -
                      #     and bitwise complement ~
                      #       on hash variable % named '
                      #         (hash evaluated in scalar context)
  ?                   # ternary conditional operator ?:
    &|                # code reference variable & named |
  :                   # ternary conditional operator ?:
    ! *.              # logical negation !
                      #   on typeglob variable * named .
                      #     (typeglob evaluated in scalar context)
  =>                  # fat comma => for compound expression
                      #   (evaluates LHS as string, RHS is empty)
;                     # end of expression ;
#                     # start of comment #

Corrigez-moi si je me trompe, mais vous venez de faire un scalaire appelé `<@"^[(\{_},)]/+-~%'?&|:!*.=>?
M. Llama

2
@GigaWatt non, il s'agit d'une séquence de plusieurs expressions différentes. je vais ajouter une description de la façon dont il est évalué
ardnew

@GigaWatt: Non; en Perl, les identifiants symboliques sont tous des caractères uniques. De ce genre de chose, je pense que ce programme seulement des utilisations $`, @", %'et *.(un scalaire, tableau, hachage, et typeglob, respectivement), mais il est terriblement difficile d'être sûr. . .
ruakh

23
Soit vous êtes un génie, soit toute séquence d'octets aléatoire est un programme Perl valide. Ou les deux.
ugoren

4
Bien que selon mes propres règles, j'ai dû attribuer la solution Brainfuck, celle-ci est ma préférée (même taille, mais numéro d'inversion 279).
Petr Pudlák

9

Espace, 32

!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~

tous les caractères non blancs sont ignorés, donc c'est en fait un programme vide


3
on pourrait dire que tous les caractères non blancs sont des commentaires et cela n'est pas valide :)
NRGdallas

8

Python 65

a=lambda x:0.
@a#
def _():{[`'"$?'`,]};a<a!=a+a%a&a^a-a*a|~a>a/a\

J'ai utilisé les caractères ?et à l' $intérieur d'un littéral de chaîne. Ces caractères ne sont pas autorisés en dehors des littéraux de chaîne ou des commentaires.


Cela contient une syntaxe non valide. Plus précisément, {[`'"$?'`,]}n'est pas valide, car il crée un dictionnaire avec une clé sans valeur associée. Vous pouvez le rendre valide avec deux autres personnages comme ceci:{[`'"$?'`,]:0}
Strigoides

1
@Strigoides non, ça fait un set pas un dict. mais même si c'était le cas (clé dict sans valeur), il s'exécute, ce qui était la syntaxe requise et non valide. (vous avez besoin de python> = 2,7 pour que cela fonctionne)
Matt

Je vois, j'utilisais python 2.6 quand je l'ai testé.
Strigoides

8

PHP, 32 caractères

Probablement un peu troll, ce programme PHP est également un QUINE , et utilise tous les symboles dans l'ordre exact où ils sont répertoriés.

!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~

Exécutée à partir de la ligne de commande, la sortie sera simplement le contenu du fichier, car il n'y a pas <?phpd'invoquer l'interpréteur.

$ cat > a.php
!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~

$ php a.php
!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~

4
À mon humble avis, cela viole les symboles dans les commentaires, les littéraux de chaîne, les expressions régulières (ou tout autre type de littéraux, etc.) ne comptent pas , car tout le programme est un seul littéral.
Petr Pudlák

De plus, le programme requis par la tâche ne doit rien produire et il n'y a qu'une seule quine qui ne produit rien.
Paŭlo Ebermann

Il n'est même pas analysé par PHP, donc c'est à peu près invalide
Rob

@RobQuist bien sûr, il est analysé, il est occupé à chasser ce jeton T_OPEN_TAG insaisissable jusqu'à la fin amère
Leigh

7

Perl 6 (43 caractères)

Définissons un opérateur infixe avec un nom assez inhabituel:

sub infix:<!"#$%&'()*+,-./:;=?@[]^_´\|~>{}

Ce n'est ni un littéral ni un littéral dans une RE ou quoi que ce soit caché dans un commentaire. Tu ne me crois pas? L'exécution du programme suivant produira "2":

sub infix:<!"#$%&'()*+,-./:;=?@[]^_´\|~>($a, $b){ $a + $b }
say 1 !"#$%&'()*+,-./:;=?@[]^_´\|~ 1;

Mais je suis tout à fait sûr que vous, les imbéciles, élargirez encore les règles pour exclure la redéfinition du langage lui-même afin de nous rendre mécontents. :(


Je dirais que c'est correct, l'utilisation de symboles dans un identifiant semble raisonnable.
Petr Pudlák

7

Haskell, 53

a@""#%&*+/?^b|a'<-a!!0=(\_->a`b`[]);main=do{print$1}

Nous pouvons faire un peu plus court

45

a'@""#%&*+/?!<|^b=(\_->1`b`[]);main=do{main}

Toutefois , ce programme ne se termine pas, et utilise plus de caractères ( '!', '<', '|') dans le infix nouvellement défini.


5

k (33 caractères)

Très facile en k. Malheureusement, "doit être jumelé.

(@:'!""#$%&*+-\./;<=>?^_{}[`]|,~)

5

GolfScript (33 caractères)

{!""$%&()*+,-./<=>?@[\]^_`|~};:'#

"doit être jumelé. Il a fallu un peu d'essais et d'erreurs pour qu'il ne produise rien - la plupart des autres positions du :'résultat dans une sortie.


5

J, 33 caractères

''&][?!"$>{}:<;,|^~*/\%+`-@.#(=_)

' doit être doublé pour éviter les erreurs de syntaxe.

Ma première réponse manquait de symboles.


5

C, 48 caractères

Type de tricherie.

#define _ ~''*+,-./:<=>?[]`|\
@%^$&!
main(){"";}

2
Repousser définitivement les limites de la «tricherie», car la plupart d'entre eux apparaissent dans une macro non appelée. Que diriez-vous #define Q(_) "##_##"... char*c=Q(~''*+,-./:<=>?[]| \); `. Rien dans une chaîne, il est juste converti en un ... Ce serait plus long, bien sûr.
dmckee

@dmckee, je ne pense pas que votre suggestion soit plus honnête que la mienne. Dans les deux cas, les caractères problématiques ne se retrouvent pas dans le code. Je pourrais déplacer la plupart d'entre eux vers le code (comme je l'ai fait avec "";), mais le $@backtick semble désespéré.
ugoren

Aucun doute là-dessus, le mien est aussi grossier, sournois et sournois. Mais c'est amusant aussi.
dmckee

@dmckee, le plaisir est ce dont il s'agit. BTW, vous avez besoin #define Q(_) #_. Le préprocesseur serait traité "##_##"comme un littéral de chaîne.
ugoren

5

Postscript - 32 caractères

{!"#$&'()*+,-./:;=<>?@[\]^_`|~}%

Il en résulte un objet sur la pile, mais n'a aucun autre effet. Postscript autorise presque tous les caractères dans un identifiant, à l'exception de ceux <>()[]{}/qui sont des formes syntaxiques spéciales et %qui introduisent un commentaire. Le programme est symbolisé comme

{                  % start a procedure object
!"#$&'             % an identifier
()                 % an empty string
*+,-.              % an identifier
/:;=               % a symbol
<>                 % an empty hex string
?@                 % an identifier
[\]                % an array
^_`~|              % an identifier
}                  % close the procedure object
%                  % a comment

3

C # (91 caractères)

#define a 
class a{static int @Main(){return(char)1.1*""[0]/1%1-1+1!=1?1:~1^1>>1<<1&1+'\0';}}

Pour autant que je sache, le caractère $ n'est pas un caractère valide en dehors des littéraux de chaîne, donc je ne l'ai pas utilisé dans ma réponse.

EDIT : Merci à Peter Taylor , j'ai raccourci le code.


1
#if A... #endifest plus courte que #region...#endregion . Et "x"[0]+est plus court que [System.STAThread].
Peter Taylor

3

PowerShell (52 caractères)

$_+=(@(1.1,1)[0]-1)*1/1%'1'::ToInt|&{!"">~\1}<#^#>`;

J'ai dû mettre le caractère ^ comme une chaîne littérale parce que pour autant que je sache, le caractère ^ n'est pas un caractère PowerShell légal en dehors des littéraux de chaîne. Corrigez-moi si je me trompe.

Le seul moyen que j'ai trouvé pour tenir dans le caractère : est d'utiliser l' opérateur :: pour appeler une méthode statique.


3

Schéma, 41 caractères

(define !$%&*+,-./:<=>?@[\]^_`{|}~ "#'");

Cela profite de l'incroyable tolérance de Scheme pour les caractères dans les noms de variables. Dans ce programme, je crée une variable avec le nom! $% & * +, -. /: <=>? @ [] ^ _ `{|} ~ Que Scheme accepte avec plaisir.


3

Tcl 37 caractères

set {!#$%&'()*+,-./:<=>?@[]^\_`|~} ""

Définit une variable !#$%&'()*+,-./:<=>?@[]^\_`|~avec une chaîne vide


3

C: 83 56 caractères

#undef a
_;main($){$/=-+~!0|0^0%1,1<.0>0?'`':*&"@"[0];}\

Les signes at et les astuces ne font pas partie de la syntaxe C autorisée, je les ai donc mis entre guillemets.


1
Pourquoi les parenthèses (b)? C'est une syntaxe étrange et un gaspilleur de caractères.
ugoren

1
Si vous utilisez la structure du point, elle 0.0est beaucoup plus courte.
ugoren

Comment pourrais-je ne pas penser à cela (0,0)? La parenthèse est un reste de quand ils ont réellement enregistré un caractère, mais maintenant ils sont en effet inutiles. Merci @ugoren!
Fors

Je pense main(_,$)que sauvera un personnage.
ugoren

Et avec gcc, vous pouvez écrire x?:y, mais ce n'est pas le standard C.
ugoren

2

Lisp commun, 33 caractères

#+()'|!"$%&*,-./:;<=>?@[\]^_`{}~|

La partie principale de ce qui précède évalue (ou plutôt, évaluerait sinon pour l' #+()avant) au symbole nommé:

!#$%&()*+,-./:;<=>?@[\]^_`{}~

Il #+()s'agit d'éviter la sortie. Je ne sais pas si la |foo|syntaxe des symboles compte comme un littéral, mais les symboles sont utilisés comme noms de variable / fonction dans Common Lisp, et il y a déjà quelques réponses utilisant les caractères nécessaires dans ceux-ci.


2

Smalltalk (dialecte Squeak 4.x) 38 caractères

Implémentez cette méthode dans Object, la syntaxe est valide si les préférences autorisent l'affectation de soulignement (qui est le paramètre par défaut)

%&*+/<=>?@\!~y""^Z_([:z|{#'',$`;-y}]).

déclarer Z comme var globale dans le menu local s'il est interactif

Explications:

  • % & * + / <=>? @! ~ est un sélecteur binaire (un opérateur)
  • y est le paramètre (l'opérande)
  • "" est un commentaire vide
  • ^ signifie retour
  • Z est une variable globale
  • _ est une mission
  • () délimite une sous-expression
  • [: z |] délimite un bloc de code avec un paramètre z
  • {} délimite un tableau
  • # '' est un littéral de symbole composé d'une chaîne vide (premier élément du tableau)
  • , est un message binaire envoyé au symbole ci-dessus
  • $ `est un littéral de caractère utilisé comme argument du message ci-dessus
  • ; sert à enchaîner un deuxième message envoyé au même récepteur de symboles # ''
  • le deuxième message est -
  • y est utilisé comme deuxième argument de message
  • . est pour séparer la prochaine instruction (ici c'est une dernière période)

Merde, qui a dit que Smalltalk était lisible?

Notez que je n'ai pas triché, le seul caractère non valide `est mis dans un caractère littéral. EDIT voir ci-dessous, c'était une fausse affirmation (au moins dans Squeak)


Mais nous pouvons descendre à 34 caractères avec cette astuce

%&*+,-/<=>?@\!~|y""^[{#(:_;`$')}].

Cette fois:

  • # () délimite un tableau littéral
  • qui contient 4 symboles littéraux: _; `et 1 caractère littéral $ '

À strictement parler, nous pouvons considérer cela comme de la triche ... Ce n'est pas une chaîne littérale, mais c'est toujours un littéral non vide ...

Je dois encore doubler la citation de commentaire "" (sauf si je crée un caractère littéral avec lui $ ", mais je dois ensuite doubler la citation de chaîne '')
Je dois encore utiliser une lettre pour le paramètre (_ n'est pas accepté même si nous définissons les préférences permettent de souligner dans le sélecteur sur true).

Ce qui est bien, c'est que nous pouvons même exécuter la méthode, par exemple envoyer le message à 1 avec l'argument 2:

1%&*+,-/<=>?@\!~|2

EDIT Enfin en 35 caractères sans tricher

!%&*+,-/<=>?@`y""^[:x_|#()~$';\{}].

Remarques:

  • Les préférences permettent le soulignement dans le sélecteur activation du à l'aide d'un paramètre de bloc nommé x_
  • `est un caractère valide pour le sélecteur binaire contrairement à ce que j'ai dit
  • J'utilise également $ 'pour éviter de doubler un devis

1

R: 108 caractères

a=new(setClass("a",representation(b="list")));a@b=list(c_d=1:2);if(1!='\t'&.1%*%1^1>a@b$c[1]/1|F){`~`<-`?`}#

Clairement la soumission la plus longue, mais pour pouvoir utiliser des symboles @et $dans R, nous devons créer un objet qui a des emplacements (indexés en utilisant @) et des éléments nommés (indexés en utilisant $).
La solution la plus courte à laquelle j'ai pu penser a été de créer une nouvelle classe d'objet ( a=new(setClass("a",representation(b="list")))), ce qui fait des ravages. Sinon, mis à part les classiques qui n'ont pas besoin d'explications (comme !=, #ou 1:2),

`~`<-`?` 

crée un nouvel opérateur qui fait la même chose que l'opérateur ?(c'est-à-dire qu'il appelle la page d'aide de l'élément qu'il précède).

%*%calcule le produit interne de deux matrices (ici de 1^1et .1).
Le symbole _ne fait rien (AFAIK) dans R mais est couramment utilisé dans les noms de variables ou de fonctions, comme c'est le cas ici.


1

TI-Basic, 36

:End:#$%&'()*+.-/;>=<?@[\]^_`{|}~,!"

Ceci n'est pas valide car la citation de début est souvent utilisée pour les commentaires.
Tyzoid

@Tyzoid Je l'ai déplacé à la fin.
Timtech

Endtermine une instruction de boucle, pas le programme. Je pense que tu voulais dire Return.
lirtosiast
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.