Einstellen der Szene:
Es ist ein durchschnittlicher Nachmittag, an dem Sie nach einem langen Tag die Seele baumeln lassen, indem Sie sich auf Ihre Lieblingsbeschäftigung einlassen: die Beantwortung der Fülle faszinierender Fragen zu PPCG. Es war kein guter Tag für dich; Diese verdammten Pyth-Programmierer bekommen immer die beste Antwort, und es bringt deine Stimmung um. Plötzlich stellen Sie fest, dass eine neue Frage gestellt wurde! Sie entscheiden sich; diesmal nicht CJammers. Wütend fängt man an zu tippen und erzeugt einen Strom von Charakteren. ein Fötus der herrlichen BrainFuck-Schleife, die Ihr Endprodukt sein wird. Sie tippen und tippen. Schneller! Immer noch schneller! Sie sind so fokussiert, dass Sie nicht einmal bemerken, dass die Lichter auf Ihrem Bildschirm anfangen zu blinken. Plötzlich leuchtet der Monitor grün, ein fremdartiges Symbol auf dem Desktop. Verwenden Sie Ihre makellosen Fähigkeitencat ~/Desktop/aliensymbol
und erhalten Sie eine Reihe von Zahlen, eine Nachricht präsentiert! Als der kluge PPCG-Programmierer, der Sie sind, bemerken Sie, dass es wie ASCII aussieht. Egal für Sie, Sie print(chr(i) for i in file)
und entschlüsseln die Nachricht. Dein erster Gedanke: "Ich muss das mit der Community teilen!".
...
Wer hätte das gedacht? Dass die ersten Leute, die Kontakt mit Außerirdischen aufnehmen, die bescheidenen Programmierer von PPCG sind. Warum wir? Vielleicht liegt es daran, dass wir der Inbegriff menschlicher Intelligenz sind. Oder vielleicht, weil BrainFuck einer fremden Sprache so nahe kommt wie wir. Nichtsdestotrotz wollen die Außerirdischen - die ultraschlauen Lebensformen, die sie sind - testen, ob sie die menschliche Rasse als intelligent einstufen sollen oder nicht. Als Test für unser geistiges Können haben die Außerirdischen uns gebeten, ihnen ein paar Computerprogramme zu schicken, um zu demonstrieren, dass wir technologisch kultiviert sind. Das Problem ist, dass die einzige menschliche Sprache, die sie verstehen, numerisches ASCII ist!
Hilf der Menschheit, diesen Kreaturen zu zeigen, wer das wahre intellektuelle Alpha ist. Wir müssen ihnen ein Skript senden, das unsere textbasierten Quellcodes in ihre numerischen ASCII-Versionen konvertiert. Leider müssen wir aufgrund unserer unterentwickelten Technologie (danke Obama) ein so kleines Übersetzungsprogramm wie möglich schicken. Gut, dass sie sich entschieden haben, PPCG zu kontaktieren!
Die Herausforderung:
Die Prämisse dieser Herausforderung ist einfach: Sie müssen ein Programm schreiben, das den Quellcode eines beliebigen Programms (oder eine beliebige allgemeine Textdatei) verwendet und eine durch Leerzeichen getrennte Version davon mit einer ASCII-Übersetzung unter jeder Zeile ausgibt. Wenn Sie also eine Textdatei eingeben, müssen Sie jede Zeile dieser Datei ausgeben, gefolgt von einer Zeile, die die ASCII-Darstellung jedes Zeichens in der darüber liegenden Zeile enthält (wobei jede Zahl mit dem Zeichen übereinstimmt, das sie darstellt).
Ein Beispiel wird dies sehr verdeutlichen. Den Quellcode des Berüchtigten hello world
als Eingabe nehmen:
#include <stdio.h>
int main() {
printf("hello, world\n");
return 0;
}
Ihr Programm sollte folgendes ausgeben:
# 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
Implementierungsdetails:
Sie können die Eingabe in einer beliebigen Form vornehmen (Datei öffnen, Befehlszeilen-Pipe, Funktionsparameter usw.) und die Ausgabe auf stdout setzen oder die Ausgabe einer Funktion zurückgeben.
Dinge zu beachten
- Jedes Zeichen in der Ausgabe ist durch ein '\ t' getrennt, damit das dreistellige Leerzeichen in der unteren Zeile in einer Reihe steht (wir gehen davon aus, dass Ihr Tabulator auf 4 oder mehr Leerzeichen eingestellt ist).
- Die Zeilenumbrüche werden in der Zeile angezeigt, in der die Eingabetaste gedrückt wurde (beachten Sie die Zehner im Beispiel).
- Die Druckanforderungen '\ t' und '\ n' sind lax. Ihre Ausgabe muss im Allgemeinen gut aussehen (um zu zeigen, dass die Aliens, die wir haben, auch ästhetisch sind), und wenn Sie die vorherigen beiden Punkte biegen können, während die visuelle Integrität erhalten bleibt, wird Ihnen vergeben.
- Sie können festlegen, ob am Ende der letzten Zeile eine neue Zeile eingefügt werden soll.
Wertung
Dies ist Code-Golf, also gewinnt das kürzeste Programm. Beachten Sie, auch wenn Ihr Programm nicht das kürzeste ist, aber in Bezug auf die Sprache, die Sie verwenden, wirklich nette Tricks verwendet, viele +1 für Sie!
Viel Glück. Das intergalaktische Intelligenzranking der Menschheit ruht auf Ihren Schultern.
Hinweis: Bitte verzeihen Sie die Handlungslöcher. Ich bin kein Schriftsteller : D
Antworten:
Dyalog APL , 14 Bytes
Nimmt eine Liste von Strings auf, die Newline-Sequenzen enthalten (10 oder 13 10 usw.)
↑
matrify die Liste der Listen bestehend aus(
...)¨
für jeden Zeilenumbruch ...⊢
der Text selbst,[.5]
gefolgt in einer neuen Dimension vor der ersten Dimension von⎕UCS
der U nicode C haracter S et code pointsTryAPL online!
quelle
f
das direkt in der Eingabe aufgerufen wird. Eine Funktion einmal pro Zeile aufzurufen, wenn gesagt hättef¨
.Pyth,
1713 BytesEin weiterer dieser Pyth-Programmierer. Es tut uns leid.
Der neue Code setzt voraus, dass jede Zeile in Anführungszeichen gesetzt und mit einem Escapezeichen versehen wird (einschließlich Zeilenumbrüchen, wenn Sie möchten, dass sie gedruckt werden). Zwischen der Zeile und dem ASCII-Code wird jedoch ein zusätzlicher Zeilenumbruch eingefügt.
Probieren Sie es online!
Erläuterung:
Ich behalte den alten Code und dessen Erklärung weiter unten.
Probieren Sie es online! oder verwenden Sie einen besser lesbaren Testfall .
Erläuterung:
quelle
Python 2, 105 Bytes
Dies verwendet einen etwas anderen Ansatz als die Antwort des OP. Beachten Sie, dass SO meine wörtlichen Tabulatoren mit Leerzeichen durcheinander bringt.
Probieren Sie es online aus
quelle
x+=ord(c)+" "
kürzer als"%s "%ord(c)
?x+=`ord(c)`+" "
ist die gleiche Länge.Vim,
86,77 TastenanschlägeDies ist viel zu lang, aber genau das erhalten Sie, wenn Sie die
eval
Funktion (\=
) von vim verwenden .quelle
\=
das Bewertungsfeature erklären oder ein trauriges Gesicht, weil Sie dasD;
Perl,
> 3331 BytesBeinhaltet +3 für
-F
(kann nicht mit kombiniert werden-e
und der Code hat'
auch Platz und-
wird auch gezählt).Führen Sie mit der Eingabe auf STDIN aus oder geben Sie einen oder mehrere Dateinamen als Argument an
asciidump.pl
Die Ausgabe ist nicht ästhetisch, wenn der Text einen Tabulator enthält oder keine letzte neue Zeile vorhanden ist
quelle
Pyth, 21 Bytes
Hier ist ein Eintrag von einem dieser "verdammten Pyth-Programmierer" ;)
Ein Programm, das die Eingabe eines nicht in Anführungszeichen gesetzten mehrzeiligen Strings in STDIN akzeptiert und das Ergebnis ausgibt. Dies setzt voraus, dass alle Eingaben eine nachgestellte Newline haben. Wenn Sie möchten, dass es keine nachgestellten Zeilen enthält, fügen Sie diese
<
am Anfang und)_3
am Ende des Programms hinzu .Probieren Sie es online aus
Die Ausgabe für den Testfall ist im Online-Interpreter schwer zu sehen, daher habe ich sie hier eingefügt:
Wie es funktioniert
quelle
.z
C,
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("");}}
Kann so getestet werden
quelle
char**v
innerhalb dermain()
würden Sie 2 Zeichen dort speichern ..PowerShell v2 +, 85 Byte
Die Eingabe erfolgt über einen Pfad zu einer Datei. Wir dann
Get-Content
(aliasgc
) auf diese Datei, die automatisch auf Zeilenumbrüche aufgeteilt. Wir durchlaufen jeden von ihnen|%{...}
. Beginnen Sie mit dem Setzen von$a
und$b
zu einer leeren Zeichenfolge - dies sind unsere ASCII-Zeichen bzw. Codepunkte. Wir überprüfen dann-split
die Eingabezeile für jedes Zeichen, behalten sie(.)
bei und entfernen die leeren Werte-ne''
(dies liegt daran, wie .NET Regex analysiert) und senden diese dann in eine andere Schleife.In jeder inneren Schleife verketten wir das aktuelle Zeichen mit einem Tabulator
`t
und fügen diesen hinzu$a
. Ähnlich$b
verhält es sich mit der Ausnahme, dass wir explizit alschar
und dann als int casten+
.Außerhalb der inneren Schleife platzieren wir das resultierende
$a
und$b
(mit einem Zeilenvorschub-Bezeichner, da dies in unserer Schleife niemals auftritt) auf der Pipeline. Diese werdenWrite-Output
bei Programmabschluss implizit erfasst.Beispiel
(mit dem Verständnis, dass ich einen nachgestellten Zeilenumbruch habe und Markdown das Tabulatorzeichen entstellt)
quelle
> <> (Fisch), 48 Bytes
Eine Aufgabe, bei der die Sprache glänzt! Ich bin sicher, ich hätte wahrscheinlich ein bisschen mehr Golf spielen können, aber es war eine lange Woche. Könnte es aber später ansehen.
Probieren Sie es online!
Alternativ können Sie es auch online versuchen, was meiner Meinung nach besser aussieht, aber der Textumbruch ist bei Eingaben mit langen Zeilen etwas durcheinander, wie im Testfall.
quelle
PHP,
131115 BytesNur ein FGITW, vielleicht kann ich es besser machen. Es stellt sich heraus, ich kann!
Erste Version mit 131 Bytes:
Der Dateiname wird als erstes Argument nach dem Skriptnamen angegeben:
php aliens.php helloworld.c
Zweite Version mit 115 Bytes:
Die erste Version berücksichtigt fehlende Zeilenumbrüche am Ende der Zeile, aber nach der zusätzlichen Klärung können wir diesen Code weglassen und alles in eine Funktion einfügen, um 16 Bytes zu sparen.
Die Leerzeichen in
join(' ',$a)
und inecho$c.' '
sind Tabulatorzeichen =\t
. Die Zeilenumbrüche im Code sind absichtlich.quelle
Python 3,
8977 Bytesmehr Golf-Version auf der gleichen Idee basiert:
Wenn der Eingang '\ t' enthält, ändern Sie den Wert
4
in a9
.Vorherige Version:
Nimmt eine Liste von Zeichenfolgen auf, die jeweils mit einem '\ n' enden.
quelle
for l in s
alsofor 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
Skript akzeptiert einen Dateipfad als Eingabe. Get-Content teilt Eingaben automatisch in ein Array von Zeichenfolgen auf, die in Zeilenumbrüchen in der Quelle aufgeteilt sind.
Von dort aus gebe ich ein foreach ein, setze es in ein Array von Zeichen und setze es auf $ a, verbinde das mit Tabulatoren und drucke es aus. Als nächstes habe ich das Zeichen-Array in ein Integer-Array umgewandelt, einen Zeilenvorschub angehängt und mit einem Tabulator wieder verbunden.
Anruf sieht so aus:
und hier ist ein Ausgabebeispiel
quelle
JavaScript (ES6), 94 Byte
Wobei ␉ das buchstäbliche Tabulatorzeichen darstellt. Funktioniert, solange die Eingabe keine Tabulatorzeichen enthält. 81-Byte-Version, für die für die Eingabe auch ein Zeilenumbruch erforderlich ist:
quelle
.split().map()
kann gewinnen.replace()
. Sobald Escape - Zeichen mit Backticks optimieren, soll dieses 85 Bytes sein:s=>s.split('\n').map(c=>(s=[...c]).join('\t')+'\n'+s.map(c=>c.charCodeAt()).join('\t')).join('\n')
(Sorry, Ich habe keine Ahnung , ob / wie Backticks in einem Kommentar aufgenommen werden können.)C #,
6463 Bytes-1 Byte unter Verwendung des tatsächlichen Tabulatorzeichens anstelle von
\t
. Hinweis: Wird als 4 Leerzeichen oben und 2 Leerzeichen in der unbenutzten Version unten dargestellt.Ungolfed:
Ergebnisse:
(Hinweis: Visual Studio hat verwendet
\r\n
für die neuen Zeilen verwendet, als ich die Eingabe eingefügt habe, daher die13 10
Zeilenenden in der Ausgabe.)quelle
CJam, 27 Bytes
Probieren Sie es online!
Erläuterung
quelle
1/
und dass
sind unnötig.Power,
6159 BytesDinge zu beachten:
m
im aktuellen Verzeichnis benannt ist.$_
) sind nur Zeilenumbrüche (0xA), also jeweils ein Byte.-join
Operatoren ist jeweils ein einzelnes Tabulatorzeichen (unabhängig davon, wie es hier gerendert wird).Ungolfed
quelle
Java, 202 Bytes
Ich kann nicht einmal die Mühe machen, dies kürzer zu machen ..
quelle
Haskell - 71 Bytes
quelle
Python 3,
92 97107 Bytesfür i in der Liste (open (input ()). read (). split ("\ n")): für j in i: print (i + "\ n" + ord (j))Dies ist nicht getestet, sollte aber funktionieren.
Vielen Dank an @gowrath für den Hinweis, dass der Code nicht den in der Frage angegebenen Anforderungen entspricht.
quelle
input()
Befehl tut, ist, den Namen der zu öffnenden Datei abzurufen.