Ustawiać scenę:
Jest przeciętne popołudnie, kiedy odpoczywasz po długim dniu, angażując się w ulubioną rozrywkę: odpowiadając na mnóstwo wciągających pytań na temat PPCG. To nie był dobry dzień dla ciebie; ci przeklęci programiści Pyth wciąż otrzymują najlepszą odpowiedź i to zabija twój klimat. Nagle zauważasz nowe pytanie! Podejmujesz decyzję; nie tym razem CJammers. Wściekle zaczynasz pisać, rodząc strumień postaci; płód chwalebnej pętli BrainFuck, którą będzie twój produkt końcowy. Pisz i pisz. Szybciej! Jeszcze szybciej! Jesteś tak skupiony, że nawet nie zauważysz, że światła na ekranie zaczynają migać. Nagle monitor świeci na zielono, symbol podobny do obcego, oznaczony na pulpicie. Wykorzystując swoje nieskazitelne umiejętnościcat ~/Desktop/aliensymbol
i otrzymaj mnóstwo liczb, wiadomość! Będąc sprytnym programistą PPCG, jakim jesteś, zauważysz, że wygląda jak ASCII. Bez względu na ciebie, ty print(chr(i) for i in file)
i rozszyfrujesz wiadomość. Twoja pierwsza myśl: „Muszę się tym podzielić ze społecznością!”.
...
Kto by to pomyślał? Że pierwszymi ludźmi, którzy nawiążą kontakt z kosmitami, będą skromni programiści PPCG. Dlaczego my? Może dlatego, że jesteśmy uosobieniem ludzkiej inteligencji. A może dlatego, że BrainFuck jest tak blisko, jak my, do obcego języka. Niemniej jednak obcy - będąc ultra-inteligentnymi formami życia, którymi są - chcą sprawdzić, czy powinni sklasyfikować rasę ludzką jako inteligentną, czy nie. W celu sprawdzenia naszej sprawności umysłowej, kosmici poprosili nas o przesłanie im kilku programów komputerowych, aby pokazać, że jesteśmy kulturowo technologiczni. Problem polega na tym, że jedynym ludzkim językiem, który rozumieją, jest numeryczna ASCII!
Pomóż ludzkości pokazać tym stworzeniom, kim jest prawdziwa intelektualna alfa. Musimy wysłać im skrypt, który skonwertuje nasze tekstowe kody źródłowe na ich numeryczne wersje ASCII. Niestety, z powodu naszej słabo rozwiniętej technologii (dzięki Obama), musimy wysłać tak mały program tłumaczeniowy, jak to możliwe. Dobrze, że zdecydowali się skontaktować z PPCG!
Wyzwanie:
Założenie tego wyzwania jest proste: masz napisać program, który weźmie kod źródłowy dowolnego programu (lub dowolny ogólny plik tekstowy na ten temat), i wypisze jego oddzieloną spacjami wersję z tłumaczeniem ASCII poniżej każdego wiersza. To znaczy, biorąc pod uwagę wejście pliku tekstowego, musisz wypisać każdy wiersz tego pliku, a następnie wiersz zawierający reprezentację ASCII każdego znaku w wierszu nad nim (z każdą liczbą wyrównaną do znaku, który reprezentuje).
Przykład bardzo to wyjaśni. Biorąc kod źródłowy niesławnego hello world
jako dane wejściowe:
#include <stdio.h>
int main() {
printf("hello, world\n");
return 0;
}
twój program powinien wypisać:
# 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
Szczegóły dotyczące wdrożenia:
Możesz wybrać wejście w dowolnej formie (otwarcie pliku, potok wiersza poleceń, parametr funkcji itp.) I powinieneś wyjść na standardowe wyjście lub zwrócić wyjście z funkcji.
Warto zwrócić uwagę
- Każdy znak na wyjściu jest oddzielony znakiem „\ t”, aby pozwolić na umieszczenie 3 cyfr w wierszu poniżej na wyrównanie (zakładamy, że twoja tabulacja jest ustawiona na 4 spacje lub więcej).
- Nowe linie są wyświetlane w wierszu, w którym naciśnięto klawisz powrotu (zwróć uwagę na 10 w przykładzie)
- Wymagania dotyczące drukowania „\ t” i „\ n” są luźne. Twój dorobek musi, w ogólnym sensie, wyglądać przyjemnie dla oka (musisz pokazać tym kosmitom, którzy również mamy zmysł estetyczny), a jeśli możesz zgiąć dwa poprzednie punkty przy zachowaniu integralności wizualnej, otrzymasz wybaczenie.
- Możesz założyć, czy na końcu ostatniego wiersza znajduje się nowy wiersz.
Punktacja
To jest golf golfowy, więc wygrywa najkrótszy program. Uwaga, nawet jeśli twój program nie jest najkrótszy, ale używa naprawdę schludnych sztuczek w stosunku do używanego języka, wiele +1 dla Ciebie!
Powodzenia. Międzygalaktyczny ranking inteligencji ludzkości spoczywa na twoich barkach.
Uwaga: wybacz dziury w fabule. Nie jestem pisarzem : D
Odpowiedzi:
Dyalog APL , 14 bajtów
Pobiera listę ciągów zawierających sekwencje nowego wiersza (10 lub 13 10 itd.)
↑
zmaterializuj listę składającą się z(
...)¨
dla każdego powrotu linii ...⊢
sam tekst,[.5]
następuje w nowym wymiarze przed pierwszym wymiarem przez⎕UCS
z U nicode C haracter S et punkty kodoweWypróbuj APL online!
źródło
f
jest wywoływany bezpośrednio na wejściu. Aby wywołać funkcję raz na linię, gdyby tak powiedziałf¨
.Pyth
1713 bajtówKolejny z tych programistów Pyth. Przepraszam.
Nowy kod wymaga, aby każdy wiersz był zawinięty w cudzysłowy i poprzedzony znakiem specjalnym (w tym znaki nowego wiersza, jeśli chcesz, aby były drukowane), ale wstawia nowy znak między wierszem a kodem ASCII.
Wypróbuj online!
Wyjaśnienie:
Trzymam stary kod i jego wyjaśnienie poniżej.
Wypróbuj online! lub użyj łatwiejszego do odczytania przypadku testowego .
Wyjaśnienie:
źródło
Python 2, 105 bajtów
Wykorzystuje to nieco inne podejście niż odpowiedź PO. Zauważ, że SO rozmywa moje dosłowne tabulatory spacjami.
Wypróbuj online
źródło
x+=ord(c)+" "
byłby krótszy niż"%s "%ord(c)
?x+=`ord(c)`+" "
jest tej samej długości.Vim,
86,77 klawiszyJest to zdecydowanie za długo, ale to właśnie dostajesz, gdy używasz
eval
funkcji vima (\=
).źródło
\=
wyjaśniasz funkcję ewaluacji, czy smutną twarz, ponieważ korzystasz z funkcjiD;
Perl,
> 3331 bajtówObejmuje +3 dla
-F
(nie można łączyć z,-e
a kod'
też, więc spacja i-
są również liczone).Uruchom z wejściem na STDIN lub podaj jeden lub więcej nazw plików jako argument
asciidump.pl
Wynik nie jest estetyczny, jeśli tekst zawiera tabulator lub nie ma końcowej nowej linii
źródło
Pyth, 21 bajtów
Oto wpis z jednego z „tych przeklętych programistów Pyth” ;)
Program, który pobiera niecytowany ciąg wielowierszowy na STDIN i drukuje wynik. Zakłada się, że wszystkie dane wejściowe mają końcowy znak nowej linii. Jeśli chcesz, aby nie zajmował się końcowym znakiem nowej linii, dodaj
<
na początku programu i)_3
na końcu.Wypróbuj online
Dane wyjściowe dla przypadku testowego są trudne do odczytania w tłumaczu online, więc zamieściłem go tutaj:
Jak to działa
źródło
.z
i przyjmując dane jako listę liniiC,
136117114 bajtówchar 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("");}}
Można przetestować w ten sposób
źródło
char**v
środkumain()
uratowałoby cię tam 2 postacie ...PowerShell v2 +, 85 bajtów
Dane wejściowe są poprzez ścieżkę do pliku. Następnie
Get-Content
(aliasgc
) tego pliku, który automatycznie dzieli się na nowe linie. Przewijamy każdy z nich|%{...}
. Zacznij od ustawienia$a
i$b
od pustego ciągu - są to odpowiednio nasze znaki ASCII i punkty kodowe. Następnie-split
wprowadzamy wiersz wprowadzania każdego znaku, zachowując go(.)
i usuwając puste wartości-ne''
(wynika to ze sposobu analizowania wyrażenia regularnego .NET), a następnie wysyłamy je do innej pętli.W każdej pętli wewnętrznej łączymy bieżący znak z tabulatorem
`t
i dodajemy go do$a
. Podobnie$b
, z wyjątkiem tego, że jawnie przesyłamy jako a,char
a następnie jako int+
.Poza wewnętrzną pętlą umieszczamy wynikowy
$a
i$b
(z desygnatora nowego wiersza, ponieważ nigdy nie pojawią się w naszej pętli) na rurociągu. Są one gromadzone w sposób dorozumianyWrite-Output
po zakończeniu programu.Przykład
(ze zrozumieniem, że mam tylny kanał i Markdown zmienia znak tabulatora)
źródło
> <> (Ryby), 48 bajtów
Zadanie, na które lśni język! Jestem pewien, że mógłbym trochę zagrać w golfa, ale to był długi tydzień. Może jednak przyjrzeć się temu później.
Wypróbuj online!
Alternatywnie wypróbuj online, który moim zdaniem wygląda ładniej, ale zawijanie tekstu trochę popsuwa w przypadku długich linii, takich jak przypadek testowy.
źródło
PHP,
131115 bajtówTylko FGITW, może mógłbym to poprawić. Okazuje się, że mogę!
Pierwsza wersja przy 131 bajtach:
Nazwa pliku jest dostarczana jako pierwszy argument po nazwie skryptu:
php aliens.php helloworld.c
Druga wersja o wielkości 115 bajtów:
Pierwsza wersja uwzględnia brakujące znaki nowego wiersza na końcu wiersza, ale po dodatkowym wyjaśnieniu możemy pominąć ten kod i umieścić wszystko w funkcji, aby zaoszczędzić 16 bajtów.
Znaki białych znaków w
join(' ',$a)
oraz wecho$c.' '
są znakami tabulacji =\t
. Nowe wiersze w kodzie są celowe.źródło
Python 3,
8977 bajtówbardziej golfowa wersja oparta na tym samym pomyśle:
Jeśli na wejściu znajdują się „\ t”, zmień na
4
a9
.Poprzednia wersja:
Pobiera listę ciągów znaków, z których każda kończy się na „\ n”.
źródło
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 bajtów
Skrypt akceptuje ścieżkę pliku jako dane wejściowe. Get-Content automatycznie dzieli dane wejściowe na tablicę ciągów znaków podzielonych na nowe wiersze w źródle.
Stamtąd wchodzę do foreach, rzucam na tablicę znaków i ustawiam na $ a, łączę z kartami i drukuję. Następnie, ale wciąż w obrębie foreach, rzuciłem tablicę znaków na tablicę liczb całkowitych, dołączam znak wiersza i ponownie łączę za pomocą tabulatora.
Połączenie wygląda następująco:
a oto próbka wyjściowa
źródło
JavaScript (ES6), 94 bajty
Gdzie ␉ oznacza dosłowny znak tabulacji. Działa, dopóki dane wejściowe nie zawierają znaków tabulacji. Wersja 81-bajtowa, która również wymaga, aby dane wejściowe miały znak nowej linii:
źródło
.split().map()
może wygrać.replace()
. Po uniknięciu znaków zoptymalizowanych pod kątem backticks, powinno to być 85 bajtów:s=>s.split('\n').map(c=>(s=[...c]).join('\t')+'\n'+s.map(c=>c.charCodeAt()).join('\t')).join('\n')
(Przepraszam, nie mam pojęcia, czy / jak backticks mogą być zawarte w komentarzu.)C #,
6463 bajtów-1 bajt przy użyciu rzeczywistego znaku tabulacji zamiast
\t
. Uwaga: renderuje jako 4 spacje powyżej i 2 spacje w wersji bez golfa poniżej.Nie golfowany:
Wyniki:
(Uwaga: Visual Studio używał
\r\n
nowych linii, kiedy wkleiłem dane wejściowe, stąd13 10
zakończenia linii w danych wyjściowych)źródło
CJam, 27 bajtów
Wypróbuj online!
Wyjaśnienie
źródło
1/
Is
są niepotrzebne.PowerShell,
6159 bajtówWażne uwagi:
m
w bieżącym katalogu.$_
) są dosłowne dosuwu wiersza (0xA), więc każdy bajt.-join
operatorach jest pojedynczym znakiem tabulacji (niezależnie od tego, jak jest tutaj renderowana).Nie golfił
źródło
Java, 202 bajty
Nie mogę nawet niepokoić się tym, że jest to krótsze ...
źródło
Haskell - 71 bajtów
źródło
Python 3,
92 97107 bajtówdla i na liście (open (input ()). read (). split ("\ n")): dla j in i: print (i + "\ n" + ord (j))Jest to niesprawdzone, ale powinno działać.
Dzięki @gowrath za wskazanie, że kod nie działa zgodnie z pytaniem.
źródło
input()
robi polecenie, to uzyskanie nazwy pliku do otwarcia.