Twoim zadaniem jest zbudowanie programu (wykorzystującego tylko drukowane znaki ASCII i / lub tabulatory i znaki nowej linii), który wypisze dokładnie znaki w drukowanej przestrzeni ASCII ( 0x20
do 0x7e
), które nie pojawiają się w kodzie źródłowym programu (jednak w dowolnej kolejności wiele razy).
Wygrywa najkrótszy kod do wykonania tego w dowolnym języku.
code-golf
self-referential
Joe Z.
źródło
źródło
0x20
do0x7e
, które są określane jako „znaków ASCII”. Technicznie zakładki i znaki nowej linii są w rzeczywistości znakami kontrolnymi.Odpowiedzi:
GolfScript,
1512 znakówNa podstawie odpowiedzi Jana Dvoraka z kilkoma zwrotami akcji, a także w stylu Petera Taylora .
źródło
Polyglot, 95
tclsh
,bash
,sh
,ksh
, etc.)main()
jest potrzebne. Dzięki urogenowiNic nie robi.
źródło
#undef X;whatever junk you want
działa.#
do komentarzy takich jak Ruby i Perl)PHP 5.2, 4
Zapisz jako plik wywołany
NYUIOMK()'DEAQRWVX[Z]\^@CBGFJqwv{z}|~`bgfkj203547698;=>!#"%$&+*-.php
gdzieś w/home
.short_open_tag
musi byćOn
w twoimphp.ini
.Dane wyjściowe to:
źródło
:
sygnał wyjściowy.JavaScript - 88
drukuje „bcdfghijkmnpquvxyz”
źródło
"!#$%&*+,-13:<=>?@[\]^_`{|}~AERTOWS";alert('BCDFGHIJKMNPQUVXYZ'.toLowerCase()+95*72)
ponieważ95*72
=6840
i przeniesienie zmarnowanych znaków do łańcucha pozwala na użycie cudzysłowów zamiast marnowania ich. Poza tym ukrywanie postaci w komentarzu jest tandetne.Biała spacja,
6157 znakówNie jest najkrótszy, ale prawdopodobnie ma najprostszą logikę (tak naprawdę to tylko pętla).
Tutaj jest całkowicie komentowane, gdzie S jest spacją, T jest tabulatorem, L jest przesuwem wiersza:
Dzięki @res za poprawienie powyższego (wymagany dodatkowy duplikat dla instrukcji rozgałęzienia) i mniejsze liczby do wypychania na stos.
źródło
SSSTSSSSSL LSSSL SSSTL TSSS SLS SLS TLSS SSSTTTTTTSL TSST LTTSL LLL
.LSSSL
staje sięLSSL
iLTTSL
staje sięLTTL
) i usuwając wyjście na końcu (trzyLLL
). Wypróbuj online surowe 52 bajty lub tutaj z wyróżnieniem i wyjaśnieniem .C,
837469 znakówNaprawdę próbowałem sprowadzić go poniżej 80 znaków, ale po prostu nie byłem w stanie tego zrobić. W końcu postanowiłem opublikować to, co mam, przy założeniu, że ja (lub ktoś inny) wymyślę rozwiązanie składające się z 79 znaków dziesięć minut po opublikowaniu tego.Okej, to nie było całkiem dziesięć minut, ale w zasadzie działało.Naprawdę chciałem opublikować wersję, która nie musiała zawierać niepotrzebnego miejsca w kodzie źródłowym, ale wylądowała na dziwnej orbicie atraktora, odbijając się między garstką rozwiązań. Po wielu minutach próby wpchnięcia jednego z nich w stabilne rozwiązanie, poddałem się i dodałem przestrzeń.
źródło
Skrypt golfowy,
2624 znakiPobiera skrypt generowania zakresu, duplikuje go, wykonuje go, odejmuje go od wyniku, a następnie odejmuje kod odejmowania wyniku i drugi znak cudzysłowu.
źródło
''+
, usuń program przed odejmowaniem, włóż noop.;
(nie znalazłem lepszego sposobu na zakrycie kropki), użyj bloku kodu zamiast łańcucha ->{126,33>`-.;}.~
16 znakówRyba - 80
Kiedy ryby popełniają błąd, drukuje „coś pachnie podejrzanie ...”. Ponieważ z jest złą instrukcją, od razu popełnia błąd
źródło
Wiem, że nie wygrywa żadnych konkursów. Chciałem tylko spróbować w języku, który nie jest zwykle używany, tylko do kopnięć.
Java -
209195152140 znakówZ podziałami i tabulatorami
Uwaga, jeśli wykonasz: program się nie kończy. Ha ha
Wyjaśnienie
for(char c=0;;c++)
: Ponieważ achar
można traktować jakoint
, używam tego na moją korzyść tutaj, aby zwiększyć wszystkie możliwe wartościc
. Pomijam warunek zakończenia w pętli (ten, który przechodzi między dwoma średnikami), aby zaoszczędzić na znakach, ponieważ nie określono, że program musi się zakończyć. :)"publicas{tvodmn(Srg[])h=0;w+ye.\"\\xO<?:} ".indexOf(c)<0?c:""
: Niestety, nie jest to bardzo eleganckie podejście, ale wykonuje zadanie. Ręcznie wypisz każdy znak obecny w kodzie źródłowym jakoString
literał, a następnie sprawdź, czychar c
występuje w nim prądindexOf()
. JeśliindexOf()
połączenie zostanie zwrócone-1
, nie istnieje i dlatego powinniśmy je wydrukować. Reszta po prostu używa potrójnego operatora, aby zaoszczędzić na postaciach i przestrzeni.źródło
Perl, 49 znaków
To interesujące wyzwanie - to rodzaj anty-quine, a ja udało mi się kilka razy skrócić program, zwiększając zakres pojawiających się w nim postaci.
źródło
Ruby,
817868666257Po prostu się sprawdza. Zduplikowane znaki zostały ręcznie usunięte.
Dzięki Josh za uratowanie 4 znaków i minitech za uratowanie 5 znaków!
źródło
(?!..?~).map{|x|$><<x if/[()ifmap{}|x?!.~\/\\\[\]$><]/!~x}
(?!..?~).map{|a|$><<a if/[()ifmap{}|?!.~\/\\\[\]$><]/!~a}
$><<((32..126).map(&:chr)-IO.read(__FILE__).chars).join
55 bajtów przy użyciu innego podejścia.Befunge (48)
Wyjścia: {zyxwvutsrqponmlkjihgfedcba` _ ^] [ZYXWVUTSRQPONMLKJIHGFEDCBA240
źródło
Niezbyt poważnie, ale musiałem spróbować:
JSFuck (138152)
(tutaj skompilowane źródło)
Pierwotnym źródłem:
Wyświetla wszystkie znaki oprócz () + []!
źródło
(x)
<=>[x][+[]]
, zwiększa rozmiar kodu, ale zmniejsza potrzebny alfabet.Rany, utrudniłeś APL (czy to delikatesy?)
Więc postanawiam zignorować wszystkie zasady !!!
APL (Dyalog),
310Drukuje wektor atomowy (który zawiera wszystkie drukowalne znaki ASCII)
Okazuje się, że zupełnie zapomniałem o części „bez” ...
Ale to łatwa naprawa
~'AV'''
oznacza wyklucz (~
) znaki A, V i pojedynczy cudzysłów (oznaczone jako podwójne pojedyncze cudzysłowy)Jeśli chodzi o drukowanie spoza ASCII, cóż, ignoruję wszystkie reguły.
źródło
0x20
do0x7e
), które nie pojawiają się w kodzie źródłowym twojego programu”. Uważam, że dane wyjściowe mogą nie zawierać znaków poza drukowalną przestrzenią ASCII („dokładnie” to słowo kluczowe) , a Twój program zawiera litery „A” i „V”, więc nie należy ich drukować.~
do zestawu wykluczonych znaków. ;-) Btw, podobne rozwiązanie J byłobya.-.'a.-'''
GolfScript (
1816 znaków)Demo online z dodatkową linią, która sprawdza poprawność i wyświetla liczbę błędnych znaków.
(Mam różne równoważne alternatywy.
@`^
Można je zastąpić\\`
;#
można je zastąpić przez`
lub]
. Odpowiednią kombinację można zastosować z lewą Howarda, aby zrównać się z jego wynikiem 15, ponieważ odwrotne ukośniki nie muszą uciekać w bloki, tak jak robią to w literałach łańcuchowych:{),\`^32>].~}.~
Ale Howard zasługuje na uznanie za tę sztuczkę).źródło
}~
- jeszcze lepiej dla bloków kodu, zobacz moją nową odpowiedź ;-)Brainfuck, 173
Dość długo, mogę spróbować ponownie później.
źródło
J (
5240)Edycja: Duh, zapomniałem o
e.
Stara wersja:
Inny wariant (ta sama długość, ale mniejsza wydajność):
źródło
Python 3 -
6861... dzięki @WolframH za ulepszenia.
exec(x)
w nowej linii i zapisać;
inx
. Ponadto w Pythonie 3 można używaćx=r"print(*set(map(chr,range(32,127)))-set(x+'=\"'))"\nexec(x)
61 znaków (drukuje wiele spacji, co jest dozwolone).PowerShell: 96
Należy zapisać i uruchomić jako skrypt.
diff
jest wbudowanym aliasem dlaCompare-Object
.gc
jest wbudowanym aliasem dlaGet-Content
.$MyInvocation.InvocationName
pobiera pełną ścieżkę do wykonywanego skryptu.32..126
jest dziesiętnym odpowiednikiem dla0x20..0x7e
, a zatem tworzy tablicę dziesiętnych kodów ASCII, których szukamy.[char[]]
pobiera zawartość następnego obiektu i umieszcza je w tablicy, dzieląc je i przekształcając na znaki ASCII. Mamy więc teraz dwie tablice znaków ASCII - jedną z tego skryptu, drugą zdefiniowaną przez kryteria wyzwania.-Pa
zestawyCompare-Object
na format „Passthru”, więc na konsoli są wyprowadzane tylko te elementy, które znajdują się w różnych wejściach - wskaźniki, w których elementach znajdowały się dane wejściowe, które są nadal przechowywane w danych obiektu, ale nie są wyświetlane.|?{$_.SideIndicator-eq'=>'}
potokCompare-Object
wyjściowy doWhere-Object
, który filtruje go tylko do elementów, które są wyłączne dla drugiego wejścia.źródło
PHP - 92
Wynik:
nic
OP prosi o wydrukowanie wszystkich nieużywanych znaków, po prostu używam ich wszystkich
źródło
<?='A"$%&\'()*+[,.]/0123456789:=-@ABCDEFGHIJKLMNOPQRSTUVWYZ\^_`abcdefghijklmopqrstuvwxyz{|}~#'
?!;>Xn
JavaScript, 92
źródło
źródło
Java - 126 znaków
zminimalizowane:
niezminimalizowane:
Jest to interesujący problem, ponieważ poszczególne tokeny mogą skorzystać z ich dłuższej formy, ponieważ ponownie wykorzystuje znaki. Na przykład normalnie
String[]
byłby krótszy, aleString...
eliminuje potrzebę nawiasów kwadratowych w ciągu warunkowym.Znalazłem sztuczkę polegającą na próbie użycia znaków na początku i na końcu zakresu, aby można było wykluczyć je z wyjścia, zmieniając początek i koniec pętli.
W Javie kluczowym znakiem, który należy wykluczyć, jest to
"
, że posiadanie go w ciągu wymaga ucieczki, co dodaje\
do twojego programu, który musi iść w ciągu, który dodaje\\
. Usuwając"
z ciągu warunkowego, usuwasz 4 znaki. Można to osiągnąć poprzez zapewnienie korzystaniai
!
i rozpoczęcie od pętli#
.Wszystkie małe litery pojawiają się pod koniec zakresie, a tylko
{
,|
,}
a~
idzie za nimi. Ze względu na gadatliwość Javy większość małych liter jest używana tylko na płycie głównej. Podobnie{
i}
są trywialne dla programu Java, ponieważ wymaga ich płyta podstawowa.|
może być użyty, jeśli masz warunek lub warunek, ale nie mogłem znaleźć sposobu, aby skorzystać z takiego, który prowadzi do krótszego programu, niż użycie go|
jako operatora bitowego. To|0
sprawia, że czuję się trochę brudny, ponieważ jest to jedyna część, która polega na tym, aby wprowadzić tam postać.~0
plony-1
, co jest przydatne, ponieważ to właśnie musimy sprawdzićindexOf
. Połączenie tego z użyciem!=
warunkowej pętli<
całkowicie eliminuje znak, co oznacza, że nie musi on wchodzić do ciągu warunkowego.źródło
sh (47)
Stosuje podejście autoreferencyjne. Zakłada,
/dev/urandom
że ostatecznie wyda co oktet co najmniej raz. Nie kończy się.Jeśli założymy, że
man
jest zainstalowany, moglibyśmy zamiast tego skorzystać ze stronyascii(7)
man (a tym samym mieć program kończący) ( 44 znaki, dzięki @fennec).źródło
man
izsh
są zainstalowane,man zshall
wydaje się spełniać kryteria. Mógłbym dodać to jako odmianę.man ascii
myślę, że mógłbym uratować ci kolejny list.tr
używasz? GNUtr
traktuje znak-
„cat $0
” jako operator zakresu, który przerywa wyjście.ascii
program jest zainstalowany, możesz użyć tego zamiastman ascii
.BitShift , 1038 bajtów
BitShift to język, który obsługuje tylko
0
i1
jako składnia. Pomyślałem, że wydrukowanie wszystkich innych znaków będzie łatwe, ale ponieważ tak naprawdę nie obsługuje zapętlania, nadal skończył z ogromnymi 1038 bajtami.Uważam jednak, że tak naprawdę nie jest możliwe pójście mniejszym niż to ..
Wydruki
Wypróbuj tutaj
źródło
Zdecydowanie najdłuższe rozwiązanie tutaj, ale kodowanie w Lino jest zawsze zabawne:
L.in.oleum -
655523 znakówBrak komentarzy, po prostu czyta źródło skompilowane do pliku binarnego. Zapisz jako
a.txt
lub nie będzie się kompilować!źródło
Brainfuck,
133123114110 bajtówTrochę więcej majsterkowania przy poprzednim rozwiązaniu (zanim zdałem sobie sprawę, że poniższe jest mniejsze - wszystko to było zanim zrobiłem ciężką optymalizację). Działa to poprzez zapisanie 4 zestawów liczb ascii i wydrukowanie ich przy użyciu skomplikowanej pętli, a następnie dodanie brakujących znaków (tj. Tych, które znajdują się między nieprawidłowymi liczbami ascii).
Oryginalne zgłoszenie
Wykonuje następujące czynności:
źródło
Haskell (70)
Nudne zduplikowane znaki w programie w łańcuchu, odejmij od zestawu uniwersalnego. Daleko od zwycięzcy codegolf, choć jest zaskakująco czytelny ze względu na swoją długość.
(Teraz z odejmowaniem listy zamiast
filter
/notWith
.)źródło
import Data.List
naimport List
runhaskell
: „Nie można znaleźć modułu„ Lista ””. Zauważyłem jednak, że przeliczyłem liczbę znaków, więc poprawiłem to.J - 21
zapisz to do pliku o nazwie
5
w bieżącym katalogu. Następnie load uruchom skrypt za pomocą0!:1<'5'
Lub 25 bez sztuczki z plikami:
źródło
'
, który nie jest usuwany z wyniku.Clojure (
142, 106, 103)sformatowany:
Pomyśl, że to robi, może potrzebować drobnych poprawek. wynik:
uruchamia na sobie ciąg znaków, który jest ewaluowalnym kodem clojure. Łańcuch ma na końcu kilka komentarzy, dzięki którym znaki używane poza łańcuchem (metoda główna itp.)
źródło
Python 2, 69
Używam najdłuższej (jaką jestem w stanie znaleźć) sekwencji ciągłych znaków, którą mogę wydrukować i dodać pozostałe jako komentarz po kodzie.
źródło