Sprawdzony optymalny!
((([()][()][()])))
Wypróbuj online!
Wyjaśnienie
Brain-Flak, Brain-Flueue, Miniflak i Fλak
([()][()][()]) Push -3
( ) Copy
( ) Copy
To drukuje:
-3
-3
-3
(Kończy się nowa linia)
Brain-Flak Classic
Brain-Flak Classic to oryginalna wersja Brain-Flak i ma kilka ważnych różnic od współczesnego Brain-Flak. W BFC [...]
drukuje zawartość zamiast ją negować.
[()] Print 1
[()] Print 1
[()] Print 1
( ) Push 3
( ) Push 3
( ) Push 3
Pod koniec wykonywania 3 3 3
drukowana jest zawartość stosu ( ).
To drukuje:
1
1
1
3
3
3
(Kończy się nowa linia)
Flakcats
Flakcats różni się od pozostałych 4 flaków i jestem zaskoczony, że działa to w Flakcats. Trzej operatorzy tutaj są prawie tacy sami jak ci, których używa Brain-Flak.
Główną różnicą w tym konkretnym programie między Flakcats jest (...)
operator, który w Flakcats jest równoważny ([{}]...)
w Brain-Flak. Nie ma to jednak dla nas znaczenia, ponieważ zbiera zera, a zatem działa podobnie jak Brain-Flak.
Oto ten program skompilowany w Brian-Flak:
([{}]([{}]([{}][()][()][()])))
To drukuje:
-3
-3
-3
(Kończy się nowa linia)
Dowód optymalności w Brain-Flak i Miniflak
Nie jest to formalny dowód, ale raczej nieformalny dowód, który należałoby rozszerzyć, aby był bardziej rygorystyczny
Z powodu ograniczeń, że programy Brain-Flak muszą być łańcuchem zrównoważonym, a długość programu musi być wielokrotnością 3, każde prawidłowe przesłanie musi być wielokrotnością długości 6. Oznacza to, że każde rozwiązanie mniejsze niż 18 musi mieć długość 12.
Ze względu na to, że końcowe znaki wyjściowe kończą się na nowej linii, ostateczna wysokość stosu musi być wielokrotnością trzech, w przeciwnym razie złamiemy ograniczenia dotyczące wyjścia.
Każde prawidłowe zgłoszenie o długości 12 musi mieć 2 typy nawiasów klamrowych (posiadanie mniejszej liczby łamałoby ograniczenia dotyczące liczby różnych znaków, a więcej oznaczałoby więcej niż 12 znaków). Ponieważ program generuje dane wyjściowe, musi mieć push.
To pozwala nam wybrać inny zestaw aparatów ortodontycznych. Dostępne są następujące opcje:
<...>/<>
To się nie udaje, ponieważ musimy wygenerować „wartość”, aby utworzyć dowolną liczbę inną niż zero, musimy zrezygnować z, aby utworzyć liczbę, ()
która uniemożliwia przesuwanie więcej niż dwa razy.
[...]/[]
To się nie udaje z tego samego powodu, co ostatni nieudany. Kwadratowe nawiasy klamrowe są naprawdę złe w tworzeniu wartości. []
Monada może tworzyć wartość, ale musimy naciskać numery pierwszej i my wtedy nie ma wystarczającej ilości nawiasy pozostały wcisnąć trzy razy.
{...}/{}
Ten jest obiecujący, możemy stworzyć pętlę i użyć jednego ()
do wielokrotnego wypychania, ale niestety nie jest to możliwe.
Aby pętla się zakończyła, w stosie musi znajdować się zero w pewnym momencie, a żeby mieć poprawne wyjście, musimy mieć coś innego niż zero na stosie na końcu programu. Ponieważ nie mamy []
ani <>
zera na końcu pętli, musi to być niejawne zero z dołu stosu. Oznacza to, że pętla nie może dodawać żadnych nowych liczb do stosu, co czyni go bezużytecznym.
Ponieważ żadna z opcji nawiasu klamrowego nie może utworzyć programu o długości 12, żaden nie może istnieć.
Ponieważ Miniflak jest podzbiorem Brain-Flak, każdy krótszy program Miniflak byłby również krótszym programem Brain-Flak, a zatem nie istnieje.
Brain-Flueue to język żartów oparty na Brain-Flak. Obaj są tak podobni, że ich tłumacze są identyczni wszędzie oprócz dwóch linii. Różnica między nimi polega na tym, jak sugerują ich nazwy, Brain-Flueue przechowuje swoje dane w kolejkach, podczas gdy Brain-Flak przechowuje swoje dane w stosach.
Na początek mamy te same ograniczenia dotyczące rozmiaru programu utworzone przez Brain-Flak, dlatego szukamy programu o rozmiarze 12. Ponadto będziemy potrzebować (...)
, aby utworzyć dane wyjściowe i inną parę. <>
i []
pary nie działają w Brain-Flueue do dokładnie tego samego powodu nie działają w Brain-Flak.
Teraz wiemy, że nasz program musi składać się ze znaków ((())){{{}}}
.
Za pomocą tych samych metod, które zastosowano w poprzednim dowodzie, możemy wykazać, że w końcowym programie musi być pętla.
Teraz są różne dowody, ponieważ Brain-Flueue działa w kolejkach, a nie w stosach, program może wyjść z pętli z wartościami w kolejce.
Aby wyjść z pętli, będziemy potrzebować zera w kolejce (lub pustej kolejce, ale jeśli kolejka będzie pusta, otrzymamy ten sam problem co Brain-Flak), będzie to oznaczać, że będziemy musieli otworzyć nasz program, ({})
aby utworzyć zero. Będziemy potrzebować push wewnątrz pętli, aby wypchnąć niezbędną liczbę elementów do kolejki. Będziemy także musieli nacisnąć liczbę niezerową przed pętlą, abyśmy mogli w ogóle wejść do pętli; będzie nas to kosztować absolutnie minimum (())
. Użyliśmy teraz więcej parenów niż my.
Zatem nie ma programu Brain-Flueue wykonującego zadanie o długości 12 bajtów, a ponadto nasz program jest optymalny.
Poniższe rozwiązanie jest optymalne dla Flakcats i Brain-Flak Classic.
((([][][])))
Wyjaśnienie
[][][] -3
((( ))) push 3 times
Alternatywne 24-bajtowe rozwiązania Brain-Flak
(<((<((<(())>)())>)())>)
Wypróbuj online!
((<((<((<>)())>)())>)())
Wypróbuj online!
((((((()()()){}){}){})))
Wypróbuj online!