Programa mais curto cujo programa concatenado + saída é uma permutação dos 95 caracteres ASCII imprimíveis

12

Escreva um programa o mais curto possível (medido pela contagem de bytes), não receba entrada, não contenha comentários e produz uma sequência / sequência de caracteres, de forma que o programa + saída concatenado tenha exatamente 95 caracteres e contenha todos os caracteres ASCII imprimíveis exatamente uma vez , ou seja, programa + saída é uma permutação dos 95 caracteres com códigos ASCII 32-126:

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

Em caso de empate, o vencedor é a entrada cujo programa + saída concatenado (95 caracteres) é o mais próximo da sequência acima, conforme medido pela distância de edição de Levenshtein (ou seja, o número de exclusões, inserções ou exclusões de caracteres únicos) substituições necessárias para colocá-lo em ordem ASCII).

res
fonte
2
Então, isso significa que se, por exemplo, o programa contiver caracteres repetidos, ele será desqualificado automaticamente? Isso é difícil.
embalagem de pão
1
Você também pode decidir se o antigo echo $0é desqualificado.
22613 Peter Peter Taylor
3
São permitidos caracteres fora do intervalo de caracteres ASCII imprimíveis (e possivelmente duplicados)? Ou o programa + output deve conter todos os caracteres imprimíveis exatamente uma vez e nada mais ?
Primo
1
@primo Eu assumo que eles são permitidos. Eu acho que é tempo para escrever um "shift-and-eval" solução que usa duplicatas (embora strings literais vão ser difícil de obter)
John Dvorak

Respostas:

12

GolfScript, 14 caracteres

{`),32>46-^}.~

Saída :

 !"#$%&'(*+/015789:;<=?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]_abcdefghijklmnopqrstuvwxyz|
Howard
fonte
O desafio (pelo menos até onde eu entendi) era escrever um programa cujo programa e saída são uma permutação dos 95 caracteres ASCII imprimíveis, não escrever o programa mais curto possível que produz os 95 caracteres ASCII imprimíveis.
22813 Frank Schmitt
Desculpe meu erro. No título, ele lê "programa + saída", enquanto mais tarde na pergunta lê programa + saída concatenado .
Frank Schmitt
),- Uau. Eu amo isso.
precisa
1
@JanDvorak codegolf.SE: o único lugar em que as pessoas ficam empolgadas com a proximidade e a vírgula. : P
Maçaneta da porta
@ Doorknob no golfscript significa "direito desconectado (rparen) e cria uma matriz desse tamanho (vírgula)". Na verdade, você fica com uma string reduzida por um caractere (o encaracolado direito) e uma matriz que termina logo abaixo da posição ASCII desse caractere (em |). Apare os caracteres não imprimíveis, o período e o xor (diferença simétrica do conjunto aqui) com o código-fonte (subtração é feita) sans dito corretamente, e pronto. E sim, string xor array é string.
John Dvorak
6

Perl, 89 caracteres

Este é o melhor que pude fazer até agora:

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

Para aqueles que não conhecem o Perl minutae, os dois argumentos para a printdeclaração podem ser apresentados como ~(-($=)) . (73 * 2)e tr///.

O programa gera 6 caracteres:

591460

Infelizmente cada construção iteração única que eu posso pensar em Perl ( for, while, until, map, grep) de ações pelo menos um personagem com print. Se novas linhas tiverem permissão para aparecer na saída, eu poderia usar o Perl 5.010 para obter uma solução de 87 caracteres:

q{ !"#%&'*,-./0:;>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^`bcdfgjkmnoprtuvxz|~}while($_+=say)<9
caixa de pão
fonte
Vamos ver se eu posso imprimir um número maior :-)
John Dvorak
você pode traduzir a segunda linha para mim?
John Dvorak
1
@JanDvorak $=é o número de linhas horizontais no dispositivo de saída atual. Por padrão, 60. ~-$=é a inversão bit a bit do complemento dos dois negativo de 60, o que acontece 59. 73*2é 146. .e ,faça o que você esperaria deles. y[]{}é outra maneira de dizer tr///, que é o operador transliterado. Não é preciso $_e não faz nada, porque você não forneceu nenhum caractere para substituir. Retorna o número de caracteres substituídos, o que é 0. Portanto, temos ~-$= . 73*2 , y[]{}= 59 . 146 , 0= '591460`.
21413 Dan
6

PHP 67 bytes

<?=U4eB1gkFdA6J9snZD2IE8y5PhwQV^xHGmqYMfNjKpbR3vcLalCWi0_TtrOSXouz;

Resultado:

-|"/@>& *+}:[!],'~(){.\`7#%$

Parece que deveria haver uma solução de 65 bytes, produzindo 30 caracteres em vez de apenas 28, mas não consegui alinhar. Os 6 caracteres não utilizados OSXouzforam pregados em uma das literais de sequência.

Editar: Após uma reflexão mais aprofundada, não é possível gerar mais de 28 caracteres dessa maneira. UPPER ^ lowersempre resultará em um caractere entre 32 e 63, portanto, todos os 10 dígitos são necessários @[\]_`{|}~. Quatro dos 22 restantes são usados ​​no próprio script, deixando apenas 18 que podem ser obtidos apenas com letras. O desempate pode ser melhorado significativamente, no entanto.

primo
fonte
Ah, claro, palavras de baralho. Como eu pude esquecer?
John Dvorak
3

Ruby, 91 caracteres

%{ !"#$&\',-/450:<=>ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_`abcefghijklmnqvwxyz|~};puts(?@‌​.ord*98+1)

Saídas 6273.

%{...} truque roubado de Jan Dvorak

Maçaneta da porta
fonte
Sem comentários. Como claramente indicado.
Johannes Kuhn
@JohannesKuhn Ah, não percebi isso. editado.
Maçaneta
%{ !"#$&\',-/450:<=>ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcefghijklmnqvwxyz|~};puts([email protected]*98+1)é o que eu acho que você deseja (para 91 caracteres) com o ponto-e-vírgula movido para ser usado como um separador imprimível (em vez de uma nova linha) e com as letras de 'ord' removidas de dentro dos colchetes.
res
@res Sim, é difícil gerenciar todas essas cartas: P
Maçaneta da porta
Agora \ é incluído três vezes.
Howard
3

Perl, 61 caracteres

print$:x8^CJIBQTOWAEULHVGFNMKRPZY,q<#"/;*g~?|={.>&+u15m97ws26

Resultado:

c@db[yo]le_ah\jfD`kX}zS-! %)('v304

$:o padrão é " \n-". x8repete oito vezes; o resultado de 24 caracteres é então armazenado bit a bit com uma restrição de 23 caracteres (o último -é deixado como está). A segunda parte é uma string q de 12 caracteres bit a bit e uma restrição de 10 caracteres (os últimos 2 caracteres são descartados).

Grimmy
fonte
1
Acho que o tamanho do seu programa é de 61 caracteres.
res
Obrigado. Meu editor de texto relatou 62 caracteres por causa do EOF.
Grimmy # 14/13
1

Ruby, 95 caracteres, 6 edições

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

Sim. É isso aí. Apenas um literal de cadeia flutuante livre que nunca é impresso. Ruby suporta literais de seqüência de caracteres (emprestados de Perl, eu acho) na forma de delimitador de porcentagem - o delimitador é qualquer caractere não alfanumérico e, se o delimitador de abertura for um colchete de abertura (qualquer um [({<), o delimitador de fechamento será o correspondente colchete de fechamento (colchetes aninhados são permitidos).

Sei que isso é mais um envio de linha de base, mas, a menos que alguém consiga realmente imprimir algo ou a menos que exista um idioma com uma string de forma livre de dois caracteres literal com um delimitador de abertura e fechamento diferente , é o melhor que existe.

John Dvorak
fonte
0

Tcl 96, distância de edição 12

if 0    {!"#$%&'()*+,-./123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdeghjklmnopqrstuvwxyz|~}
Johannes Kuhn
fonte
Um dos espaços deve ser um guia, eu tenho medo
John Dvorak
é possível imprimir uma guia ou espaço?
Johannes Kuhn
A guia não pode ser impressa (ASCII 9), mas o espaço é imprimível (ASCII 32).
John Dvorak
1
[Só vi que o OP única esclareceu isso depois de você respondeu :)]
flornquake
1
join {!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghklmpqrstuvwxyz|~} parece funcionar com 95 caracteres? (Obrigado por sua entrada Desculpe o camaleão -. Infelizmente eu editado às pressas, e deve ter feito as coisas de forma diferente.)
res