Ottava, 53 52 byte
Fare una riscrittura completa mi ha aiutato a golfare il codice 5 byte, ma ho dovuto aggiungere più no-op, rendendolo un risparmio netto di solo 1 byte.
@(_)~diff(sum(de2bi(+_)))%RRPPPVVVW?????????________
Non riesco ad aggiungere un collegamento TIO, poiché nessuno degli interpreti online ha implementato la cassetta degli strumenti di comunicazione necessaria per de2bi
. Modificandolo indec2bin
invece costerebbe 4 byte (2 per il codice funzionante e due no-ops).
Non ho trovato alcun modo per evitare nessuna delle 27 operazioni vietate. Tutti i nomi delle funzioni e le parentesi sono tra 64 o inferiori a 96, il che significa che tutti i caratteri "necessari" hanno un 1 nella sesta posizione (da destra, 2 ^ 5). Avevo una soluzione con solo 23 no-op, ma il codice stesso era più lungo. Il codice effettivo è di 25 byte e ha la seguente somma di colonne quando si contano i bit dell'equivalente binario:
15 22 6 15 10 9 13
Vi sono 22 bit nella 6a posizione da destra (2 ^ 5) e solo 6 bit nella 4a posizione da destra (2 ^ 3). Ciò significa che dobbiamo aggiungere almeno 16 byte, per ottenere i 6 fino a 22. Ora, il carattere di commento %
aggiunge un po 'alla sesta posizione, aumentandolo a 23. Tutti i caratteri ASCII stampabili richiedono almeno uno dei due i migliori pezzi da essere 1
. Pertanto, l'aggiunta di 17 byte ci darà almeno 27 bit in ciascuno dei due "primi posti" (2 ^ 6 e 2 ^ 5). Ora, abbiamo 27 bit nei primi due punti e 22 nel resto. Per raggiungere un equilibrio, dobbiamo aggiungere 10 byte, per arrivare anche a 32 bit in ciascuna posizione.
Una spiegazione del nuovo codice (52 byte):
@(_)~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
Un vettore contenente solo 1s (vero) viene valutato come vero in Ottava e un vettore contenente almeno uno zero viene valutato come falso in Ottava.
Una spiegazione del vecchio codice (53 byte):
@(_)!((_=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.
Un vettore contenente solo 1s (vero) viene valutato come vero in Ottava e un vettore contenente almeno uno zero viene valutato come falso in Ottava.