Jednym z najczęstszych standardowych zadań (szczególnie podczas prezentacji ezoterycznych języków programowania) jest wdrożenie „programu cat” : odczytanie całego STDIN i wydrukowanie go do STDOUT. Chociaż nazwa pochodzi od narzędzia powłoki Unix cat
, jest oczywiście znacznie mniej wydajna niż rzeczywista, która zwykle służy do drukowania (i łączenia) kilku plików odczytanych z dysku.
Zadanie
Powinieneś napisać pełny program, który odczytuje zawartość standardowego strumienia wejściowego i zapisuje je dosłownie do standardowego strumienia wyjściowego. Jeśli i tylko wtedy, gdy Twój język nie obsługuje standardowych strumieni wejściowych i / lub wyjściowych (jak rozumie się je w większości języków), możesz zamiast tego uznać te terminy za ich najbliższe odpowiedniki w twoim języku (np. JavaScript prompt
i alert
). Są to jedyne dopuszczalne formy We / Wy, ponieważ każdy inny interfejs w dużym stopniu zmieni charakter zadania i sprawi, że odpowiedzi będą znacznie mniej porównywalne.
Dane wyjściowe powinny zawierać dokładnie dane wejściowe i nic więcej . Jedynym wyjątkiem od tej reguły jest stałe wyjście interpretera twojego języka, którego nie można stłumić, takie jak powitanie, kody kolorów ANSI lub wcięcia. Dotyczy to również końcowych znaków nowej linii. Jeśli dane wejściowe nie zawierają końcowego nowego wiersza, dane wyjściowe również nie powinny zawierać jednego! (Jedynym wyjątkiem jest sytuacja, gdy Twój język absolutnie zawsze drukuje końcowy znak nowej linii po wykonaniu).
Dane wyjściowe do standardowego strumienia błędów są ignorowane, o ile standardowy strumień wyjściowy zawiera oczekiwane dane wyjściowe. W szczególności oznacza to, że Twój program może zakończyć się z błędem po uderzeniu w koniec strumienia (EOF), pod warunkiem, że nie zanieczyszcza standardowego strumienia wyjściowego. Jeśli to zrobisz, zachęcam do dodania wersji bezbłędnej do odpowiedzi (w celach informacyjnych).
Ponieważ jest to wyzwanie w ramach każdego języka, a nie między językami, istnieje kilka zasad specyficznych dla języka:
- Jeśli w twoim języku jest w ogóle możliwe rozróżnienie bajtów pustych w standardowym strumieniu wejściowym od EOF, twój program musi obsługiwać bajty zerowe, jak wszystkie inne bajty (to znaczy, że muszą być również zapisane w standardowym strumieniu wyjściowym).
- Jeśli w Twoim języku jest w ogóle możliwe obsługiwanie dowolnego, nieskończonego strumienia wejściowego (tj. Jeśli możesz rozpocząć drukowanie bajtów na wyjściu, zanim trafisz EOF na wejściu), twój program musi w tym przypadku działać poprawnie. Jako przykład
yes | tr -d \\n | ./my_cat
należy wydrukować nieskończony strumieńy
s. Od Ciebie zależy, jak często drukujesz i opróżniasz standardowy strumień wyjściowy, ale musisz zagwarantować, że stanie się to po upływie określonego czasu, niezależnie od strumienia (oznacza to w szczególności, że nie możesz czekać na określony znak, taki jak wysuw linii przed drukowaniem).
Dodaj notatkę do swojej odpowiedzi na temat dokładnego zachowania w odniesieniu do bajtów zerowych, nieskończonych strumieni i zewnętrznych danych wyjściowych.
Dodatkowe zasady
Nie chodzi o znalezienie języka z najkrótszym rozwiązaniem tego problemu (są takie, w których pusty program rozwiązuje problem) - chodzi o znalezienie najkrótszego rozwiązania w każdym języku. Dlatego żadna odpowiedź nie zostanie oznaczona jako zaakceptowana.
Zgłoszenia w większości języków będą oceniane w bajtach w odpowiednim wcześniej istniejącym kodowaniu, zwykle (ale niekoniecznie) UTF-8.
Niektóre języki, takie jak Foldery , są trudne do zdobycia. W razie wątpliwości proszę pytać na Meta .
Możesz swobodnie korzystać z języka (lub wersji językowej), nawet jeśli jest on nowszy niż to wyzwanie. Języki napisane specjalnie w celu przesłania 0-bajtowej odpowiedzi na to wyzwanie są uczciwą grą, ale nie są szczególnie interesujące.
Pamiętaj, że musi być tłumacz, aby można było przetestować zgłoszenie. Dozwolone jest (a nawet zachęcane) samodzielne pisanie tego tłumacza dla wcześniej niewdrożonego języka.
Należy również pamiętać, że języki nie muszą spełniać nasze zwykłe kryteria dla języków programowania .
Jeśli twój wybrany język jest trywialną odmianą innego (potencjalnie bardziej popularnego) języka, który ma już odpowiedź (pomyśl dialekty BASIC lub SQL, powłoki Unix lub trywialne pochodne Brainfuck, takie jak Headsecks lub Unary), rozważ dodanie uwagi do istniejącej odpowiedzi, która: to samo lub bardzo podobne rozwiązanie jest również najkrótsze w innym języku.
O ile nie zostały one wcześniej anulowane, obowiązują wszystkie standardowe zasady gry w golfa , w tym http://meta.codegolf.stackexchange.com/q/1061 .
Na marginesie, proszę nie głosować nudnych (ale ważnych) odpowiedzi w językach, w których nie ma wiele do golfa; są one nadal przydatne w tym pytaniu, ponieważ próbuje skompilować katalog tak kompletny, jak to możliwe. Jednak przede wszystkim oceniaj odpowiedzi w językach, w których autor musiał włożyć wysiłek w golfa kodu.
Katalog
Fragment kodu na dole tego postu generuje katalog na podstawie odpowiedzi a) jako listy najkrótszych rozwiązań według języka oraz b) jako ogólnej tabeli wyników.
Aby upewnić się, że twoja odpowiedź się pojawi, zacznij od nagłówka, korzystając z następującego szablonu Markdown:
## Language Name, N bytes
gdzie N
jest rozmiar twojego zgłoszenia. Jeśli poprawić swój wynik, to może zachować stare porachunki w nagłówku, uderzając je przez. Na przykład:
## Ruby, <s>104</s> <s>101</s> 96 bytes
Jeśli chcesz umieścić w nagłówku wiele liczb (np. Ponieważ twój wynik jest sumą dwóch plików lub chcesz osobno wymienić kary za flagi tłumacza), upewnij się, że rzeczywisty wynik jest ostatnią liczbą w nagłówku:
## Perl, 43 + 2 (-p flag) = 45 bytes
Możesz także ustawić nazwę języka jako link, który pojawi się we fragmencie:
## [><>](http://esolangs.org/wiki/Fish), 121 bytes
sh
odpowiedź przy użyciu, cat
która zawiera również krótsze rozwiązanie przy użyciu dd
.)
cat