Napisz program lub funkcję, która po podaniu łańcucha odfiltruje tyle różnych bajtów, ile może i zwróci oczyszczony ciąg. Ponieważ jednak Twój program ich nienawidzi, żaden z tych bajtów nie może być obecny we własnym kodzie.
Twój wynik będzie liczbą różnych bajtów, które Twój program odfiltrowuje z danych wejściowych, im wyższa, tym lepiej. Jest to maksymalny wynik 255 (ponieważ twój program musi mieć minimum jeden bajt). Element rozstrzygający to długość kodu, przy czym im mniejsza, tym lepiej.
Na przykład, jeśli twój program odfiltruje bajty 0123456789
, otrzyma wynik 10, ale twój program nie może zawierać tych bajtów.
Zasady
- Bajty oznaczają oktety.
- Możesz również wziąć dane wejściowe jako listę liczb całkowitych o wartościach od 0 do 255. Odpowiadają one równoważnym bajtom.
- Dane wyjściowe powinny mieć taką samą formę jak dane wejściowe
- Brak odczytu kodu źródłowego
- Twój kod musi być niepusty
- Tak, wiem, że będzie odpowiedź Lenguage / Unary. Ale przynajmniej golf, proszę?
;)
Edytuj regułę:
- Możesz zignorować bajt, na przykład jeśli nie można go odróżnić od bajtu kończącego dla łańcucha lub EOF. Oznacza to jednak, że nie możesz użyć go w swoim zgłoszeniu, ani nie ma to znaczenia dla twojego wyniku. Jeśli zdecydujesz się to zrobić, twój maksymalny wynik wyniesie 254, ale nie musisz obsługiwać tego bajtu wpisanego.
Odpowiedzi:
Japt
-P
, wynik: 255 (2 bajty)f => filter, second f => everything but 'f'
Wypróbuj online!
Japt , wynik: 255 (2 bajty)
Od @Shaggy
o => remove everything but, second o => 'o'
Wypróbuj online!
źródło
oo
działałby również bez-P
flagi.Python 2 , wynik 249,1732 bajtów
Wypróbuj online!
Usuwa wszystko oprócz
exc%="
i nowych linii. Generowanie kodu należy do xsot . Wątpię, czy jest zoptymalizowany, więc jest tu wiele bajtów do zapisania!źródło
Haskell, wynik
249250,1088335 bajtówDefiniuje funkcję,
!:
która pobiera listę liczb całkowitych i odfiltrowuje wszystkie oprócz10,33,40,41,58,61
kodów ASCII z\n ! ( ) : =
.Wypróbuj online!
Jak to działa: Najpierw zmieńmy nazwy funkcji i parametrów na rozsądne nazwy:
Główną ideą jest posiadanie listy dwóch różnych funkcji (
listOfFunctions
), jednej do zachowania elementu (k
), a drugiej do upuszczenia (d
). Lista jest indeksowana przez bieżący element z listy danych wejściowych (x
), a funkcja, którą wybiera, określa, czy należy zachować, czy upuścić element. Pod indeksem 0 mamyd
, ponieważ chcemy zrzucić 0, pierwszyk
ma indeks 10, ponieważ chcemy zachować 10s (nowe linie). Zarównok
id
wziąć dwa parametry:x
a wynik rekurencyjnego wywołania z resztą listy (xs
).k
poprzedzax
na wezwanie recursice id
po prostu zwraca wywołanie rekurencyjne.Dosłowna lista funkcji kończy się na indeksie 61 (char
=
, ostatnik
na liście), po której następuje nieskończona liczbad
. To nie tylko oszczędza wiele jawnychd
, ale także zapobiega nam kończeniu skończonej listy,[]
która wymagałaby dodatkowych znaków.Edycja: dzięki @ Ørjan Johansen za wynik +1 i -753 bajty.
źródło
|
za wynik 250 335 bajtów . Zdefiniowano również synonimrepeat (!)
skracania listy (drastycznie, ponieważ|
był znacznie większy niż druga co do wielkości wykluczona postać.(!):
prawdopodobnie pomocne byłoby również skrócenie niektórych z tych długich sekwencji.!():=
. Wyodrębnianie[]
z istniejącej listy, np. Listy wejściowej, nie będzie działać, ponieważ ma typ[Int]
, ale potrzebujemy[a->[a]->[a]]
.!
jestcurry snd
i=!
jest nieskończoną ich listą, ale to wszystko, co mogę z tego zrozumieć.(=!)
, coś(!=)(=:)=(!):(!):(!):(!):(!):(=:)
lub (wysokiego poziomu, może być przekazywana((!):)
lub jej części sobie)(!)!=(=:)=(!)((!)((!)((!)(=:))))
. Wiele opcji do ulepszenia. Liczba powtórzeń, jaki rodzaj drugiego (a nawet trzeciego) argumentu, jeśli taki istnieje, a nawet jeśli jest bardziej optymalny do użycia z kompresją\n
lub;
(długości bloków10 22 6 16 2
vs.33 6 16 1
).JavaScript (ES6), wynik: 242 (142 bajty)
Raczej naiwne podejście wykorzystujące tablicę bajtów dla operacji we / wy.
Wypróbuj online!
W jaki sposób?
14 znaków, które nie są filtrowane, to
'().=>[]efilrt
. Są one oznaczonee
łańcuchem wyszukiwania. Dla znaków powyżejt
(kod ASCII 116), które nie są zdefiniowane w tym ciągu,'f'>undefined
jest fałszem .źródło
t=>t.filter(t=>'f'>'fffffffffffffffffffffffffffffffffffffffeeeffffeffffffffffffffeeffffffffffffffffffffffffffffefefffffffeeffeffefffffefe'[t])
. Oto oświadczenie testowe TIO:console.log(f([...Array(256).keys()]).map(c => String.fromCharCode(c)))
APL (Dyalog Unicode) , wynik: 253, remis: 8 bajtów SBCS
Anonimowa ukryta funkcja prefiksu
Wypróbuj online!
∩
przecięcie argumentu∘
i'∩∘'''
trzy znaki w kodzie (∩∘'
)źródło
Powłoka POSIX , wynik 249,18 bajtów
Wypróbuj online!
Proste
tr
polecenie, które usuwa wszystkie znaki oprócz-\cdrt
spacji. Potrzebne są cztery odwrotne ukośniki, ponieważ zarówno powłoka, jak itr
polecenie używają znaków ucieczki odwrotnego ukośnika. Piąty ukośnik odwraca następujący znak spacji.Gdyby
tr -cd
był uważany za język programowania, można napisać jednobajtowy program z wynikiem 255.źródło
tr
ma klasy znaków używane w wyrażeniach regularnych, ale nie ma pełnych wyrażeń regularnych.tr -cd \ cdrt\\-\
Wypróbuj online!C (gcc) , wynik
232235239241242,260407352249243249 bajtówWypróbuj online!
Funkcja przenosząca wskaźnik na początek i koniec tablicy int (gdzie koniec nie zawiera pierwszego znaku), wskaźnik na bufor i wskaźnik na inny wskaźnik int. Zapisuje wynik w buforze, a wskaźnik końcowy wyniku w ostatnim wskaźniku.
źródło
Regex, wynik: 255, 2 bajty
Pasuje do postaci
\
.Wypróbuj online!
źródło
Galaretka , wynik 254 (4 bajty)
Wypróbuj online!
⁾xy
jest skrótem od“xy”
(ciąg dwóch znaków).Mamy
f
ILTER ciąg wejściowy w dół do tylko znaki występujące w“f⁾”
.źródło
f⁾⁾f
ale postanowiłem zadać pytanie dotyczące pobierania ciągów Unicode przed wysłaniem.Ruby- p, wynik 248 (8 unikalnych bajtów / 483 bajtów)
Wypróbuj online!
źródło
Python 2 , wynik
244245246,133901575 bajtówPobiera listę liczb całkowitych
Wypróbuj online!
Wynika to z następującego wiersza kodu:
Ta odpowiedź jest oczywiście teoretyczna. Struktura jest
Teoretycznie działałoby to tak samo jak:
Python 3 , wynik
240241,54 bajtów+1 dzięki Jonathanowi Allanowi .
Wypróbuj online!
źródło
\
w swojej wersji Py 3, używając potrójnych cytatówb''' ':[]abdfilmnor'''
. W Pythonie 2 możesz zrobić pełny program w tym samym stylu dla 242:print(''.join(p for p in input() if p in ''' '().fijnoprtu'''))
chociaż nie tak dobry jakexec
.Wyczyść , zdobądź 247,
234213208 bajtów-5 bajtów dzięki Ørjan Johansen
Wypróbuj online!
Używa funkcji rekurencyjnej dopasowującej wzór do usuwania znaków. Nawet nie potrzebuje
StdEnv
.źródło
=\
zamiast===
.t
itt
na przedostatnim wierszu.==
nat
ale utrzymanie==
jako synonim dla niego.Perl 5
-p
, wynik 251,13 bajtówWypróbuj online!
źródło
05AB1E , wynik:
252253 (wykorzystano43 odrębne bajty ; łącznie 8 bajtów )Wypróbuj online.
Wyjaśnienie:
Zwróć uwagę, że kolejność
ÃJ
i„J
w 2-znakowych ciągach znaków jest ważna, ponieważ„
jest również używana w słowach słownikowych , w których co dwa znaki są słowami słownikowymi (z wyjątkiem kilku wybranych znaków, takich jak litery, cyfry itp-
.). Więc„JÃ
byłoby „Słowo”J
, a także słownikiem słowoÃ
+ następny znak (w tym przypadku„
), który podobno jest słowo"causing"
.źródło
Perl 5, wynik 251 (5 różnych bajtów, łącznie 8058 bajtów)
Wypróbuj online!
Wykorzystuje
<>^es
podzbiór Turinga Perla . Powyższy kod został uzyskany poprzez uruchomienieprint<>=~y<<>^es><>cdr
przez mojego konwertera .źródło
Brachylog , wynik 249,16 bajtów
Wypróbuj online!
Nie jestem do końca pewien, jak to działa z regułami, co w przypadku Brachylog ma swoją własną specjalną stronę kodową , ale wciąż mogę wyjaśnić, jak to działa:
źródło
Oktawa , wynik
248249 (50 bajtów)Tam miał być lepszy sposób ... i nie ma!
Wypróbuj online!
Filtruje wszystko oprócz
@al()'=
.all
Funkcją jest lepsze sięany
, ponieważ wykorzystywane są tylko dwie odrębne bajtów. Zauważ, żeany(...)
jest równanot(all(not(...)))
. Zaczynamy od programuZamiast
~
(not
) możemy również pisać0==
. Oczywiście oznaczałoby to również konieczność odfiltrowania0
. Zamiast tego należy zauważyć, że poniższe wyrażenie jest również fałszywe (zero)Jeśli kompatybilność MATLAB nie stanowi problemu, mogę przejść do 47 bajtów
źródło
Lenguage (z
stty +brkint -ignbrk
), wynik 255, 3890951 bajtówProgram składa się z 3890951 bajtów NUL (co czyni ten jeden z najkrótszych programów Lenguage w historii; 3890951 bajtów jest wystarczająco mały, aby zmieścił się na moim dysku, więc uruchomiłem go w interpreterze Lenguage). OP chciał, aby rozwiązanie Lenguage / Unary zostało zagrane w golfa, więc proszę bardzo. (Zauważ, że Unary byłby znacznie dłuższy, ponieważ wymaga użycia
0
zamiast NUL.)Zauważ, że Lenguage, pomimo tego, co sugeruje jego dokumentacja, nie działa jak pieprzenie mózgu; I / O działa zupełnie inaczej (coś, co zauważyłem podczas testowania tego programu). W szczególności Lenguage odmawia pobierania danych wejściowych z niczego innego niż terminal, więc bajty, które są filtrowane, są nieprzetworzonymi bajtami wysyłanymi przez połączenie terminalowe (zwróć również uwagę, że filtrując nieprzetworzone bajty, nie zobaczysz klucze, które w ogóle wpisujesz). W praktyce oznacza to, że program będzie wchłaniał wszelkiego rodzaju dane wejściowe wysyłane do niego, z wyjątkiem bajtu NUL (zwykle wpisywanego jako Ctrl-@), który będzie dosłownie powtarzany (w tym momencie zdecydowana większość terminali go zignoruje, ponieważ bajt NUL jest końcowym odpowiednikiem instrukcji NOP). Aby sprawdzić, czy program działa, „
Co dzieje się w EOF? Cóż, jeśli terminal wysyła serię bajtów, nie ma możliwości wysłania EOF; wszystkie 256 możliwych bajtów jest interpretowanych dosłownie i nic więcej nie można wstawić do strumienia terminali. Jeśli jednak używasz starego terminala szeregowego, możesz nacisnąć przycisk „przerwa” na terminalu, aby celowo wysłać błędnie zakodowane dane, co pozwala uzyskać 257-ty możliwy kod; ta „przerwa” jest jedynym możliwym odpowiednikiem EOF, ponieważ jest wysyłany poza pasmem i wskazuje na coś innego niż ważne dane. Jeśli twoja konfiguracja terminala ma ustawioną flagę „przerwać przy zerwaniu” (a interpreter Lenguage nie zmienia, o ile wiem, tego ustawienia), wysłanie sygnału przerwania spowoduje awarię interpretera Lenguage, który dogodnie działa jako sposób na wdrożenie pożądanego zachowania EOF. Nie jestem pewien, czy jest to ustawienie domyślne (ponieważ nikt tak naprawdę nie używa terminali szeregowych, w zasadzie nigdy się nie pojawia), więc wspomniałem o tym w nagłówku jako część specyfikacji używanego interpretera języka.
Wyjaśnienie
Wewnętrzna pętla zakończy się dopiero po wpisaniu NUL na terminalu; potem natychmiast echo wpisanego znaku (tj. NUL). Dodanie 1 w tym punkcie sprawi, że element taśmy 0 będzie ponownie niezerowy, więc zewnętrzna pętla nie będzie w ogóle mogła wyjść (dopóki wejście przerwania nie spowoduje awarii interpretera), i wrócimy do wewnętrznej pętli.
Najbardziej golfowym jest użycie odejmowania, aby wejść do zewnętrznej pętli, ale dodanie, aby kontynuować pętlę wokół niej; dodawanie ma krótsze kodowanie, ale nie może pojawić się na początku programu (ponieważ kodowanie wyglądałoby jak zera na początku i dlatego zostanie zignorowane).
źródło
truncate
nie tworzy dla mnie rzadkich plików (może system plików ich nie obsługuje?). Jednak, o ile mogę stwierdzić, referencyjny interpreter Lenguage odczytuje plik wejściowy po linii (!), Więc jeśli program nie zawiera znaków nowego wiersza, wystarczająco długi program skończy się wyczerpaniem dostępnej pamięci. Oczywiście można to naprawić za pomocą nowego tłumacza.C # (interaktywny kompilator Visual C #) , wynik 245, 111 bajtów
Wypróbuj online!
C # (interaktywny kompilator Visual C #) , wynik 243, 33 bajtów
Naiwne rozwiązanie przy użyciu
Intersect
Wypróbuj online!
źródło
Siatkówka 0.8.2 , 12 bajtów, wynik: 250
Wypróbuj online! Odfiltrowuje wszystkie znaki z wyjątkiem nowej linii,
[
,\
,]
,^
in
. Chociaż postacie[\]^
są z rzędu, użycie zakresu faktycznie kosztowałoby bajt, a także obniżyłoby mój wynik.źródło
Japt , 249 punktów, 20 bajtów
Wypróbuj online!
źródło
oQ+"+oQ"Q
lub po prostu,oo
ale to tylko zmiana rozwiązania Luisa.Ruby
-paF[^$_=F*']
, zdobądź 250, 8 bajtówNie jestem wcale pewien, czy jest to zgodne z obowiązującymi zasadami witryny dotyczącymi flag wiersza polecenia, ponieważ „flaga” tutaj jest rodzajem przekazywania kodu zawierającego zabronione bajty.
F
Flag definiuje regex separator wejściowy składa się z wszystkich znaków w kodzie nie właściwej. Właściwy kod ustawia dane wyjściowe do konkatenacji wszystkich rekordów wejściowych.źródło
MATL , wynik 252
Wypróbuj online!
Objaśnienie (dla danych wejściowych
input
)źródło
PHP, wynik 234,
5862 bajtówUruchom jako potok z
-nF
lub spróbuj online .źródło
Pyth , zdobądź 249,16 bajtów
Odfiltrowuje każdy znak z wyjątkiem
f
,s
,T
,z
,"
,/
, i\
Wypróbuj online!
źródło
K, wynik 246,23 bajtów
{x@&~x in"\"~ in@&{x}"}
{..} jest lambda z arg x
czytane jako „zwraca x w miejscu gdzie nie x w ciągu”
Ciąg zawiera \ "~ w @ & {x} (dziesięć bajtów używanych w programie)
źródło
sfk , wynik 239,133 bajtów
Wypróbuj online!
Wykonuje zamiany na wejściu (zapisane jako
[delim][from][delim][to][delim]
), zmieniając wszystkie znaki używane w programie na siebie, co usuwa pozycje znaków z rozważań na temat wprowadzania do ostatecznej zamiany,x[byte]xx
która odwzorowuje wszystkie bajty na pusty ciąg.źródło
JavaScript, wynik 250,
9557359273 bajtówLekko golfowe rozwiązanie JS, które następnie jest uruchamiane przez algorytm JSFuck . Dużo bajtów, ale dobry wynik.
Oryginał:
Renderowanie JSFuck ma 59273 znaków:
źródło
s=>s.replace(/[^![\]+()]/g,'')
powinien działaćpieprzenie mózgu , Wynik: 248, 162 bajtów
Wypróbuj online!
Zwykle nie odpowiadam na własne pytania, ale wydaje się, że ludzie czytali moją drobną stronę, szczególnie tam, gdzie jest napisana
If someone comments on a question "I wish there was a brainfuck solution", I feel obliged to provide one.
Odfiltrowane bajty są
-<>[],.
i ignorują bajt NUL, ponieważ nie można go odróżnić od EOF. Jest to trochę dłużej niż zwykle, ponieważ celowo unikam+
uzyskiwania nieco lepszego wyniku. Mimo to może uda mi się zagrać w część generowania liczb, aby zaoszczędzić kilka bajtów.źródło
Biała spacja , wynik: 253 (użyte 3 różne bajty, łącznie 97 bajtów)
Litery
S
(spacja),T
(tab) iN
(nowa linia) dodane tylko jako wyróżnienia.[..._some_action]
dodano tylko jako wyjaśnienie.Wypróbuj online (tylko z surowymi spacjami, tabulatorami i nowymi wierszami). Fajną zaletą jest to, że mogę użyć tego kodu do przekształcenia podświetlonego kodu powyżej w surowy program Whitespace (co zrobiłem w tym TIO jako przykład), do którego zwykle używam Notepad ++. :)
Wyjaśnienie:
Całkiem prosto. Oto pseudo-kod:
źródło