Escreva um programa que use todos os símbolos ASCII não alfanuméricos imprimíveis

17

Em particular, use cada um destes símbolos pelo menos uma vez no seu código-fonte:

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

Símbolos dentro de comentários, cadeias literais, regexps (ou qualquer outro tipo de literal etc.) não contam (mas seus delimitadores, como /**/ou ""contam).

O programa não deve executar nenhuma ação. Ele só precisa compilar e não fazer nada quando executado.

Se, por algum motivo, alguns dos símbolos não puderem ser usados ​​no idioma de sua escolha, explique-o rigorosamente (o que e por que deve ser excluído).

Atualização: algumas respostas usavam símbolos dentro de expressões regulares. Eu consideraria isso um pouco problemático, é a mesma coisa que colocá-los em literais de string ou comentários (é por isso que coloquei etc. nesse requisito). Por favor, tente sem isso. Também atualizei o requisito acima.

Atualização: o código mais curto vence (marcado como código-golfe ). Como sugerido, provavelmente precisaremos de alguns critérios de desempate. Sugiro que, se houver um empate, o vencedor é aquele em que os símbolos ASCII aparecem o mais ordenados possível. Formalmente: filtre a primeira ocorrência de cada um dos símbolos listados em um programa. Isso resultará em uma permutação nos símbolos listados. O programa com menor número de inversões de sua permutação vence.

Atualização: ficaria feliz em ver algumas / mais soluções em linguagens regulares / comuns, como C (++), Java, Scala, Haskell, etc.

Petr Pudlák
fonte
11
Podemos ter uma exceção literal para caracteres que não aparecem em nenhuma palavra-chave, sintaxe ou operador em um idioma específico? Isso não é @%nem o backtick pode aparecer em c, exceto como parte de um literal (em versões suficientemente novas de c %pode aparecer em dígitos). (e #só aparece nas diretrizes do pré-processador, mas teremos que conviver com isso)? Ou seja, estou pedindo que a abordagem de Matt seja explicitamente legal.
precisa
2
código mais curto ganha? eu suspeito que terá de ser um critério de desempate demais
ardnew
11
Em Javascript, os caracteres #, @e `não são legais fora de qualquer tipo de literal
Peter Olson
6
Isso é basicamente uma competição de "encontrar uma linguagem que possa usar todos esses caracteres como sintaxe". Ouro código Belos cagado na minha opinião
Earlz
11
Sim, eu concordo com @Earlz, acho que seria melhor se tivesse que fazer algo útil, na quantidade de código de concessão, dessa maneira as pessoas não poderiam simplesmente se animar para obter todos os personagens, mas não seria a solução da ardnew . Porque, do jeito que está, você não pode ficar mais curto que isso, além de qualquer idioma em que alguns dos caracteres não sejam válidos fora dos literais - como foi apontado por várias pessoas - são desqualificados instantaneamente. O que significa que existem apenas algumas respostas não apenas aceitáveis, mas também o período de respostas corretas.
Ryan

Respostas:

18

Brainf * ck, 32 caracteres

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

Imprime um rosto sorridente (se o console puder gerar o símbolo ASCII 1)

Sim, uma solução Branf * ck que supera o Golfscript! : P

Se você insistir em nenhuma saída, basta trocar o +e .:

!"#$%&'()*.+-/:;>=<?@[\]^_`{|}~,
vsz
fonte
6
Hm ... Eu prefiro dizer que faz ocultar caracteres em comentários, mas tudo bem.
deixou de girar no sentido anti
5
@leftaroundabout: Eles não são tecnicamente comentários, porque você não pode usá-los para comentar instruções válidas. Eles são tratados como espaço em branco. A propósito, eu concordo com você que esse é um alongamento vergonhoso das regras.
Vsz
3
@vsz Não há nada de errado em dobrar as regras.
Gareth
11
O número de inversão desta solução é 24, por isso é o vencedor de acordo com as regras. Eu tenho algumas dúvidas sobre isso, já que ignorar os personagens está muito próximo dos comentários, mas eu diria que é ruim, não pensei nessa possibilidade ao escrever a pergunta.
Petr Pudlák 10/11/12
11
@BodoThiesen De fato, é bastante antigo, acho que também pode se qualificar para uma solução vencedora, embora essa seja melhor, mesmo que estenda um pouco as regras.
Petr Pudlák
47

Perl, 32 caracteres

sem símbolos ocultos em comentários, literais de sequência ou expressões regulares. usa todos os símbolos precisamente uma vez.

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

Descrição

Eu tentei indicar precedência do operador com recuo: as expressões mais à direita são avaliadas antes daquelas à sua esquerda

        $`            # 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 #
novo
fonte
Corrija-me se eu estiver errado, mas você acabou de fazer um escalar chamado `<@"^[(\{_},)]/+-~%'?&|:!*.=>?
Home
2
@GigaWatt não, esta é uma sequência de várias expressões diferentes. i irá adicionar uma descrição de como ele é avaliado
ardnew
@GigaWatt: Não; no Perl, os identificadores simbólicos são todos caracteres únicos. Desse tipo de coisa, eu acho que este programa apenas usos $`, @", %', e *.(a escalar, array, hash e typeglob, respectivamente), mas é muito difícil ter certeza. . .
Ruakh
23
Você é um gênio ou qualquer sequência de bytes aleatória é um programa Perl válido. Ou ambos.
ugoren
4
Embora, de acordo com minhas próprias regras, eu tivesse que premiar a solução Brainfuck, essa é a minha favorita (mesmo tamanho, mas número de inversão 279).
Petr Pudlák 10/11/12
9

Espaço em branco, 32

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

todos os caracteres que não são de espaço em branco são ignorados, então esse é realmente um programa vazio

SeanC
fonte
3
pode-se argumentar os mesmos que todos os caracteres não-espaço em branco são comentários e este é inválido :)
NRGdallas
8

Python 65

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

Eu usei os caracteres ?e $dentro de uma string literal. Esses caracteres não são válidos fora de literais ou comentários de string.

Matt
fonte
Isso contém sintaxe inválida. Especificamente, {[`'"$?'`,]}não é válido, pois cria um dicionário com uma chave sem valor associado. Você pode torná-lo válido com mais dois caracteres como este:{[`'"$?'`,]:0}
Strigoides 10/11/12
11
@ Strigoides não, faz um conjunto não um ditado. mas mesmo se esse fosse o caso (chave dict sem valor), ele será executado, que era o requisito, sintaxe inválida. (você precisa de python> = 2.7 para que ele funcione)
Matt
Entendo, eu estava usando o python 2.6 quando testei.
Strigoides
8

PHP, 32 caracteres

Provavelmente um pouco troll, este programa PHP também é um QUINE , e usa todos os símbolos na ordem exata em que estão listados.

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

Executado a partir da linha de comando, a saída será simplesmente o conteúdo do arquivo, pois não há <?phpcomo chamar o intérprete.

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

$ php a.php
!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~
Leigh
fonte
4
IMHO isso viola símbolos dentro de comentários, literais de seqüência de caracteres, regexps (ou quaisquer outros tipos de literais etc.) não contam , pois todo o programa é um único literal.
Petr Pudlák
Além disso, o programa requerido pela tarefa não deve produzir nada, e há apenas um quine que não produz nada.
Paŭlo Ebermann
Ele nem sequer ter analisado pelo PHP assim que esta é praticamente inválida
Rob
@RobQuist é claro que é analisado, é a caça ocupado que elusiva T_OPEN_TAG direito de token até o fim amargo
Leigh
7

Perl 6 (43 caracteres)

Vamos definir um operador infix com um nome bastante incomum:

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

Não é literal nem literal em um ER ou qualquer coisa oculta em um comentário. Você não acredita em mim? A execução do seguinte programa produzirá "2":

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

Mas tenho certeza de que você vai estender ainda mais as regras para excluir a redefinição da própria linguagem, para nos tornar infelizes para os pervertidos. :(

gfldex
fonte
Eu diria que está tudo bem, o uso de símbolos em um identificador parece razoável.
Petr Pudlák
7

Haskell, 53

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

Podemos tornar isso um pouco mais curto

45

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

no entanto, este programa não termina, e as utilizações mais caracteres ( '!', '<', '|') na infixa recém-definido.

deixou de girar contra-relógio
fonte
5

k (33 caracteres)

Muito fácil em k. Infelizmente "deve ser emparelhado.

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

GolfScript (33 caracteres)

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

"tem que ser emparelhado. Foram necessárias algumas tentativas e erros para não produzir nada - a maioria das outras posições do :'resultado em alguma saída.

Peter Taylor
fonte
5

J, 33 caracteres

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

' precisa ser dobrado para evitar erros de sintaxe.

Minha primeira resposta estava faltando alguns símbolos.

Gareth
fonte
5

C, 48 caracteres

Tipo de trapaça.

#define _ ~''*+,-./:<=>?[]`|\
@%^$&!
main(){"";}
Ugoren
fonte
2
Definitivamente forçando os limites de "trapaça", pois a maioria deles aparece em uma macro desnecessária. Que tal #define Q(_) "##_##"... char*c=Q(~''*+,-./:<=>?[]| \); `. Nada em uma string, apenas é convertido em um ... Seria mais longo, é claro.
dmckee
@ DMCkee, eu não acho que sua sugestão é mais honesta do que a minha. Nos dois casos, os caracteres problemáticos não acabam no código. Eu poderia mover a maioria deles para codificar (como fiz com "";), mas o $@backtick parece sem esperança.
ugoren
Sem dúvida, o meu também é sujo, discreto e sorrateiro. Mas é divertido também.
dmckee
@ DMCkee, diversão é o que se trata. BTW, você precisa #define Q(_) #_. O pré-processador trataria "##_##"como uma string literal.
ugoren
5

Postscript - 32 caracteres

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

Resulta em um objeto na pilha, mas, caso contrário, não tem efeitos. O Postscript permite quase qualquer caractere em um identificador, exceto pelos <>()[]{}/formulários especiais de sintaxe e %que introduzem um comentário. O programa é tokenizado como

{                  % 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
Geoff Reedy
fonte
3

C # (91 caracteres)

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

Até onde eu sei, o caractere $ não é um caractere válido fora dos literais da string, portanto não o usei na minha resposta.

EDIT : Graças a Peter Taylor , reduzi o código.

Comunidade
fonte
11
#if A... #endifé mais curto do que #region... #endregion. E "x"[0]+é mais curto que [System.STAThread].
Peter Taylor
3

PowerShell (52 caracteres)

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

Eu tive que colocar o caractere ^ como uma string literal, porque, até onde eu sei, o caractere ^ não é um caractere legal do PowerShell fora dos literais da string. Corrija-me se eu estiver errada.

A única maneira que encontrei para caber no caractere : é usar o operador :: para fazer uma chamada para um método estático.


fonte
3

Esquema, 41 caracteres

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

Isso tira proveito da incrível tolerância do Scheme para caracteres em nomes de variáveis. Neste programa, crio uma variável com o nome! $% & * +, -. /: <=>? @ [] ^ _ `{|} ~ Que Scheme aceita alegremente.

Strigoides
fonte
3

Tcl 37 chars

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

Define uma variável !#$%&'()*+,-./:<=>?@[]^\_`|~com uma sequência vazia

Johannes Kuhn
fonte
3

C: 83 56 caracteres

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

Os sinais de arroba e as reticências não fazem parte da sintaxe C permitida, então eu os coloquei entre aspas.

Para s
fonte
11
Por que os parênteses (b)? É uma sintaxe estranha e um desperdício de personagens.
precisa saber é o seguinte
11
Se você usar a estrutura para o ponto, 0.0é muito menor.
ugoren
Como eu não pude pensar nisso (0,0)? O parêntese é uma sobra de quando eles realmente salvaram um personagem, mas agora eles são realmente desnecessários. Obrigado @ugoren!
quer
Eu acho que main(_,$)vai salvar um personagem.
ugoren
E com gcc, você pode escrever x?:y, mas não é padrão C.
ugoren
2

Lisp comum, 33 caracteres

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

A parte principal do item acima avalia (ou melhor, avaliaria se não fosse o que está #+()na frente dele) com o símbolo chamado:

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

O #+()é para evitar a saída. Não tenho certeza se a |foo|sintaxe dos símbolos conta como literal, mas os símbolos são usados ​​como nomes de variáveis ​​/ funções no Common Lisp, e já existem algumas respostas usando os caracteres necessários.

Strigoides
fonte
2

Smalltalk (Squeak 4.x dialeto) 38 caracteres

Implemente esse método em Object, a sintaxe será válida se Preferências permitir atribuição de sublinhado (que é a configuração padrão)

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

declare Z como var global no menu pop-up se interativo

Explicações:

  • % & * + / <=>? @! ~ é um seletor binário (um operador)
  • y é o parâmetro (o operando)
  • "" é um comentário vazio
  • ^ significa retorno
  • Z é uma variável global
  • _ é uma tarefa
  • () delimita uma subexpressão
  • [: z |] delimita um bloco de código com um parâmetro z
  • {} delimita uma matriz
  • # '' é um literal de símbolo feito de uma string vazia (primeiro elemento da matriz)
  • , é uma mensagem binária enviada para o símbolo acima
  • $ `é um literal de caractere usado como argumento da mensagem acima
  • ; é para encadear uma segunda mensagem enviada para o mesmo receptor de símbolo # ''
  • a segunda mensagem é -
  • y é usado como o argumento da segunda mensagem
  • . é para separar a próxima instrução (aqui é um período final)

Porra, quem disse que Smalltalk era legível?

Note que eu não trapaceie, o único caractere não válido `é colocado em um caractere literal. EDIT veja abaixo, esta foi uma afirmação falsa (pelo menos no Squeak)


Mas podemos reduzir para 34 caracteres com esse truque

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

Desta vez:

  • # () delimita uma matriz literal
  • que contém 4 símbolos literais: _; `e 1 caractere literal $ '

A rigor, podemos considerar isso como trapaça ... Não é uma String literal, mas ainda é uma literal não vazia ...

Ainda tenho que dobrar a citação de comentário "" (a menos que eu faça um caractere literal com $ ", mas preciso dobrar a citação de String '')
. Ainda preciso usar uma letra para o parâmetro (_ não é aceito, mesmo que definimos Preferências para permitir sublinhado no seletor como true).

O bom é que podemos até executar o método, por exemplo, envie a mensagem para 1 com o argumento 2:

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

EDIT Finalmente em 35 caracteres sem fazer batota

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

Notas:

  • As preferências permitem sublinhado na ativação do seletor usando um parâmetro de bloco chamado x_
  • `é um caractere válido para o seletor binário, ao contrário do que eu disse
  • Também uso $ 'para evitar duplicar uma cotação
aka.nice
fonte
1

R: 108 caracteres

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){`~`<-`?`}#

Claramente, o envio mais longo, mas para poder usar símbolos @e $em R, precisamos criar um objeto que tenha slots (indexados usando @) e elementos nomeados (indexados usando $).
A solução mais curta que pude pensar foi criar uma nova classe de object ( a=new(setClass("a",representation(b="list")))), que cobra seu preço. Caso contrário, separe dos clássicos que não precisam de explicações (como !=, #ou 1:2),

`~`<-`?` 

cria um novo operador que faz o mesmo que o operador ?(ou seja, chama a página de ajuda do elemento que antecede).

%*%calcula o produto interno de duas matrizes (aqui de 1^1e .1).
O símbolo _não faz nada (AFAIK) em R, mas é usado rotineiramente em nomes de variáveis ​​ou funções, como é o caso aqui.

plannapus
fonte
1

TI-Basic, 36

:End:#$%&'()*+.-/;>=<?@[\]^_`{|}~,!"
Timtech
fonte
Isso não é válido porque a cotação inicial é frequentemente usada para comentários.
Tyzoid
@ Tyzoid eu mudei para o final.
Timtech
Endfinaliza uma instrução de loop, não o programa. Eu acho que você quis dizer Return.
precisa saber é o seguinte