Preparando a cena:
É uma tarde normal, enquanto você relaxa após um longo dia participando de seu passatempo favorito: respondendo à infinidade de perguntas cativantes no PPCG. Não foi um bom dia para você; esses malditos programadores Pyth continuam recebendo a melhor resposta e isso está matando sua vibe. De repente, você percebe que uma nova pergunta foi publicada! Você decide; não desta vez CJammers. Furiosamente, você começa a digitar, criando um fluxo de caracteres; um feto do glorioso loop BrainFuck que seu produto final será. Você digita e digita. Mais rápido! Mais rápido, ainda! Você está tão concentrado que nem percebe que as luzes na tela começam a piscar. De repente, o monitor brilha em verde, um símbolo alienígena marcado na área de trabalho. Usando suas habilidades impecáveis vocêcat ~/Desktop/aliensymbol
e receba um monte de números, uma mensagem! Sendo o programador astuto de PPCG que você é, você percebe que ele se parece com ASCII. Não importa para você, você print(chr(i) for i in file)
e decifra a mensagem. Seu primeiro pensamento: "Eu preciso compartilhar isso com a comunidade!".
...
Quem teria pensado isso? Que as primeiras pessoas a fazer contato com alienígenas seriam os humildes programadores do PPCG. Por que nós? Talvez seja porque somos o epítome da inteligência humana. Ou talvez porque o BrainFuck seja tão próximo quanto o de uma língua estrangeira. No entanto, os alienígenas - sendo as formas de vida ultra-inteligentes que são - querem testar se devem classificar a raça humana como inteligente ou não. Como teste de nossas proezas mentais, os alienígenas nos pediram para enviar-lhes alguns programas de computador para demonstrar que somos tecnologicamente cultivados. A questão é que a única linguagem humana que eles entendem é ASCII numérica!
Ajude a humanidade a mostrar às criaturas quem é o verdadeiro alfa intelectual. Precisamos enviar a eles um script que converta nossos códigos-fonte baseados em texto em suas versões numéricas ASCII. Infelizmente, devido à nossa tecnologia subdesenvolvida (obrigado Obama), devemos enviar o menor programa de tradução possível. Ainda bem que eles escolheram entrar em contato com a PPCG!
O desafio:
A premissa deste desafio é simples: você deve escrever um programa que utilize o código-fonte de qualquer programa (ou qualquer arquivo de texto geral) e produza uma versão separada por espaço com uma tradução ASCII abaixo de cada linha. Ou seja, dada a entrada de um arquivo de texto, você precisa gerar cada linha desse arquivo seguida por uma linha que contenha a representação ASCII de cada caractere na linha acima (com cada número alinhado com o caractere que representa).
Um exemplo vai esclarecer muito isso. Tomando o código fonte do infame hello world
como a entrada:
#include <stdio.h>
int main() {
printf("hello, world\n");
return 0;
}
seu programa deve gerar:
# i n c l u d e < s t d i o . h >
35 105 110 99 108 117 100 101 32 60 115 116 100 105 111 46 104 62 10
10
i n t m a i n ( ) {
105 110 116 32 109 97 105 110 40 41 32 123 10
p r i n t f ( " h e l l o , w o r l d \ n " ) ;
32 32 32 32 112 114 105 110 116 102 40 34 104 101 108 108 111 44 32 119 111 114 108 100 92 110 34 41 59 10
r e t u r n 0 ;
32 32 32 32 114 101 116 117 114 110 32 48 59 10
}
125 10
Detalhes da implementação:
Você pode optar por receber a entrada da forma que desejar (arquivo de abertura, canal de linha de comando, parâmetro de função etc.) e deve enviar para stdout ou retornar a saída de uma função.
Coisas a observar
- Cada caractere na saída é separado por um '\ t' para permitir o espaço de 3 dígitos na linha abaixo para alinhar (vamos assumir que sua guia está configurada para 4 espaços ou mais).
- As novas linhas são exibidas na linha em que a tecla de retorno foi pressionada (observe os 10's no exemplo)
- Os requisitos de impressão '\ t' e '\ n' são pouco flexíveis. Sua produção deve, no sentido geral, parecer agradável aos olhos (é preciso mostrar aos alienígenas que também temos senso estético) e, se você puder dobrar os dois pontos anteriores, mantendo a integridade visual, será perdoado.
- Você pode optar por assumir se há ou não uma nova linha no final da última linha.
Pontuação
Este é o código-golfe, e o programa mais curto vence. Observe que, mesmo que seu programa não seja o mais curto, mas use truques realmente legais em relação ao idioma que você está usando, muitos +1 para você!
Boa sorte. O ranking de inteligência intergaláctica da humanidade repousa sobre seus ombros.
Nota: perdoe os orifícios da plotagem. Eu não sou um escritor : D
Respostas:
Dyalog APL , 14 bytes
Leva a lista de seqüências de caracteres que incluem sequências de nova linha (10 ou 13 10 etc.)
↑
matricular a lista de listas que consiste em(
...)¨
para cada linha retornada ...⊢
o próprio texto,[.5]
seguida em uma nova dimensão antes da primeira dimensão por⎕UCS
os U nicode C haracter S et pontos de códigoTryAPL online!
fonte
f
chamado diretamente na entrada. Para chamar uma função uma vez por linha, se tivesse ditof¨
.Pitão,
1713 bytesOutro daqueles programadores Pyth. Desculpe.
O novo código exige que cada linha seja colocada entre aspas e escape (incluindo novas linhas, se você desejar que elas sejam impressas), mas coloca uma nova linha extra entre a linha e o ASCII.
Experimente online!
Explicação:
Estou mantendo o código antigo e sua explicação abaixo.
Experimente online! ou use um caso de teste mais fácil de ler .
Explicação:
fonte
Python 2, 105 bytes
Isso usa uma abordagem ligeiramente diferente da resposta do OP. Observe que o SO bagunça minhas guias literais com espaços.
Experimente online
fonte
x+=ord(c)+" "
seria mais curto do que"%s "%ord(c)
?x+=`ord(c)`+" "
tem o mesmo comprimento.Teclas Vim,
86,77Isso é muito longo, mas é o que você obtém quando usa o
eval
recurso do vim (\=
).fonte
\=
está explicando a função eval, ou um rosto triste porque você está usando o recurso eval ...D;
Perl,
> 3331 bytesInclui +3 para
-F
(não pode ser combinado com-e
e o código'
também possui , portanto, espaço e também-
são contados).Execute com a entrada STDIN ou dê um ou mais nomes de arquivos como argumento
asciidump.pl
A saída não é estética se o texto contiver uma guia ou se não houver uma nova linha final
fonte
Pitão, 21 bytes
Aqui está uma entrada de um desses "malditos programadores Pyth" ;)
Um programa que recebe a entrada de uma cadeia de linhas multilinha não citada no STDIN e imprime o resultado. Isso pressupõe que todas as entradas tenham uma nova linha à direita. Se você deseja que ela lide com nenhuma nova linha à direita, adicione
<
no início do programa e)_3
no final.Experimente online
É difícil ver a saída do caso de teste no intérprete on-line, então incluí-o aqui:
Como funciona
fonte
.z
e tendo entrada lista de linhas comoC,
136117114 byteschar l[99];i;f(f){while(fgets(l,256,f)){i=0;while(l[i])printf("%c\t",l[i++]);i=0;puts("");while(l[i])printf("%d\t",l[i++]);puts("");}}
Pode ser testado assim
fonte
char**v
dentro domain()
que você salvaria 2 caracteres lá ..PowerShell v2 +, 85 bytes
A entrada é via um caminho para um arquivo. Nós
Get-Content
(aliasgc
) nesse arquivo, que se divide automaticamente em novas linhas. Nós passamos por cima de cada um deles|%{...}
. Comece definindo$a
e$b
para uma sequência vazia - esses são nossos caracteres ASCII e pontos de código, respectivamente. Em seguida, colocamos-split
a linha de entrada em cada caractere, mantendo-o(.)
e removendo os valores vazios-ne''
(é devido à maneira como o regex do .NET analisa) e depois os enviamos para outro loop.A cada loop interno, concatenamos o caractere atual com uma guia
`t
e adicionamos isso a$a
. Da mesma forma$b
, exceto que estamos explicitamente lançando como achar
e depois como int+
.Fora do loop interno, colocamos o resultado
$a
e$b
(com um designador de avanço de linha, pois isso nunca será exibido em nosso loop) no pipeline. Esses são reunidos com um implícitoWrite-Output
na conclusão do programa.Exemplo
(com o entendimento de que tenho um avanço de linha à direita e Markdown manipula o caractere de tabulação)
fonte
> <> (Peixe), 48 bytes
Uma tarefa na qual a linguagem brilha! Tenho certeza de que provavelmente poderia ter jogado um pouco mais, mas já faz uma semana. Pode dar uma olhada mais tarde.
Experimente online!
Experimente alternativamente on-line que pareça melhor na minha opinião, mas o empacotamento de texto atrapalha um pouco a entrada com linhas longas como o caso de teste.
fonte
PHP,
131115 bytesApenas um FGITW, talvez eu possa melhorar ainda mais. Acontece que eu posso!
Primeira versão em 131 bytes:
O nome do arquivo é fornecido como o primeiro argumento após o nome do script:
php aliens.php helloworld.c
Segunda versão em 115 bytes:
A primeira versão é responsável por novas linhas ausentes no final da linha, mas após esclarecimentos adicionais, podemos deixar esse código de fora e colocar tudo em uma função para economizar 16 bytes.
Os caracteres de espaço em branco
join(' ',$a)
e emecho$c.' '
são caracteres de tabulação =\t
. As novas linhas no código são de propósito.fonte
Python 3,
8977 bytesversão mais golfe com base na mesma idéia:
Se houver \ \ t na entrada, altere
4
para a9
.Versão anterior:
Leva uma lista de seqüências de caracteres, cada uma terminada com '\ n'.
fonte
for l in s
iefor l in s:print(*l,sep='\t',end='');print(*l.encode(),sep='\t',end='\n\n')
lambda s:'\n\n'.join(*map('{:>4}'.format,[*a,*a.encode()])for a in s)
Powershell, 56 bytes
O script aceita um caminho de arquivo como entrada. O Get-Content divide automaticamente a entrada em uma matriz de seqüências de caracteres divididas em novas linhas na fonte.
A partir daí, entrei em um foreach, converti-o em uma matriz de caracteres e defini-o como $ a, uno-o às guias e imprimo-o. Em seguida, mas ainda dentro do foreach, lancei a matriz de caracteres para uma matriz inteira, acrescente um avanço de linha e ingresso novamente em uma guia.
A chamada fica assim:
e aqui está uma amostra de saída
fonte
JavaScript (ES6), 94 bytes
Onde ␉ representa o caractere de tabulação literal. Funciona desde que a entrada não contenha caracteres de tabulação. Versão de 81 bytes que também requer que a entrada tenha uma nova linha à direita:
fonte
.split().map()
pode conquistar.replace()
. Uma vez caracteres de escape otimizado com acentos graves, esta deve ser 85 bytes:s=>s.split('\n').map(c=>(s=[...c]).join('\t')+'\n'+s.map(c=>c.charCodeAt()).join('\t')).join('\n')
(Desculpe, eu não tenho nenhuma idéia se / como acentos graves podem ser incluídos em um comentário.)C #,
6463 bytes-1 byte usando o caractere de tabulação real em vez de
\t
. Nota: é processado como 4 espaços acima e 2 espaços na versão não destruída abaixo.Ungolfed:
Resultados:
(Nota: O Visual Studio usou
\r\n
as novas linhas quando colei a entrada, portanto, as13 10
terminações de linha na saída)fonte
CJam, 27 bytes
Experimente online!
Explicação
fonte
1/
e os
são desnecessários.PowerShell,
6159 bytesCoisas a serem observadas:
m
no diretório atual.$_
) são apenas feeds de linha literais (0xA), portanto, um byte cada.-join
operadores é um caractere de tabulação único (independentemente de como é renderizado aqui).Ungolfed
fonte
Java, 202 bytes
Eu não posso nem me incomodar em fazer isso mais curto ..
fonte
Haskell - 71 bytes
fonte
Python 3,
92 97107 bytespara i na lista (abrir (entrada ()). ler (). dividir ("\ n")): para j em i: imprimir (i + "\ n" + ord (j))Isso não foi testado, mas deve funcionar.
Obrigado @gowrath por apontar que o código não está funcionando como a pergunta especifica.
fonte
input()
comando está fazendo lá é obter o nome do arquivo para abrir.