Mise en scène:
C'est un après-midi moyen, alors que vous vous détendez après une longue journée en vous adonnant à votre passe-temps favori: répondre à la pléthore de questions captivantes sur PPCG. Ce n’a pas été une bonne journée pour vous; ces maudits programmeurs Pyth continuent d'obtenir la meilleure réponse et cela tue votre ambiance. Soudain, vous remarquez qu'une nouvelle question a été publiée! Vous décidez; pas cette fois CJammers. Furieusement, vous commencez à taper, donnant naissance à un flot de personnages; un fœtus de la magnifique boucle BrainFuck que sera votre produit final. Vous tapez et tapez. Plus rapide! Toujours plus vite! Vous êtes tellement concentré que vous ne remarquez même pas que les lumières sur votre écran commencent à clignoter. Soudain, le moniteur devient vert, un symbole semblable à un extraterrestre marqué sur le bureau. En utilisant vos compétences impeccables, vouscat ~/Desktop/aliensymbol
et recevez un tas de chiffres, un message! Étant le programmeur PPCG astucieux que vous êtes, vous remarquez qu'il ressemble à ASCII. Peu importe pour vous, vous print(chr(i) for i in file)
et déchiffrez le message. Votre première pensée: "J'ai besoin de partager cela avec la communauté!".
...
Qui l'aurait pensé? Que les premières personnes à entrer en contact avec des extraterrestres seraient les humbles programmeurs de PPCG. Pourquoi nous? C'est peut-être parce que nous sommes l'incarnation de l'intelligence humaine. Ou peut-être parce que BrainFuck est aussi proche que possible d'une langue étrangère. Néanmoins, les extraterrestres - étant les formes de vie ultra-intelligentes qu'ils sont - veulent tester s'ils doivent classer la race humaine comme intelligente ou non. Pour tester nos prouesses mentales, les extraterrestres nous ont demandé de leur envoyer quelques programmes informatiques pour démontrer que nous sommes cultivés sur le plan technologique. Le problème est que le seul langage humain qu'ils comprennent est l'ASCII numérique!
Aidez l'humanité à montrer à ces créatures qui est le véritable alpha intellectuel. Nous devons leur envoyer un script qui convertira nos codes sources basés sur du texte en leurs versions ASCII numériques. Malheureusement, en raison de notre technologie sous-développée (merci Obama), nous devons envoyer un programme de traduction aussi petit que possible. Heureusement qu'ils ont choisi de contacter PPCG!
Le défi:
La prémisse de ce défi est simple: vous devez écrire un programme qui prendra le code source de tout programme (ou tout fichier texte général d'ailleurs), et en sortir une version séparée par des espaces avec une traduction ASCII sous chaque ligne. C'est-à-dire, étant donné l'entrée d'un fichier texte, vous devez sortir chaque ligne de ce fichier suivie d'une ligne contenant la représentation ASCII de chaque caractère dans la ligne au-dessus (chaque numéro étant aligné avec le caractère qu'il représente).
Un exemple clarifiera grandement cela. Prendre le code source de l'infâme hello world
comme entrée:
#include <stdio.h>
int main() {
printf("hello, world\n");
return 0;
}
votre programme devrait produire:
# 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
Détails d'implémentation:
Vous pouvez choisir de prendre l'entrée sous la forme que vous souhaitez (fichier d'ouverture, ligne de commande, paramètre de fonction, etc.) et vous devez sortir sur stdout ou renvoyer la sortie d'une fonction.
À noter
- Chaque caractère dans la sortie est séparé par un '\ t' pour permettre l'espace de 3 chiffres dans la ligne ci-dessous pour s'aligner (nous allons supposer que votre tabulation est définie sur 4 espaces ou plus).
- Les nouvelles lignes s'affichent sur la ligne sur laquelle la touche retour a été enfoncée (remarquez les 10 dans l'exemple)
- Les exigences d'impression «\ t» et «\ n» sont laxistes. Votre sortie doit, dans le sens général, avoir l'air agréable à l'œil (nous devons également montrer aux extraterrestres que nous avons un sens esthétique), et si vous pouvez plier les deux points précédents tout en maintenant l'intégrité visuelle, vous serez pardonné.
- Vous pouvez choisir de supposer s'il existe ou non une nouvelle ligne à la fin de la dernière ligne.
Notation
C'est le golf de code, donc le programme le plus court gagne. Notez que même si votre programme n'est pas le plus court, mais utilise des astuces vraiment soignées par rapport à la langue que vous utilisez, beaucoup de +1 pour vous!
Bonne chance. Le classement de l'intelligence intergalactique de l'humanité repose sur vos épaules.
Remarque: veuillez pardonner les trous de l'intrigue. Je ne suis pas écrivain : D
Réponses:
Dyalog APL , 14 octets
Prend la liste des chaînes qui incluent des séquences de nouvelle ligne (10 ou 13 10 etc.)
↑
matrifier la liste des listes(
...)¨
pour chaque retour de ligne ...⊢
le texte lui-même,[.5]
suivi d'une nouvelle dimension avant la première dimension par⎕UCS
les U nicode C haracter S ET points de codeTryAPL en ligne!
la source
f
est appelé directement sur l'entrée. Pour appeler une fonction une fois par ligne, aurait ditf¨
.Pyth,
1713 octetsUn autre de ces programmeurs Pyth. Désolé.
Le nouveau code nécessite que chaque ligne soit entourée de guillemets et d'échappement (y compris les sauts de ligne si vous souhaitez qu'ils soient imprimés), mais met une nouvelle ligne supplémentaire entre la ligne et l'ASCII.
Essayez-le en ligne!
Explication:
Je garde l'ancien code et ses explications ci-dessous.
Essayez-le en ligne! ou utilisez un scénario de test plus facile à lire .
Explication:
la source
Python 2, 105 octets
Cela utilise une approche légèrement différente de la réponse du PO. Notez que SO gâche mes onglets littéraux avec des espaces.
Essayez-le en ligne
la source
x+=ord(c)+" "
plus court que"%s "%ord(c)
?x+=`ord(c)`+" "
est de la même longueur.Vim,
86,77 frappesC'est beaucoup trop long, mais c'est ce que vous obtenez lorsque vous utilisez la
eval
fonction de vim (\=
).la source
\=
expliquez la fonction d'évaluation, ou un visage triste parce que vous utilisez la fonction d'D;
Perl,
> 3331 octetsComprend +3 pour
-F
(ne peut pas être combiné avec-e
et le code'
aussi, donc l'espace et-
sont également comptés).Exécuter avec l'entrée sur STDIN ou donner un ou plusieurs noms de fichiers comme argument
asciidump.pl
La sortie n'est pas esthétique si le texte contient un onglet ou s'il n'y a pas de nouvelle ligne finale
la source
Pyth, 21 octets
Voici une entrée d'un de "ces maudits programmeurs Pyth" ;)
Un programme qui prend l'entrée d'une chaîne multiligne non cotée sur STDIN et imprime le résultat. Cela suppose que toutes les entrées ont une nouvelle ligne de fin. Si vous voulez qu'il ne traite pas de saut de ligne, ajoutez
<
au début du programme et)_3
à la fin.Essayez-le en ligne
La sortie pour le cas de test est difficile à voir dans l'interpréteur en ligne, donc je l'ai inclus ici:
Comment ça marche
la source
.z
et en prenant l'entrée comme liste de lignesC,
136117114 Octetschar 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("");}}
Peut être testé comme ça
la source
char**v
à l'intérieur le vousmain()
ferait économiser 2 personnages là-bas.PowerShell v2 +, 85 octets
L'entrée se fait via un chemin vers un fichier. Nous avons ensuite
Get-Content
(aliasgc
) sur ce fichier, qui se divise automatiquement sur les nouvelles lignes. Nous passons en revue chacun d'eux|%{...}
. Commencez par définir$a
et$b
une chaîne vide - ce sont nos caractères ASCII et points de code respectivement. Nous avons ensuite-split
la ligne d'entrée sur chaque caractère, en la conservant(.)
et en supprimant les valeurs vides-ne''
(c'est dû à la façon dont .ge regex analyse), puis les envoyons dans une autre boucle.À chaque boucle interne, nous enchaînons le caractère courant avec un onglet
`t
et nous ajoutons cela$a
. De même pour$b
, sauf que nous transcrivons explicitement en tant quechar
puis en entier+
.En dehors de la boucle interne, nous plaçons le résultat
$a
et$b
(avec un identificateur de saut de ligne, car cela n'apparaîtra jamais dans notre boucle) sur le pipeline. Ceux-ci sont rassemblés avec un impliciteWrite-Output
à la fin du programme.Exemple
(étant entendu que j'ai un saut de ligne de fin et que Markdown modifie le caractère de tabulation)
la source
> <> (Poisson), 48 octets
Une tâche sur laquelle la langue brille! Je suis sûr que j'aurais probablement pu jouer un peu plus, mais la semaine a été longue. Je pourrais y jeter un œil plus tard.
Essayez-le en ligne!
Alternativement, essayez-le en ligne qui semble plus agréable à mon avis, mais l'habillage du texte gâche un peu la saisie avec de longues lignes comme le cas de test.
la source
PHP,
131115 octetsJuste un FGITW, je peux peut-être l'améliorer davantage. Il s'avère que je peux!
Première version à 131 octets:
Le nom de fichier est fourni comme premier argument après le nom du script:
php aliens.php helloworld.c
Deuxième version à 115 octets:
La première version explique les sauts de ligne manquants à la fin de la ligne, mais après la clarification supplémentaire, nous pouvons laisser ce code et mettre tout dans une fonction pour économiser 16 octets.
Les caractères d'espacement dans
join(' ',$a)
ainsi que dansecho$c.' '
sont des caractères de tabulation =\t
. Les retours à la ligne du code sont intentionnels.la source
Python 3,
8977 octetsversion plus golfée basée sur la même idée:
S'il y a des '\ t' dans l'entrée, changez le
4
en a9
.Version antérieure:
Prend une liste de chaînes, chacune se terminant par un «\ n».
la source
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 octets
Le script accepte un chemin de fichier en entrée. Get-Content divise automatiquement l'entrée en un tableau de chaînes réparties sur les sauts de ligne dans la source.
À partir de là, j'entre un foreach, je transforme en un tableau de caractères et je le place sur $ a, je le joint avec des tabulations et je l'imprime. Ensuite, mais toujours dans le foreach, je transforme le tableau de caractères en un tableau entier, ajoute un saut de ligne et rejoins à nouveau avec un onglet.
L'appel ressemble à ceci:
et voici un échantillon de sortie
la source
JavaScript (ES6), 94 octets
Où ␉ représente le caractère de tabulation littéral. Fonctionne tant que l'entrée ne contient pas de caractères de tabulation. Version de 81 octets qui nécessite également que l'entrée ait une nouvelle ligne de fin:
la source
.split().map()
peut gagner.replace()
. Une fois les caractères échappés optimisés avec les backticks, cela devrait faire 85 octets:s=>s.split('\n').map(c=>(s=[...c]).join('\t')+'\n'+s.map(c=>c.charCodeAt()).join('\t')).join('\n')
(Désolé, je n'ai aucune idée si / comment les backticks peuvent être inclus dans un commentaire.)C #,
6463 octets-1 octet en utilisant le caractère de tabulation réel au lieu de
\t
. Remarque: s'affiche comme 4 espaces au-dessus et 2 espaces dans la version non golfée ci-dessous.Non golfé:
Résultats:
(Remarque: Visual Studio a utilisé
\r\n
les nouvelles lignes lorsque j'ai collé l'entrée, d'où les13 10
fins de ligne en sortie)la source
CJam, 27 octets
Essayez-le en ligne!
Explication
la source
1/
et les
sont inutiles.PowerShell,
6159 octetsA noter:
m
dans le répertoire courant.$_
) sont des sauts de ligne littéraux uniquement (0xA), donc un octet chacun.-join
opérateurs est chacun un caractère de tabulation unique (quelle que soit la façon dont il est rendu ici).Non golfé
la source
Java, 202 octets
Je ne peux même pas être gêné de raccourcir cela ..
la source
Haskell - 71 octets
la source
Python 3,
92 97107 octetspour i dans la liste (open (input ()). read (). split ("\ n")): pour j dans i: print (i + "\ n" + ord (j))Ceci n'est pas testé, mais devrait fonctionner.
Merci @gowrath d'avoir souligné que le code ne fonctionne pas comme le spécifie la question.
la source
input()
commande, c'est obtenir le nom du fichier à ouvrir.