Ostatnio ktoś zaproponował bardziej rygorystyczne ograniczenia domyślnej długości linii Pythona:
Oczywiście żaden program nie powinien używać więcej niż 80 znaków w wierszu, z wielu powodów. Przede wszystkim, dla czytelności i łatwości konserwacji, ważne jest, aby mieć solidny standard, abyśmy mogli odpowiednio dostosować szerokość naszych edytorów tekstu. Dodatkową korzyścią jest to, że kod można łatwo przenieść na nośnik, który może mieć ograniczenia, a dodawanie podziałów linii może rozpraszać uwagę, np. Drukowanie stron do recenzji na spotkaniu lub dziurkowanie kart.
Ale czy 80 znaków jest zbyt wysoka? Niektórzy sugerują 79, a nawet 75, aby umożliwić terminalowi o szerokości 80 znaków dopasowanie kodu do kilku kolumn poświęconych numerom linii. Oczywiście ostatecznie niższe jest lepsze, ponieważ dolne limity pozwalają na użycie kodu w większej liczbie sytuacji bez ponownego formatowania.
Twoim celem jest znalezienie i zademonstrowanie minimalnej długości linii wymaganej przez Twój ulubiony język, pisząc wariant FizzBuzz z najmniejszą liczbą znaków w dowolnej linii.
Wkład
Liczba całkowita, n , dowolną pożądaną metodą.
Wydajność
Wydrukuj liczby od 1 do n , ( n ≥ 1, n ∈ ℤ) oddzielone łamaniem linii, z wyjątkiem:
- dla wielokrotności 3 wydruków „Apple”
- dla wielokrotności 5 wydruków „Pie”
- dla wielokrotności druku 3 i 5 „ApplePie”
Punktacja
Maksymalna długość linii w bajtach, nie uwzględniając podziału linii (Cr, CrLf, Lf lub innego standardowego podziału systemu, określ, stosownie do potrzeb), a całkowita długość kodu w bajtach jako przerywacz remisu.
Zasady
Wszystkie podziały linii muszą mieć znaczenie. Podziały linii, które można usunąć, i sąsiednie linie bezpośrednio połączone bez wpływu na wynik, muszą zostać usunięte.
Odpowiedzi:
> <> , 1 bajt na linię,
243161135 bajtów-26 bajtów dzięki Jo Kingowi!
Języki 2D FTW! Chociaż pisanie pętli i gałęzi za pomocą instrukcji goto zamiast struktury 2D nie jest zabawne.
Wypróbuj online! lub obejrzyj na placu zabaw dla ryb !
Ryba płynie w dół wzdłuż kodu, używając warunkowych gotów do pomijania rzeczy w zależności od tego, co dzieli akumulator.
Uważam, że spełnia to specyfikację: bez względu na to, jakie nowe linie są usuwane, ryba zawsze uderza w początkową
v
(jedyna obecna instrukcja zmieniająca kierunek), więc ryba zawsze płynie w dół w pierwszej kolumnie. W ten sposób usunięcie nowego wiersza powoduje po prostu usunięcie następnego znaku ze ścieżki ryby, i nie sądzę, że można usunąć dowolny znak bez zmiany wyniku.źródło
Haskell , 3 bajty / linię,
494 471 470 463 453 450461 bajtówEDYTOWAĆ:
-1+x
nax-1
.--
linia pox-
.f
użyciuc 47:[]
zamiast[c 47&0]
.w
.a="Apple"
ip="Pie"
in#
i użyj fikcyjnej rekurencji dla przypadku 15.w
inf
. Usuń zbędne--
międzyx
i15
.%
funkcji. W końcu wykonałem automatyczne testy, aby upewnić się, że nie będzie już niespodzianek.f
bierzeInt
i zwraca aString
.Wypróbuj online!
Testuj ograniczenia źródła!(Linia 70 jest wykluczona z testowania, ponieważ usunięcie jej nowej linii powoduje nieskończoną pętlę bez wyjścia.)
Wersja z usuniętymi najważniejszymi sztuczkami wyciskającymi:
Jak to działa
{}
. Ponieważ tak naprawdę definiuję funkcję, a nie cały program, nie jestem pewien, jak liczyć bajty; I Wybrano obronnym liczyć zarówno z{}
S i dodatkowego;
separatora zgłoszenia (ten ostatni zazwyczaj jest znakiem końca linii, w normalnym trybie Haskell).--
komentarze do linii, które sprawiają, że następnej nowej linii nie można usunąć, a także poprzedniej nowej linii w przypadku, gdy poprzednia linia kończy się znakiem operatora (który sam nie jest częścią komentarza linii) .\
odwrotnymi ukośnikami w literałach łańcuchów, wcięta dla kontynuacji linii z możliwym wcięciem. Przerwa w ciągu znaków z ogranicznikami jest usuwana z przeanalizowanego ciągu."Apple"
i"Pie"
pokazuje się to bezpośrednio na wyjściu. For"8"
i"9"
dopasowanie wzorca służy do podania błędu, jeśli łańcuch ma więcej niż jeden znak.&
i%
, które pozwalają na wymuszenie zakończenia linii znakiem operatora dla pierwszej lewy. Potrzebujemy tego do końca literałów łańcuchowych, ponieważ\"
jest zbyt szeroki, aby go dołączyć--
.&
jest ogólny, zdefiniowany tak, żex&y=x
.%
jest zdefiniowany w taki sposób, że[a]%y=a
umożliwia zastąpienie!!0
i jednoczesne wymuszenie, aby jego argument ciągu miał długość 1.\n
wydaje się niemożliwe zmieszczenie się w dosłownym łańcuchu zawierającym tylko 3 bajty w linii.c x=["9"%0,"8"%0..]!!x
jest konwertowanie z znakuInt
na znak, licząc od cyfry w'9'
dół.show
to cztery znaki, wyprowadzanie liczb musi być realizowane ręcznie.d
to lista ciągów cyfr"1".."9"
.n
to nieskończona lista reprezentacji liczb["1","2","3",...]
zdefiniowanych rekurencyjnie za pomocąd
.#
konwertujeInt
x
do jego formy applepie podano dodatkowy pierwszy argument, który jestgcd
ox
15 nowych.źródło
Haskell , 7 bajtów / linię, 339 bajtów
Wymóg, aby podział linii był znaczący, sprawia, że jest to nietrywialne wyzwanie w Haskell. Niemal nie ma możliwości wstawienia podziałów linii, których nie można usunąć, więc wszystko musi być zrobione za pomocą legalnie małych instrukcji.
Wypróbuj online!
źródło
Galaretka ,
32 bajty / linię,1068056 bajtówWiersze i kolumny literału łańcuchowego zostaną transponowane, więc usunięcie nowych linii zmienia ich kolejność.
Pozostałe linie są oddzielnymi linkami / funkcjami i zawierają wywołania funkcji (
¢
), więc można je połączyć tylko wtedy, gdy wywołania funkcji również zostaną wyeliminowane.Wypróbuj online!
źródło
TI-BASIC, 4 bajty na linię
Ponieważ celem jest jedynie zminimalizowanie maksymalnej długości linii, niektóre linie są dłuższe niż powinny, ale najmniejsza, jaką mogłam zrobić, była najdłuższa z 4 bajtów. Dlatego czułem, że ułatwi to odczytanie kodu, jeśli scalę linie, które można połączyć bez przekraczania 4 bajtów.
Bez golfa
O języku i ograniczeniach
TI-BASIC jest językiem tokenizowanym, aw tym przypadku każdy z tokenów ma 1 bajt, z wyjątkiem
StrN
zmiennych, które są 2 bajtami. Możesz też zrezygnować z zamykania nawiasów przez większość czasu.remainder(
Funkcja 2 bajty, więc stosując to wymagają co najmniej 5 bajtów (jedno dla funkcji, dwa dla argumentów i jeden dla przecinek weremainder(I,3
). Zamiast tego użyłem funkcjifPart(
i,not(
aby go skrócić, które są 1-bajtowymi tokenami. Widać też, żeAns
dość często korzystałem z wbudowanej zmiennej , ponieważ każde wyrażenie, które samo jest oceniane w linii, jest automatycznie do niej zapisywane. Mogę więc zaoszczędzić kilka bajtów, dzieląc wyrażenia i przypisania.Inną strategią było oczywiście zminimalizowanie przypisań ciągów. Moja metoda zrobienia tego zależała od maksymalnej długości linii w pozostałej części kodu. Gdy ustaliłem, że to 4 bajty, byłem w stanie wcisnąć jak najwięcej każdego łańcucha w tym samym wierszu, jak to możliwe, aby zminimalizować liczbę potrzebnych zadań. Zrobiłem to ze względu na czytelność.
Czynnikami ograniczającymi w tym kodzie są przypisania do zmiennych łańcuchowych i konkatenacja ze zmiennymi łańcuchowymi. Linie
Ans→Str1
iStr1+Ans
oba mają łącznie 4 bajty. Musiałbym znaleźć sposób na całkowite wyeliminowanie zmiennych łańcuchowych, aby dodatkowo zminimalizować maksymalną długość linii w moim kodzie. Całą resztę można skrócić do maksymalnie 3 bajtów lub mniej na linię.Problem leży w przypisaniach do zmiennych numerycznych, takich jak
1→I
. Nie możesz dalej grać w golfa bez znalezienia rozwiązania bez zmiennych, które nie przekraczają 2 bajtów długości linii. To zdarza się niemożliwe w przypadku tego wyzwania.Operatory binarne, takie jak,
+
wymagają symbolu operatora oraz argumentów lewego i prawego. Bez tego nie byłoby możliwości połączenia łańcuchów. Bez konkatenacji łańcuchów nie byłoby sposobu wyświetlenia łańcuchów wymaganych przez ten program do ukończenia wyzwania bez przekraczania 2 bajtów długości linii. Dlatego teoretyczny limit tego wyzwania w tym języku wynosiłby 3 bajty na linię, czego nie byłem w stanie osiągnąć.źródło
If A and B
Ans
Token jest 1 bajt, natomiast trzy kolejne znakiAns
są 1, 2 i 2 bajty odpowiednio w sumie 5. Nie jest to ciąg znaków ASCII, to dosłownie token po wpisaniu go na kalkulatorze.C (gcc) , 2 bajty na linię,
374368320310262 bajtówZakładam, że można go trochę pograć w golfa. Ukośniki odwrotne poprzedzające nowe linie sprawiają, że jest to trochę banalne.
Wypróbuj online!
źródło
&&
.Python 3 , 4 bajty / linia, 113 bajtów
Wypróbuj online!
źródło
PHP 7, 2 bajty na linię
źródło
Aceto , 1 bajt na linię, 230 bajtów
Cóż, pisanie nie było fajne. Jako fungoid struktury kontrolne Aceto w dużej mierze polegają na swojej naturze 2D, ale możemy to obejść za pomocą wielu, wielu warunkowych ucieczek (
`
). Jedynym problemem jest to, że wpływają one na następne polecenie, niezależnie od jego obecności (wszystkie programy Aceto są wewnętrznie kwadratami), dlatego musimy wyrównać program w niektórych miejscach, wstawiając puste linie w niektórych punktach.Literałów łańcuchowych tak naprawdę nie można używać, ale literałów char można (w niektórych miejscach; znowu musimy je wyrównać).
Wywoływany za pomocą
20
:Tak się nigdy nie dzieje, ponieważ biegnie od dołu do góry.
Jest co najmniej jedno miejsce, w którym możemy zaoszczędzić 2 bajty (zamieniając na
`X
a|
lub#
), ale zachowałem ją taką, jaka jest, ze względu na koszty wykonania związane z przejściem przez stosunkowo dużą krzywą Hilberta.Zignorowałem także dorozumiany wymóg używania
\r
lub\r\n
nowego wiersza, ponieważ uważam, że jest to niezamierzony błąd OP. Jeśli istnieje zmiana lub komentarz wzmacniający ten wymóg, mogę go zmienić bez większego problemu, aby zamiast tego użyć nowego wiersza CR.Liczba bajtów jest oparta na kodowaniu kodowania golfowego Aceto; Latin-7, w której
£
jest jeden bajt.źródło
Perl 5 , 2 bajty na linię, 182 bajty
Wypróbuj online!
Składnia Perla jest bardzo wybaczająca, więc można dodać wiele luk do kodu i dodanych komentarzy, co sprawia, że podstawowa idea jest dość prosta. Głównym celem tego kodu jest zbudowanie ciągu zawierającego kod, który chcemy uruchomić, i
eval
to. W Perlu możliwe jest wywołanie funkcji za pomocą ciągu znaków lub zmiennej z&{...}
zapisem, niestety nieeval
jest to możliwe w tej formie, aleevalbytes
tak długo, jak długo wywołujesz ją przezCORE::
przestrzeń nazw. Budowanie tego ciągu było dość proste, a program jest przekazywany bezpośrednio do tego wywołania. Ciągi są budowane przy użyciu nowych wierszy jako części XOR, aby je zbudować , użyłem tego skryptu. Aby zachować to ważność, w kilku miejscach musiały być umieszczone komentarze, aby usunięcie nowej linii spowodowało brak działania kodu.Procedura FizzBuzz została zaczerpnięta z doskonałej odpowiedzi primo .
Perl 5 , 1 bajt na linię, 172 bajty
Tak więc (teraz) wiem, że jest to nieprawidłowe , ponieważ kilka nowych linii można usunąć, ale ponieważ było to moje oryginalne podejście do problemu, dodam go. Fajnie było zobaczyć, jak daleko można przesunąć składnię Perla! Podobał mi się ten problem sam w sobie, mimo że jest nieważny.
Wypróbuj online!
źródło
SmileBASIC,
97 bajtów na linię,159155154152 bajtówTo było naprawdę zabawne wyzwanie. Niestety, zasada niepotrzebnych podziałów linii powoduje kilka problemów (choć na szczęście nie wpływa to tutaj na maksymalną długość linii). Musiałem dodać komentarze między liniami jak
A%=I/3
iA=A%*3
, ponieważA%=I/3A=A%*3
w SB jest poprawnie analizowane. I był w stanie wykorzystać trick opuścić kilka uwag, ponieważ zastąpienieA
zE
marek, które nieważne linia (To ma coś wspólnego z liczb zapisanych za pomocąE
notacji, myślę.3E
Jest uważany za nieprawidłowy numer, a nie numer i nazwę zmiennej).Największym ograniczeniem jest tutaj wkład.
INPUT x
jest najprostszym dozwolonym sposobem, alternatywnie jest zdefiniowanie funkcji o wartości wejściowej takiej jak,DEF F x
ale to wciąż 7 znaków. Trudne jest także wyrażenie warunkowe; Nie mogę wymyślić nic krótszego niżWHILE x
.źródło
A%=I/3A=A%*3
jest poprawny składniowo, ale logicznie uszkodzony, nie potrzebujesz znaku komentarza.A%=I/3
iA=A%*3
, więc komentarz jest wymagany.JavaScript (ES6), 3 bajty na linię
Używa zmiennej globalnej,
top
aby uzyskać dostęp dowindow
obiektu, z którego otrzymujemyeval
następujący kod:Będziesz musiał uruchomić go w konsoli, ponieważ
top
jest niedostępny z piaskownicowego fragmentu stosu.źródło
C #, 9 bajtów na linię,
248 242230 bajtówPonieważ C # nie przejmuje się łamaniem linii, potrzebuje komentarza online na końcu prawie (dzięki Ørjan Johansen) każdej linii, aby zachować zgodność z regułami. Ten program oczekuje n jako argumentu wiersza poleceń. Oto możliwie jak najwięcej nowych linii, których nie można usunąć:
Ale ponieważ najdłuższa linia ma 9 bajtów, inne linie również mogą uzyskać taką długość, goląc niektóre bajty:
źródło
//
między tokenami, które połączyłyby się, jakstatic
ivoid
.var
s="";if//
(i%3==0//
)s+=//
"Apple"//
;if(i%5//
.A
z pierwszej do drugiej linii.Python 2, 5 bajtów / linię, 93 bajty
Standard max6 jest już przestarzały.
Wypróbuj online!
Python 2 i 3, 5 bajtów / linię, 100 bajtów
Wypróbuj online!
źródło
JavaScript, maksymalnie 6 bajtów / wiersz, 528 bajtów
Pomysł zgarnął stąd .
Kod został zgrany stąd .
Podziękowania dla Andersa Kaseorga za
g=eval
oszczędność bajtu na linię.Niesperowane:
źródło
a=""+\n"f"+\n"o"+ ...
a zakończenieeval(\na)
jest nieco krótszef=eval
if(a)
.PHP, 4 bajty / linia
Wypróbuj online!
źródło
APL (Dyalog) , 5 bajtów na linię
Wypróbuj online!
źródło
Siatkówka , 4 bajty / linię
Wypróbuj online!
źródło
R , 10 bajtów na linię, 800 bajtów
Reguła „znaczących przełamań linii” stanowiła wyzwanie. Obecnie to przeliteruje kod fizzbuzz na ciąg znaków, a następnie wykonuje go.
Wypróbuj online!
Oto łączone kod applepie (zaadaptowane z MickyT w golfa tutaj ).
I niepoznana wersja kodu parsującego:
Tutaj używam
toString
do łączenia listy symbolia
w pojedynczy ciąg. Jednak domyślnym zachowaniem jest oddzielenie każdego symbolu,
, więc wywołujemy,gsub
aby zastąpić je zerami. Następnie przekazujemy toparse
ieval
wykonujemy brudną robotę.Jest możliwe, że jest to podejście, które nie korzysta z tej metody ciąg parsowanie i tylko prosto narzędzi fizzbuzz, ale wydaje mi się, że za pomocą
for
lubwhile
lub definiowaniafunction
potrzeb dłuższe niż linie obecnego podejścia.źródło
Rubinowy,
105bajtów / linię,354214 bajtów-140 bajtów z surowego wyniku @NieDzejkob.
Jak to działa
Ruby automatycznie połączy sekwencje literałów łańcuchowych (z wyjątkiem literałów jednoznakowych, takich jak
?a
) w tej samej instrukcji. Oznacza to, żex = "a" 'b' "c" %q{d}
jest to równoważne zx = "abcd"
. Używamy tego, aby podzielić kod podobny do FizzBuzz na znacznie mniejsze ciągi do wywoływaniaeval
, ponieważ+
spowoduje to unieważnienie programu z powodu reguły remove-newlines, ale\
spowoduje błędy składniowe, jeśli nowe linie zostaną usunięte!źródło
eval
linia jest dłuższa niż reszta, prawda?Julia 0.6 , 5 bajtów na linię, łącznie 168 bajtów
Wypróbuj online!
The
print
to nieuchronnie (afaict) do 5 bajtów na terytorium linii.Nie golfowany:
*
jest operatorem łączenia łańcuchów, więca*p*"\n"
tworzy „ApplePie \ n”.|>
jest operatorem łączenia łańcuchów (/ piping), więc wybrany ciąg zostaje wysłany jako argument doprint
. Niesin
jest używany, po prostu istnieje, ponieważprint
musi znajdować się w tablicy, aby mieć po nim znaczną spację (użycie#
lewy po tym spowoduje zwiększenie liczby bajtów na linię do 6).Jeśli dozwolone jest po prostu zwracanie danych wyjściowych jako tablicy, można to zrobić z maksymalnie 4 bajtami na linię:
Julia 0.6 , 4 bajty na linię, łącznie 152 bajty
Wypróbuj online!
Funkcja, która pobiera n i zwraca tablicę zawierającą oczekiwane dane wyjściowe. Maksymalna długość linii tutaj jest ograniczona przez
n->
- Julia potrzebuje tego w jednym wierszu, aby poprawnie parsować go jako początek lambda.źródło
Pascal (FPC)
-Sew
, 6 bajtów na linię,348320 bajtówWypróbuj online!
Wykorzystuje FPC, aby uzyskać 6 bajtów na linię; bez tego wynik byłby znacznie gorszy. Jest to najmniejsza możliwa szerokość linii, ponieważ po
write
musi być albo;
albo(
(albo niepotrzebne białe znaki), więc wstawiono specjalny komentarz, aby tego uniknąć. Funkcje FPC, które wpłynęły na tę odpowiedź, to://
- rozpoczynanie komentarzy w jednym wierszu.{$<something>...}
są dyrektywami kompilatora. Jeśli dyrektywa nie istnieje, FPC wyda ostrzeżenie (i{$ ...}
tak dalej). W tym programie{
i$
są oddzielone znakiem nowej linii, która wyświetli ostrzeżenie po usunięciu.-Sew
- Kompilator zatrzymuje się także po ostrzeżeniach{
i$
dołączył do zatrzymania kompilacji.źródło
Japt , 3 bajty na linię
Prawie udało się sprowadzić go do dwóch bajtów na linię, ale powrót z mapy psuje się, jeśli następuje po niej nowa linia.
Sama implementacja FizzBuzz pochodzi z kanonicznego wątku FizzBuzz .
Wypróbuj online!
źródło
LOLCODE ,
188 bajtów na linię, łącznie 303 bajtyWypróbuj online!
-10 bajtów na linię za pomocą znaku kontynuacji linii
…
, dzięki Ørjan Johansen!źródło
Python 2 , 5 bajtów / linię
Wypróbuj online!
źródło
'z\"'
oznacza to samo co'z\
⏎"'
, więc redundantna reguła nowej linii oznacza, że nie możesz rozpocząć linii kontynuacji wewnątrz ciągu"
.r'...'
terazSyntaxError
.FizzBuzz
na używanieApplePie
.JavaScript (ECMAScript6), 2 bajty na linię
Długie wyjaśnienie
Sposób, w jaki możemy skrócić linie, polega na przekształceniu kodu w łańcuch i ucieczce od końca linii, co spowoduje ograniczenie 2 bajtów na linię.
Tak się
alert(1)
stajeAle teraz twój kod jest ciągiem, więc musimy go wykonać jako kod. Znam co najmniej 4 sposoby wykonywania łańcucha jako kodu:
eval(
onclick=""
atrybutu, ale nie udało mi się skrócić tworzenia elementu.Wszystkie natywne funkcje mieszka wewnątrz okna obiektu w javascript i można uzyskać dostęp do właściwości obiektu za pomocą notacji kropki więc
eval()
staje sięwindow.eval()
, czy można uzyskać dostęp do właściwości za pomocą notacji nawiasuwindow['eval']()
. Możesz skorzystać z tego, aby rozbićeval
wiele linii przy użyciu metody opisanej wcześniej. Ale nadal musisz wpisać okno , jedną sztuczką jest to, że jeśli nie znajdujesz się w ramce, górną zmienną jest również okno, więc window.eval staje się top.eval (3 bajty mniej).Czyni to kod minimum 3 bajtów. Aby utworzyć 2 bajty kodu, użyłem
new Function(/*string*/);
konstruktora, ale musiałem być kreatywny, aby uzyskać do niego dostęp bez konieczności wpisywania go.Po pierwsze, konstruktor funkcji umożliwia wywołanie go jako funkcji pomijającej nowe słowo kluczowe, co zmniejsza 4 bajty, ale jest również ważne z innego powodu. Wywołanie konstruktora jako funkcja nadal zwraca instancję To pozwala nam włączyć
new Function(code)
doFunction(code)
. Inną ważną rzeczą jest to, że konstruktor funkcji macall
metodę, która pozwala wywoływać dowolną funkcję, ale zastępuje to odwołanie, a sam konstruktor funkcji jest funkcją, którą można wywołać na niejFunction.call(null, code)
.Wszystkie funkcje rodzime są instancjami konstruktora funkcji, a wszystkie obiekty w javascript mają właściwość konstruktora . Możesz więc mieć dostęp do konstruktora funkcji do dowolnej funkcji natywnej
alert.constructor
, a za pomocą metody wywołania możemy wykonać konstruktor jako funkcję. Teraz mamy alert.constructor.call (null, kod) zwraca funkcję.łącząc poprzednie thechiniques możemy to zmienić
alert['constructor']['call'](null, code)
Teraz musimy tylko znaleźć krótką nazwaną funkcję lub metodę, więc wybieram metodę big () wewnątrz konstruktora String. Więc mogę uzyskać do niego bezpośredni dostęp z pustego ciągu
"".big
Potem po prostu wszystko zepsułem na 2 bajty
Krótki er wyjaśnienie (TLDR)
Uzyskuję dostęp do nowego konstruktora funkcji (kod), aby przeanalizować ciąg zamiast eval (kod) . Ten konstruktor jest dostępny dla każdej funkcji natywnej poprzez wykonanie dowolnej funkcji. konstruktor , jak
alert.constructor===Function
. Używam funkcji / metody wewnątrz String.prototype.bigString.prototype.big.constructor.call(null, /*string*/)
Ale dostęp do niej bezpośrednio z literału ciągu"".big
i zamieniłem go na notację w nawiasie .""['big']['constructor']['call'](0, CODE)
aby móc go złamać za pomocą\
.źródło
'
i]
mogą być usunięte, a program będzie nadal działać poprawnie.Pip , 3 bajty na linię, łącznie 72 bajty
Wypróbuj online!
Pip jest wyjątkowo elastyczny pod względem białych znaków, więc jedyną strategią, która wydaje się wykonalna, jest utworzenie łańcucha, zmodyfikowanie go w taki sposób, aby nie zachodziło zakłócenie nowego wiersza, i jego ewaluacja.
Tworzymy ciąg znaków, w którym co drugi znak jest znakiem nowej linii, i bierzemy każdy inny znak za pomocą
UW
(rozplątuj) i unarnego@
(uzyskaj pierwszy element):Wynikiem
@UW
powinien być nasz kod ApplePie, zaadaptowany z rozwiązania FizzBuzz tutaj . Usunięcie nowych wierszy w ciągu nie spowoduje pełnego kodu, co spowoduje błąd składniowy lub niepoprawne wyjście.Są jeszcze dwie nowe linie poza ciągiem. Uczyniliśmy to obowiązkowym za pomocą
Y
operatora (yank) - który tutaj działa jako zakaz - wraz ze sposobem, w jaki Pip analizuje przebiegi wielkich liter:Więc jeśli te nowe wiersze zostaną usunięte, program parsuje inaczej i nie robi tego, co powinien.
źródło
Java 8, 7 bajtów na linię, 171 bajtów
Pusta lambda bierze
int
. Podejrzewam, że spełnia to wymóg dotyczący nowych linii, ale nie mogę tego udowodnić, a weryfikacja go brutalną siłą zajęłaby na moim komputerze około miesiąca. Tak to idzie.Wypróbuj online
Dość nudne ze względu na komentarze do linii. Jedyną interesującą rzeczą jest tutaj użycie zerowego
System
odniesienia, które wydaje się być konieczne, aby wydrukować do standardu w mniej niż 8 bajtów na linię. Zauważ też, żeprint
wywołanie metody jest wąskim gardłem.Ungolfed bez komentarzy:
źródło