Mam program, który generuje sformatowany kod Brainfuck. Uruchamiam mój program
./example "S"
i wynik jest
+[>+
<
+++
]
>--.
który drukuje literę S w Brainfuck.
Twoim celem jest napisanie programu, który akceptuje łańcuch jako dane wejściowe i wyjściowe w innym języku, który wypisuje ten łańcuch.
- Kod źródłowy twoich programów musi być sformatowany w taki sposób, aby reprezentował ciąg znaków w sztuce ASCII (drukowany poziomo, a nie pionowo).
- Kod źródłowy nie może zawierać ciągu (może jednak zawierać litery występujące w ciągu, ale nie sekwencyjnie)
Inaczej,
- Obowiązują standardowe luki .
- Najkrótszy kod wygrywa.
Proszę nadać tytuł swojemu zgłoszeniu językiem, w którym jest napisane, językiem, który wysyła, oraz całkowitym rozmiarem w bajtach. Dołącz wynik swojego programu, gdy wpiszesz ciąg UNCOPYRIGHTABLE.
Dzięki!
Odpowiedzi:
C -> Brainfuck 556 bajtów
Z wyłączeniem niepotrzebnych białych znaków. Mógłbym z łatwością zapisać kolejną setkę, zmieniając dane czcionki
d[]
z szesnastkowego na ciąg znaków w cudzysłowie.Wykorzystuje to czcionkę kalkulatora (dla niskiej entropii, tylko jeden bajt na literę) i bardzo naiwny kompilator Brainfuck inspirowany https://codegolf.stackexchange.com/a/35801/15599 (z wyjątkiem tego, że używam plus zamiast minus.) pierwsza
for
pętla kompiluje teksta
do łańcuchab
, a także oblicza liczbę pociągnięć wymaganych do narysowania sformatowanego kodu, używając 13-cyfrowej magicznej liczby szesnastkowej (wszystkie znaki to 5-8 uderzeń).Biorąc pod uwagę całkowitą długość programu i liczbę uderzeń, obliczana jest liczba znaków na uderzenie (może być bardzo mała, jeśli znaki są takie same lub w porządku rosnącym, i bardzo duża, jeśli znaki są w porządku malejącym).
Większość reszty programu jest poświęcona podejmowaniu decyzji, czy należy wydrukować białe znaki lub jedno z pociągnięć. Jeśli kursor znajduje się nad kwadratem obrysu, funkcja
f
jest wywoływana z argumentem liczby tego obrysu. Zwraca spację, jeśli ten obrys nie jest wymagany dla bieżącej litery, lub znak z programu, jeśli jest. Ponieważ liczba znaków wymagana do uzupełnienia grafiki ASCII może być większa niż liczba znaków w programie, od czasu do czasu wstawiana jest spacja, stąd obliczeniab[i * v/u]
.Czcionka zawiera cztery pojedyncze pociągnięcia i cztery podwójne pociągnięcia, ponumerowane w następujący sposób, które są obecne lub nieobecne, w zależności od litery.
Wynik
Test na http://copy.sh/brainfuck/
ABC
DEF
GHIJK
LMNOP
QRSTU
VWXYZ
KOPIOWANE
przy większości łańcuchów z literami w losowej kolejności (nie rosnąco) rozmiar liter jest znacznie większy, a litery wyglądają znacznie lepiej. Niestety rozmiary plików stają się dość duże. Nie mogę przesłać pełnego słowa UCOPYRIGHTABLE tutaj, COPYABLE dotyczy najdłuższego dozwolonego słowa.
źródło
Perl → Befunge, 868 bajtów
OK, rozkręcę piłkę. Można to trochę pograć w golfa, ale moja głowa zaczyna boleć ...
Przykłady:
Krótsze przykłady można wkleić do interpreterów internetowych, takich jak ten , ale wydaje się , że UNCOPYRIGHTABLE powoduje, że program jest zbyt długi, aby obsłużyć wszystkich tłumaczy online.
Uwaga:
@
Znak na końcu pierwszego wiersza wyjściu mówi befunge do biegania zatrzymania. Bez tego program powtarzałby to samo słowo na zawsze.źródło
C → Brainfuck, 855 bajtów
Dodano kilka nowych linii, aby poprawić czytelność. Zauważ, że występuje błąd w pisowni małych liter i symboli. Sprawdź tutaj wynik .
Przykłady
Na terminalu wygląda o wiele ładniej :(
I w końcu,
źródło