Ta strona miała wiele problemów związanych z implementacją różnych języków w tagu tłumacza . Jednak praktycznie wszystkie z nich były językami ezoterycznymi, których nikt nie używa. Czas na tłumacza praktycznego języka, który prawdopodobnie zna już większość użytkowników. Tak, to skrypt powłoki na wypadek problemów z odczytaniem tytułu (nie że tak). (tak, celowo podjąłem to wyzwanie, ponieważ nudzę się takimi językami jak GolfScript i Befunge, które wygrywają wszystko, więc stawiam wyzwanie, gdy bardziej praktyczny język programowania ma większe szanse na wygraną)
Jednak skrypt powłoki jest stosunkowo dużym językiem, więc nie będę prosił o jego implementację. Zamiast tego stworzę mały podzbiór funkcji skryptu powłoki.
Podzbiór, który zdecydowałem, to następujący podzbiór:
- Wykonywanie programów (programy będą zawierać tylko litery, nawet jeśli dozwolone są pojedyncze cudzysłowy)
- Argumenty programowe
- Pojedyncze cudzysłowy (akceptujący dowolny znak ASCII do wydruku, w tym spacje, z wyłączeniem pojedynczego cudzysłowu)
- Niecytowane ciągi znaków (zezwalające na litery, cyfry i myślniki ASCII)
- Rury
- Puste wyciągi
- Wiele instrukcji oddzielonych nowym wierszem
- Spacje końcowe / wiodące / wiele spacji
W tym zadaniu musisz odczytać dane wejściowe ze STDIN i uruchomić każdą żądaną komendę. Możesz bezpiecznie założyć system operacyjny zgodny z POSIX, więc nie ma potrzeby przenośności z Windows, ani nic podobnego. Możesz bezpiecznie założyć, że programy, które nie są potokowane do innych programów, nie będą czytać ze STDIN. Możesz bezpiecznie założyć, że polecenia będą istnieć. Możesz bezpiecznie założyć, że nic więcej nie zostanie użyte. Jeśli jakieś bezpieczne założenie zostanie złamane, możesz zrobić wszystko. Możesz bezpiecznie założyć maksymalnie 15 argumentów i wiersze poniżej 512 znaków (jeśli potrzebujesz jawnego przydziału pamięci lub coś takiego - naprawdę dam małe szanse na wygraną dla C, nawet jeśli nadal są małe). Nie musisz czyścić deskryptorów plików.
Możesz wykonywać programy w dowolnym momencie - nawet po otrzymaniu pełnej linii lub po zakończeniu STDIN. Wybierz dowolne podejście.
Prosta walizka testowa, która pozwala przetestować powłokę (zwróć uwagę na końcowe białe znaki po trzecim poleceniu):
echo hello world
printf '%08X\n' 1234567890
'echo' 'Hello, world!'
echo heeeeeeelllo | sed 's/\(.\)\1\+/\1/g'
yes|head -3
echo '\\'
echo 'foo bar baz' | sed 's/bar/BAR/' | sed 's/baz/zap/'
Powyższy program powinien wypisać następujący wynik:
hello world
499602D2
Hello, world!
helo
y
y
y
\\
foo BAR zap
Nie możesz wykonać samej powłoki, chyba że nie masz żadnych argumentów dla polecenia (ten wyjątek został stworzony dla Perla, który uruchamia polecenie w powłoce po umieszczeniu tylko argumentu system
, ale możesz nadużywać tego wyjątku dla innych języki, jeśli możesz to zrobić w sposób, który oszczędza znaki), lub uruchomione polecenie jest samą powłoką. Jest to prawdopodobnie największy problem w tym wyzwaniu, ponieważ wiele języków ma system
funkcje wykonujące powłokę. Zamiast tego używaj interfejsów API języka, które wywołują programy bezpośrednio, takich jak subprocess
moduł w Pythonie. To i tak jest dobry pomysł na bezpieczeństwo, a cóż, nie chciałbyś stworzyć niepewnej powłoki, prawda? To najprawdopodobniej zatrzymuje PHP, ale i tak można wybrać inne języki.
Jeśli masz zamiar zrobić swój program w skrypcie powłoki, nie wolno używać eval
, source
albo .
(jak w, funkcji, a nie znaków). Moim zdaniem wyzwanie byłoby zbyt łatwe.
Dopuszczalne sprytne nadużywanie reguł. Jest wiele rzeczy, których wyraźnie zabroniłem, ale jestem prawie pewien, że nadal możesz robić rzeczy, o których nie myślałem. Czasami jestem zaskoczony tym, jak ludzie interpretują moje zasady. Pamiętaj też, że możesz zrobić wszystko dla czegoś, o czym nie wspomniałem. Na przykład, jeśli spróbuję użyć zmiennych, możesz wyczyścić dysk twardy (ale nie rób tego).
Wygrywa najkrótszy kod, ponieważ jest to codegolf.