Mówimy, że ciąg znaków jest niedyskryminujący, jeśli każdy ze znaków ciągu pojawia się tyle samo razy i co najmniej dwa razy.
Przykłady
"aa!1 1 !a !1"
jest zakaz dyskryminacji , ponieważ każdy z bohaterów!
,a
i1
pojawiają się trzy razy."abbaabb"
nie jest niedyskryminujący, ponieważb
pojawia się częściej niża
."abc"
jest również nie bez dyskryminacji , ponieważ bohaterowie nie pojawiają się co najmniej dwa razy.
Zadanie
Napisz niedyskryminujący program lub funkcję, która zwraca prawdziwą wartość, jeśli dany ciąg jest niedyskryminujący , a wartość fałsz w przeciwnym razie.
Oznacza to, że program uruchamiany na własnym kodzie źródłowym powinien zwracać prawdziwą wartość.
Każde przesłanie musi być w stanie obsłużyć niepuste ciągi znaków zawierające drukowalny kod ASCII , a także wszystkie znaki występujące w kodzie źródłowym przesłania.
Przypadki testowe
Prawda:
<your program's source code>
"aaaa"
"aa!1 1 !a !1"
"aabbccddeeffgg"
"1Q!V_fSiA6Bri{|}tkDM]VjNJ=^_4(a&=?5oYa,1wh|R4YKU #9c!#Q T&f`:sm$@Xv-ugW<P)l}WP>F'jl3xmd'9Ie$MN;TrCBC/tZIL*G27byEn.g0kKhbR%>G-.5pHcL0)JZ`s:*[x2Sz68%v^Ho8+[e,{OAqn?3E<OFwX(;@yu]+z7/pdqUD"
Falsy:
"a"
"abbaabb"
"abc"
"bQf6ScA5d:4_aJ)D]2*^Mv(E}Kb7o@]krevW?eT0FW;I|J:ix %9!3Fwm;*UZGH`8tV>gy1xX<S/OA7NtB'}c u'V$L,YlYp{#[..j&gTk8jp-6RlGUL#_<^0CCZKPQfD2%s)he-BMRu1n?qdi/!5q=wn$ora+X,POzzHNh=(4{m`39I|s[+E@&y>"
Odpowiedzi:
Brachylog , 10 bajtów
Wypróbuj online!
Wyjaśnienie
źródło
Java 8,
198192186174168165 165160 bajtów (liczba znaków65)Wypróbuj online.
Kod użyty do weryfikacji występowania znaków , co było moją odpowiedzią na to wyzwanie .
-5 bajtów dzięki @ OlivierGrégoire ponownie, usuwając komentarz i robiąc bałagan. ;)
Stare 168 bajtów (char-count 6) odpowiedź :
Wypróbuj online.
Kod użyty do weryfikacji występowania znaków z wyłączeniem komentarza , co było moją odpowiedzią na to wyzwanie .
-6 bajtów dzięki usunięciu @ OliverGrégoire
<
poprzez zamianę czeków na>
.Objaśnienie podstawowego programu do gry w golfa (98 bajtów):
Wypróbuj online.
Niektóre rzeczy, które zrobiłem, aby zmniejszyć liczbę używanych znaków:
o
,w
,u
,f
,r
, ie
zostali wybrani na celu ponowne wykorzystanie znaków mieliśmy już (ale nie więcej niż 6).2222
jest używany zamiast256
.e>0&u!=e|u<2
aby!(e<2|u==e)|u<2
usunąć 6x&
.f
, i powrót, czy nadal jest 0 w końcu (to oznaczało, że usunąć 6xby
zbyte
obecnie stosowana jest tylkon
doint
6 razy, a nie 8).e<2
iu<2
zmieniono na2>e
i2>u
aby usunąć 6x<
.Co zrobiłem, aby zmniejszyć liczbę znaków od 6 do 5:
int
siębyte
więc ilośćn
stosuje się 4 zamiast 6.x[0]
zamiast nowej zmiennej,f=0
więc zastosowana ilość=
wynosi 5 zamiast 6.2222
na3333
tak, aby2
użyta ilość wynosiła 2 zamiast 6.f
ir
znowu, aby nie były już 6.Co @ OlivierGrégoire zrobił, aby pozbyć się komentarza, a zatem 5x
/
:,i,fe,fi,w;
.s:w:no0r3sswwyyy:
.|2>2
{}
wokół pętli for i ifs oraz dodanie nieużywanego{}
bloku.!
na!!!
.|
na||
.333
aby+333-3|2
pozbyć się pozostałych operatorów arytmetycznych+-|
i2
.!(x[0]>0)
na!!(0>--x[0])
.źródło
<
na>
.Galaretka ,
18161210 bajtówWypróbuj online!
Jak to działa
źródło
Brachylog ,
1412 bajtówWypróbuj online!
Wyjaśnienie
Alternatywne 12-bajtowe rozwiązanie, które ponownie wykorzystuje
t
zamiastᵐ
:źródło
T-SQL, 320 bajtów (32 znaki x 10 każdy)
Dane wejściowe pochodzą z istniejącej tabeli
FILL
z polem varcharSTEW
, zgodnie z naszymi standardami IO .Nigdy nie byłem bardziej zadowolony, ale przerażony kawałkiem kodu.
Musi być uruchomiony na serwerze lub bazie danych z sortowaniem uwzględniającym wielkość liter. Istnieje 10 z 32 różnych znaków, w tym wielkie i małe litery
E
(polecenia SQL nie rozróżniają małych i wielkich liter, więc w razie potrzeby odwrócono kilka znaków), spacje i tabulatory (tabulatory pokazane są w postaci podziału linii w powyższym kodzie, dla czytelności).Znalazłem sposoby na umieszczenie 10 innych symboli
+ = ,
w kodzie, ale niestety nie mogłem tego zrobić<
, więc musiałem dodać znak komentarza-
.Oto sformatowany kod, zanim wcisnąłem wszystkie dodatkowe wypełniacze:
Górny wiersz to rekurencyjna CTE, która generuje tablicę liczb
b
, którą łączymy ze łańcuchem źródłowym w celu oddzielenia według znaków. Te znaki są pogrupowane i zliczone, aIIF
instrukcja zwraca 0 lub 1 w zależności od tego, czy łańcuch wejściowy jest niedyskryminujący.źródło
C (gcc) ,
333168 bajtówDzięki @Kevin Cruijssen za uratowanie 9 bajtów i dzięki @Laikoni za uratowanie 45 bajtów!
Wypróbuj online!
C, 333 bajty
Nawet liczba bajtów jest niedyskryminująca!
Wypróbuj online!
źródło
128
do222
tak8
można usunąć.i
,v
,S
,s
iL
na znaki, które już pojawiają się słowa kluczowechar
,for
areturn
: try it on-line!05AB1E ,
20181614 bajtówWypróbuj online!
Program jest zasadniczo podzielony na 2 części, w których celem pierwszej części jest wykonanie rzeczywistego zadania, a celem drugiej części jest wykorzystanie tych samych funkcji, co pierwsza część bez zmiany wyniku.
Wyjaśnienie (pierwsza część)
Wyjaśnienie (druga część)
źródło
{γ€gDË*P≠qq{γ€gDË*P≠
to kolejny za 20;).¢
... dobry pomysł człowieku, również cieszę się, że≠
był tak przydatny, jak myślałem, że może być haha!Łuska , 14 bajtów
Wypróbuj online!
Wyjaśnienie
Dwie krótkie linie to brak operacji, ponieważ główna funkcja nigdy ich nie wywołuje.
źródło
m
występuje również dwukrotnie: w pierwszym wierszu i w drugim wierszu. Wyjaśnienie nie obejmuje dwóch krótkich linii, ponieważ nie wpływają one na zachowanie programu.Python 2 ,
7569 bajtówWyjście następuje przez obecność lub brak błędu. Błąd jest albo ValueError (jeden lub więcej znaków wystąpić tylko raz) lub NameError (liczy się charakter są nierówne).
Wypróbuj online!
źródło
{{e.dil:-tu,r.dil:-tu,}}
Dobry Boże, co to jest?a
i wszystko się zepsuło. Czy mógłbyś wyjaśnić dalej?or
. Dodam wyjaśnienie, gdy jestem przy komputerze.Brachylog v2, 8 bajtów (w zestawie znaków Brachylog)
Wypróbuj online!
Wygląda na to, że w Brachylog toczyła się wojna w golfa, więc pomyślałem, że przyłączę się, oszczędzając kilka bajtów na następnej najlepszej odpowiedzi.
Jest to pełny program, który przyjmuje dane wejściowe jako listę kodów znaków. (Jest tak częściowo dlatego, że Brachylog wydaje się mieć bardzo dziwne błędy związane z odwrotnymi ukośnikami w ciągach, a częściowo dlatego, że
\
polecenie nie działa na listach ciągów.)Wyjaśnienie
koḅ
Na końcu nie ma znaczenia;k
zawsze będzie miał element do działaniao
iḅ
nie może zawieść, jeśli otrzyma listę jako dane wejściowe.Powód rozpoczęcia
oḅ
powinien być jasny; dzieli listę wejściową według wartości, np.[1,2,1,2,4,1]
stanie się[[1,1,1],[2,2],[4]]
. Aby każdy znak pojawiał się tyle samo razy, każda z tych list musi mieć tę samą długość, tzn. Wynikowa lista jest prostokątem. Możemy potwierdzić tę prostokątność za pomocą\
, która transponuje również rzędy i kolumny jako efekt uboczny.Mamy teraz bieżącą wartość składającą się z wielu kopii zestawu znaków, np. Gdyby wejściową wartością była
[4,2,1,2,4,1]
bieżąca wartość[[1,2,4],[1,2,4]]
. Jeśli usuniemy kopię, uzyskana macierz będzie nadal prostokątna, więc możemy ją odwrócić za pomocą\
. Jednakże, jeżeli przyczyna matrycę prostokątną, że wszystkie znaki wejściowe są różne, otrzymana osnowa będzie miała już żadnych elementów oraz\
czy nie leczyć „0 x 0” matrycę prostokątny (a, to nie). Takoḅ\k\
skutecznie zapewnia, że każdy znak pojawiający się na wejściu pojawia się tyle samo razy, a liczba ta nie jest równa 1.To cała funkcjonalność naszego programu (jako pełny program otrzymujemy,
true
jeśli nie wystąpiły żadne awarie asercji,false
jeśli niektóre). Mamy przestrzegać ograniczenia układu źródło, choć, więc dodałem dodatkowykoḅ
, który nie ma celu, ale która nie może zawieść (w przeciwieństwie do\
,o
iḅ
chętnie działają na pustych list).źródło
Python 2 ,
8480 bajtówWypróbuj online!
źródło
JavaScript (Node.js) ,
144...10096 bajtówWypróbuj online!
24 różne postacie * 6 razy każda28 różnych znaków * 5 razy każdy27 różnych znaków * 5 razy każdy27 różnych znaków * 4 razy każdy26 różnych znaków * 4 razy każdy25 różnych znaków * 4 razy każdy24 różne postacie * 4 razy każda
Wyjaśnienie
źródło
PowerShell , 104 bajty
Wypróbuj online!
To była świetna zabawa w golfa. Ograniczeniem było
$
, czego potrzebujemy co najmniej cztery (jedno dla danych wejściowych$args
, jedno dla przypisania wyniku obliczeń$qe
, jedno dla sprawdzenia ostatniego znaku$qe[-1]
i jedno dla sprawdzenia pierwszego znaku$qe[0]
, więc była to robocza maksymalna liczba znaków.Odtąd kwestią gry w golfa (a nie gry w golfa, jak posiadanie dwuliterowej nazwy zmiennej) było podzielenie programu na cztery. Zauważ, że mamy mały komentarz (wszystko po nim
#
), aby uwzględnić niektóre brakujące elementy, ale starałem się, aby komentarz był jak najmniejszy.źródło
Haskell,
907572 bajtówKażda postać pojawia się 6 razy. Ciąg wejściowy jest traktowany jako lista singletonów .
Wypróbuj online!
Dla odniesienia, stare wersje:
75 bajtów, każdy znak 5 razy
Wypróbuj online!
90 bajtów, każdy znak 3 razy:
Wypróbuj online!
źródło
Python 2 ,
1081049288 bajtów-12 bajtów dzięki Rod
-4 bajtów dzięki Kevinowi Cruijssenowi
Wypróbuj online!
źródło
s=input();c=s.count;print[all(c(s[[]>[1]])>=c(o)>1. for o in s)];aaafffillpprrtuu=1.>1.;
88 bajtów poprzez pozbycie się komentarza.aaabb
wydaje się ustępowaćTrue
MATL , 12 bajtów
Dane wejściowe to ciąg ujęty w pojedyncze cudzysłowy. Pojedyncze cudzysłowy w ciągu są usuwane przez duplikowanie.
Wyjście jest niepustą matrycą, co jest prawdą, jeśli nie zawiera zer, i jest fałszem, jeśli zawiera co najmniej zero.
Wypróbuj online! Lub sprawdź dla wygody wszystkie przypadki testowe , w tym standardowy test autentyczności / fałszowania.
Jak to działa
Oświadczenia oznaczone znakiem
(*)
nie są ani konieczne, ani szkodliwe i zostały zamieszczone wyłącznie w celu zapewnienia niedyskryminacji kodu źródłowego.źródło
Perl 5 ,
-p
57 bajtówKażda postać pojawia się 3 razy. Tylko jeden
1
nic nie robi12 bajtów dodanych do podstawowego 45-znakowego rozwiązania w celu zapewnienia niedyskryminacji
Wypróbuj online!
źródło
R , 90 bajtów
Wypróbuj online!
Dane wyjściowe
TRUE
dla niedyskryminującego ciągu znaków iFALSE
dla łańcucha dyskryminującego. Napisałem dużo brzydkiego kodu dla wyzwań na tej stronie, ale myślę, że jest to jak dotąd najbrzydszy.45 znaków, użyte dwa razy każdy (w tym kilka w komentarzu). Poprzednia najlepsza odpowiedź R wynosiła 116 bajtów , przy 29 znakach używanych 4 razy każdy; Piszę to osobno, ponieważ jest zasadniczo inne.
Kod jest równoważny z
który konwertuje dane wejściowe na wektor liczb całkowitych, oblicza tabelę
y
wartości, a następnie sprawdza, czy wszystkie liczby w tej tabeli są równe pierwszej liczbie i czy pierwsza liczba jest większa niż 1.Początkowa trudność polegała na użyciu tylko 2 par nawiasów. Osiąga się to poprzez przekształcenie funkcji Jednoargumentowy
!
i?
byćutf8ToInt
iprod
odpowiednio. (Nie mogę użyć,all
ponieważ potrzebujęa
). Istnieją cztery zadania: dwa z=
i dwa z<-
. Oznacza to, że test równości międzyy
iz
nie można użyćy==z
aniy-z
;y%in%z
przychodzi na ratunek.Zdefiniowanie tych funkcji zużywa wszystkie możliwe cudzysłowy: dwa podwójne cudzysłowy, dwa pojedyncze cudzysłowy i będę potrzebował dwóch znaków wstecz w następnym akapicie, więc musiałem się do nich
readLines()
zastosowaćscan(,"")
. (Inne opcje, takie jakscan(,letters)
lubscan(,month.abb)
wszystkie, wykorzystały cenny przedmiot,t
którego nie mogłem oszczędzić.)W tym momencie miałem większość bloków:
utf8ToInt
,prod
,table
,readLines
,%in%
. Trzy postacie pojawiają się trzy razy w tych nazwach:ent
. Po pierwsze odkryłem, żetable(foo)
jest to równoważne zxtabs(~foo)
zapisanieme
. Mogę uratowaćn
it
przy pomocy sztuczki z kodem szesnastkowym / ósemkowym ; najbardziej golfowym rozwiązaniem jest użycieu\164f8ToI\x6Et
(w backticks)utf8ToInt
.źródło
NA
nie jest uważana za prawdziwą wartość (w R, jeśli (NA) x inaczej y powoduje błąd, więcNA
nie jest ani prawdą, ani falsey )Brachylog , 18 bajtów
Wypróbuj online!
Niestety nie mogę usunąć linii, ponieważ
ḅ
w przypadku pewnej liczby wywoływany jest błąd.źródło
Rubinowy ,
8778 bajtów26 znaków powtórzonych 3 razy każdy
Wypróbuj online!
źródło
gets
i;
. Zmieniłem to, i tak jest krótszy jak lambdaR,
132116 bajtówNie zawiera też żadnych komentarzy ani zbędnych ciągów, chociaż prawdopodobnie będzie to mój jedyny czas na wywołanie funkcji w golfa kodu
crudcardounenforceableuploads
.Prawdopodobnie jest tam świetny anagram dla nazwy funkcji!Podziękowania dla Johna Dvoraka za wskazanie fajnego solvera do anagramów, którego użyłem w nazwie.Tablica znaków:
przykłady:
źródło
>
s, zmieniając porównanie zf
. Można również użyć=
zamiast<<-
.strsplit
jest prawdopodobnie nieuniknione, co jest źródłem większości innych postaci.utf8ToInt
zamiaststrsplit
, ale nie jestem pewien, czy to pomoże. Może także zawierać link do TIO?.
wydaje się zbędne.BASH 144 bajtów
Ten wiersz kodu pobiera ciąg stdin jako dane wejściowe. „grep -o”. umieszcza każdy znak w nowej linii. „uniq -c” zlicza użycie każdej bakterii. Skrypt awk tworzy tablicę z każdym użyciem jako inny element i zwraca wartość true, gdy istnieje tylko 1 indeks tablicy, a wartość wynosi co najmniej 2. Każdy znak jest używany 4 razy, więc to źródło zwraca true
źródło
Stax ,
262418 bajtówWypróbuj online!
Najkrótsze jak dotąd rozwiązanie, które wykorzystuje tylko drukowane ASCII pobiteprzez MATL.Chyba podchodziłem do problemu w niewłaściwy sposób. Powtarzanie działającego bloku nie jest ani golfowe, ani interesujące. Teraz przynajmniej wygląda lepiej ...
Wyjaśnienie
:u{m*
produkuje śmieci, które nie wpływają na wynik.źródło
#
i dwa:
, czy przeczytałeś moją odpowiedź w drugim wierszu? Czy właśnie pominąłeś pierwszy akapit w moim „Wyjaśnieniu”?Pip , 22 bajty
Wypróbuj online!
Wyjaśnienie
Każda postać występuje dwukrotnie.
Alternatywna 22-bajtowa wersja z mniejszą liczbą braków:
źródło
SmileBASIC,
164152148140 bajtów35 różnych znaków, każdy powtórzony 4 razy.
Nie użyto żadnych komentarzy (ale wyrażenie po
neXT
nigdy tak naprawdę nie jest oceniane)Skrypt do sprawdzania odpowiedzi:
Pokaż fragment kodu
źródło
Retina 0.8.2 ,
16890 bajtówDane wyjściowe będą puste, jeśli fałszywe, lub niepuste, jeśli prawdziwe.
Wypróbuj online
Program podstawowy (39 bajtów)
Wyjaśnienie
Cały program podstawowy jest w cichej pętli. Pierwszy etap sortuje dane wejściowe. Drugi etap wypisze bieżący ciąg, jeśli składa się z kolejnych par różnych znaków. Trzeci etap usuwa ostatnie wystąpienie każdego znaku (usunięcie jednego z każdego znaku w ciągu).
O śmieciach na górze: kolejność jest ważna. Oprócz konieczności poprawnej składniowej, średnik musi znajdować się za gwiazdkami i przed znakami wstecznymi, o ile
*
znajduje się w ciągu konfiguracji, aby nie mógł zostać wydrukowany.źródło
CoffeeScript 1 ,
969390 bajtówWypróbuj online!
Zacząłem od mojej odpowiedzi na ES6, ale wróciłem do używania
Array.every
.323130 żetonów po 3 sztźródło
Pyth, 30 bajtów
Niezbędne miejsca wiodące.
Wypróbuj online!
Rzeczywisty program jest po prostu
&q1lJ{hMrSz8<1hJ
. Właśnie dodałem ciąg,"&8<MQSlqr{"
aby był niedyskryminujący. Ale żeby napis nie drukował się sam, musiałem dodać spację, więc dodałem 2 spacje.length_encode
here (r <any> 8
) pobiera sekwencję i wyświetla długość każdego przebiegu tego samego znaku, np."aaabbcc"
staje się[[3, "a"], [2, "b"], [2, "c"]]
.Więc to pobiera dane wejściowe, sortuje je w celu zakodowania długości i bierze pierwszy element każdej listy z wynikowej listy (np. Stałby się wcześniejszy przykład
[3, 2, 2]
). Daje to liczbę wyświetleń znaków. Następnie jest deduplikowane (stałby się wcześniejszy przykład[3, 2]
), a J jest na to ustawiony.Następnie sprawdza, czy długość wynosi 1, tj. Występuje tylko 1 niepowtarzalna liczba wystąpień znaku, a jeśli jest to> 1, tj.> = 2.
Nie może być wbudowany w celu zastąpienia
rSz8
lubhMrSz8
ale nie mogę znaleźć.źródło
C (gcc) , 153 bajty
Wypróbuj online!
Zwraca adres ciągu jako prawdziwą wartość, a zero jako fałsz.
źródło
Perl 6 ,
5857 bajtówWypróbuj online!
Okazuje się, że wersja trzyznakowa jest nieco krótsza niż wersja dwuznakowa.
źródło