Oktawa, 53 52 bajty
Dokonanie kompletnego przepisania pomogło mi w golfa w kodzie 5 bajtów, ale musiałem dodać więcej no-ops, dzięki czemu zaoszczędziłem tylko 1 bajt.
@(_)~diff(sum(de2bi(+_)))%RRPPPVVVW?????????________
Nie mogę dodać łącza TIO, ponieważ żaden z tłumaczy internetowych nie wdrożył niezbędnego zestawu narzędzi komunikacji de2bi
. Zmiana go na dec2bin
zamiast tego kosztowałaby 4 bajty (2 dla działającego kodu i dwa no-ops).
Nie znalazłem sposobu na uniknięcie żadnego z 27 zakazów. Wszystkie nazwy funkcji i nawiasy znajdują się między 64 lub powyżej 96, co oznacza, że wszystkie „niezbędne” znaki mają 1 na 6. pozycji (od prawej 2 ^ 5). Miałem rozwiązanie z 23 brakami operacji, ale sam kod był dłuższy. Rzeczywisty kod ma 25 bajtów i ma następującą sumę kolumny przy zliczaniu bitów binarnego odpowiednika:
15 22 6 15 10 9 13
22 bity znajdują się na 6. pozycji z prawej strony (2 ^ 5), a tylko 6 bitów na 4. pozycji z prawej strony (2 ^ 3). Oznacza to, że musimy dodać co najmniej 16 bajtów, aby uzyskać liczbę 6 do 22. Teraz znak komentarza %
dodaje nieco do 6. pozycji, zwiększając ją do 23. Wszystkie drukowane znaki ASCII potrzebują co najmniej jednego z dwóch najlepsze bity 1
. Dlatego dodanie 17 bajtów da nam co najmniej 27 bitów w każdym z dwóch „górnych punktów” (2 ^ 6 i 2 ^ 5). Teraz mamy 27 bitów w dwóch najwyższych punktach, a 22 w pozostałych. Aby osiągnąć równowagę, musimy dodać 10 bajtów, aby uzyskać nawet 32 bity w każdej pozycji.
Objaśnienie nowego kodu (52 bajty):
@(_)~diff(sum(de2bi(+_)))
@(_) % An anonymous function that take a variable _ as input
% We use underscore, instead of a character, since it has the
% most suitable binary represetation
de2bi(+_) % Convert the input string to a binary matrix
sum(de2bi(+_)) % Take the sum of each column
diff(sum(de2bi(+_))) % And calculate the difference between each sum
~diff(sum(de2bi(+_))) % Negate the result, meaning 0 becomes true,
% and everything else becomes false
Wektor zawierający tylko 1s (prawda) jest oceniany na true w oktawie, a wektor zawierający co najmniej jedno zero jest oceniany na fałsz w oktawie.
Wyjaśnienie starego kodu (53 bajty):
@(_)!((_=sum(de2bi(+_)))-_(1))%RRRFVVVVVVVVV_____????
@(_) % An anonymous function that take a variable _ as input
% We use underscore, instead of a character, since it has the
% most suitable binary represetation
! % Negate the result, meaning 0 becomes true, and everything else becomes false
de2bi(+_) % Convert the input string to a binary matrix
sum(de2bi(+_)) % Take the sum of each column
(_=sum(de2bi(+_))) % Assign the result to a new variable, also called _
% It's not a problem that we use the same variable name, due
% to the order of evaluation
((_=sum(de2bi(+_)))-_(1)) % Subtract the first element of the new variable _
% If all elements of the new variable _ are identical, then this
% should give us a vector containing only zeros,
% otherwise, at least one element should be non-zero
!((_=sum(de2bi(+_)))-_(1)) % And finally, we negate this.
Wektor zawierający tylko 1s (prawda) jest oceniany na true w oktawie, a wektor zawierający co najmniej jedno zero jest oceniany na fałsz w oktawie.