Programowanie niedyskryminacyjne

74

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 , !, ai 1pojawiają się trzy razy.
  • "abbaabb"nie jest niedyskryminujący, ponieważ bpojawia 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>"
Laikoni
źródło
4
@Laikoni, czy możemy nadużywać komentarzy, aby to zadziałało?
Magic Octopus Urn
6
Na marginesie, uwielbiam wyzwania, w których mogę używać innych wpisów do testowania ważności mojego wpisu.
Magic Octopus Urn
3
@MagicOctopusUrn Myślę, że powiedział w piaskownicy, że jest to dozwolone, ponieważ nie można tego wyraźnie ustalić.
Erik the Outgolfer
11
Dokładnie. Nawet jeśli w jakiś sposób uda ci się zakazać komentowania w obiektywny sposób, to co z nieużywanymi literałami łańcuchowymi itp.? W każdym razie myślę, że punktacja zachęca do unikania komentarzy w jak największym stopniu.
Laikoni
4
Rozumiem, że to tylko łamigłówka, ale połączenie „niedyskryminującego” ze „wszystkimi możliwymi do zidentyfikowania oznaczonymi typami członów istniejącymi w dokładnie równych częściach” jest lekko niepokojące ... „Dyskryminacja” oznacza „odróżnienie” i nieuczciwe robienie tego oznacza traktowanie lub osądzanie kogoś niesprawiedliwie na podstawie postrzegania go jako odmiennego od innej klasy ludzi. Oczywiście, kontynuuj zabawę!
ErikE

Odpowiedzi:

37

Brachylog , 10 bajtów

=ᵍbᵐbᵐlᵍ=l

Wypróbuj online!

Wyjaśnienie

=ᵍ                Group all equal elements together
  bᵐbᵐ            Remove the first element of each group twice. This fails if
                  there are fewer than 2 elements
      lᵍ          Group elements together that have the same length
        =         Are all elements of that list equal? This only succeeds if the
                  list has one element
         l        Length. This will always succeed
H.PWiz
źródło
25

Java 8, 198 192 186 174 168 165 165 160 bajtów (liczba znaków 6 5)

o->{byte x[]=new byte[+333-3|2],u=-0,i,fe,fi,w; s:w:no0r3sswwyyy:for(int s:o){{u=++x[s];}};for(int b:x){if(!!!(2>b||u==b)|2>u|2>2){x[0]++;}}return!!(0>--x[0]);}

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ź :

o->{int w[]=new int[2222],u=0,f=0;for(int r:o)u=++w[r];for(int e:w)if(!(2>e|u==e)|2>u)f++;return!(f>0);}//[[[]]]  !!!!e(i)++,,,,-----oo////000tuww::::{{{{{;;||||}}}}}>>

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.

s->{                     // Method with character-array parameter and boolean return-type
  int a[]=new int[256],  //  Occurrences integer-array containing 256 zeroes
      t=0,               //  Temp integer, starting at 0
      f=0;               //  Flag integer, starting at 0
  for(int c:s)           //  Loop over the input
    t=++a[c];            //   Increase the occurrence-counter of the current character
                         //   And set the temp integer to this value
  for(int i:a)           //  Loop over the integer-array
    if(i>1               //   If the value is filled (not 0) and at least 2,
       &i!=t             //   and it's not equal to the temp integer
       |t<2)             //   Or the temp integer is lower than 2
      f++;               //    Increase the flag-integer by 1
  return f<1;}           //  Return whether the flag integer is still 0

Niektóre rzeczy, które zrobiłem, aby zmniejszyć liczbę używanych znaków:

  • Nazwy zmiennych o, w, u, f, r, i ezostali wybrani na celu ponowne wykorzystanie znaków mieliśmy już (ale nie więcej niż 6).
  • 2222jest używany zamiast 256.
  • Zmieniono sprawdzić czy e>0&u!=e|u<2aby !(e<2|u==e)|u<2usunąć 6x &.
  • Usunięto dwa oddzielne powroty i stosowane flagę f, i powrót, czy nadal jest 0 w końcu (to oznaczało, że usunąć 6x byz byteobecnie stosowana jest tylko ndo int6 razy, a nie 8).
  • e<2i u<2zmieniono na 2>ei 2>uaby usunąć 6x <.

Co zrobiłem, aby zmniejszyć liczbę znaków od 6 do 5:

  • 2x intsię bytewięc ilość nstosuje się 4 zamiast 6.
  • Używany x[0]zamiast nowej zmiennej, f=0więc zastosowana ilość =wynosi 5 zamiast 6.
  • Zmieniono 2222na 3333tak, aby 2użyta ilość wynosiła 2 zamiast 6.
  • Zmieniono zmienne fi rznowu, aby nie były już 6.

Co @ OlivierGrégoire zrobił, aby pozbyć się komentarza, a zatem 5x /:

  • Dodawanie nieużywanych zmiennych ,i,fe,fi,w;.
  • Dodawanie nieużywane etykiety: s:w:no0r3sswwyyy:.
  • Dodawanie nieużywane |2>2
  • Dodanie {}wokół pętli for i ifs oraz dodanie nieużywanego {}bloku.
  • Zmieniam !na !!!.
  • Zmieniam |na ||.
  • Zmieniamy, 333aby +333-3|2pozbyć się pozostałych operatorów arytmetycznych +-|i 2.
  • Zmieniam !(x[0]>0)na !!(0>--x[0]).
Kevin Cruijssen
źródło
1
180 bajtów : zmieniono wszystko<na>.
Olivier Grégoire
@ OlivierGrégoire Przepraszam, mam już 174 lata. Ale zobaczę, czy możesz zastosować swoją sztuczkę.
Kevin Cruijssen
Zmiana może nadal obowiązywać, aby zapisać 6 bajtów.
Olivier Grégoire
Najbliżej Mam do 162 znaków (161 znaków) . Próbuję usunąć komentarz, ale nadal muszę gdzieś wstawić przecinek. Po prostu nie mogę znaleźć żadnego miejsca.
Olivier Grégoire
1
160 bajtów ( dowód ). Prawdopodobnie bardziej golfowy.
Olivier Grégoire
15

Galaretka , 18 16 12 10 bajtów

Ġ¬zḊḊ¬zĠȦȦ

Wypróbuj online!

Jak to działa

Ġ¬zḊḊ¬zĠȦȦ  Main link. Argument: s (string)

Ġ           Group the indices of s by their corresponding elements.
            "abcba" -> [[1, 5], [2, 4], [3]]

 ¬          Take the logical NOT of each 1-based(!) index.
            [[1, 5], [2, 4], [3]] -> [[0, 0], [0, 0], [0]]

   Ḋ        Dequeue; yield s without its fist element.
            "abcba" -> "bcba"

  z         Zip-longest; zip the elements of the array to the left, using the
            string to the right as filler.
            ([[0, 0], [0, 0], [0]], "bcba") -> [[0, 0, 0], [0, 0, "bcba"]]

    Ḋ       Dequeue; remove the first array of the result.
            This yields an empty array if s does not contain duplicates.
            [[0, 0, 0], [0, 0, "bcba"]] -> [[0, 0, "bcba"]]

    ¬       Take the logical NOT of all zeros and characters.
            [[0, 0, "bcba"]] -> [[1, 1, [0, 0, 0, 0]]]

      Ġ     Group.

     z      Zip-longest. Since all arrays in the result to the left have the same
            number of elements, this is just a regular zip.
            [[1, 1, [0, 0, 0, 0]]] -> [[1], [1], [[0, 0, 0, 0]]

       Ȧ    Any and all; test if the result is non-empty and contains no zeroes,
            at any depth. Yield 1 if so, 0 if not.
            [[1], [1], [[0, 0, 0, 0]] -> 0

        Ȧ   Any and all.
            0 -> 0
Dennis
źródło
13

Brachylog , 14 12 bajtów

ọtᵐℕ₂ᵐ==tℕ₂ọ

Wypróbuj online!

Wyjaśnienie

ọ   Occurrences. Gives a list of [char, count] pairs for the entire input.
tᵐ  Map "tail" over this list, giving each character count.
ℕ₂ᵐ Make sure that each count is at least 2.
=   Make sure that all counts are equal.
    At this point we're done with the actual code, but we need another copy
    of each character (except ᵐ). We can just put them after this, as long as
    we make sure that they can never cause the predicate to fail.
=   Make sure that all counts are equal, again...
t   Extract the last count.
ℕ₂  Make sure that it's at least 2, again...
ọ   Get the digit occurrences in that count, this can't fail.

Alternatywne 12-bajtowe rozwiązanie, które ponownie wykorzystuje tzamiast :

ọtᵐ==tℕ₂ℕ₂ọᵐ
Martin Ender
źródło
13

T-SQL, 320 bajtów (32 znaki x 10 każdy)

Dane wejściowe pochodzą z istniejącej tabeli FILLz polem varchar STEW, zgodnie z naszymi standardami IO .

WITH BUMPF AS(SeLeCT GYP=1
UNION ALL
SeLeCT GYP+1FROM BUMPF
WHeRe GYP<=1000)SeLeCT
IIF(MIN(WAXBY)<MAX(WAXBY)OR
MAX(WAXBY)<=1,+0,+1)FROM(SeLeCT
WAXBY=COUNT(1),WHICH=+1+0,HEXCHANGE=+01,HUNG=+0+1,CHLUB=+0,GEFF=+0FROM
BUMPF,FILL WHERE
GYP<=LEN(STEW)GROUP BY
SUBSTRING(STEW,GYP,1))CHEXX
OPTION(MAXRECURSION 0)----------<<<<<<

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:

WITH b AS (SELECT g=1 UNION ALL SELECT g+1 FROM b WHERE g<1000)
SELECT IIF(MIN(w)<MAX(w) OR MAX(w)<1+1,0,1)
FROM(
    SELECT w=COUNT(1), --extra constant fields here are ignored
    FROM b, fill
    WHERE g < 1+LEN(stew)
    GROUP BY SUBSTRING(stew,g,1)
)a OPTION(MAXRECURSION 0)

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, a IIFinstrukcja zwraca 0 lub 1 w zależności od tego, czy łańcuch wejściowy jest niedyskryminujący.

BradC
źródło
11

C (gcc) ,  333  168 bajtów

Dzięki @Kevin Cruijssen za uratowanie 9 bajtów i dzięki @Laikoni za uratowanie 45 bajtów!

f(r,h,a){char*o=r,c[222]={!o};for(a=!o;*o;)++c[*o++];for(h=!o;222/++h;c[h]&&c[h]!=a&&(a=!*c))!a&&c[h]&&(a=c[h]);r=!(2/2/a);}/////!(())****++,,,,,[[]]fffffrr{{{{{{}}}}}}

Wypróbuj online!

C, 333 bajty

i,v;f(S){char*s=S,L[128]={0};for(v=0;*s;)++L[*s++];for(i=-1;++i<128;L[i]&&L[i]-v?v=-1:0)!v&&L[i]?v=L[i]:0;return-v<-1;}/////////!!!!!!!!&&&&&(((((())))))******+++,,,,,,,----00000111122222228888888:::::::<<<<<<<===???????LLLSSSSSSS[[[]]]aaaaaaaacccccccceeeeeeeeffffffhhhhhhhhiinnnnnnnnooooooorrrrssssssttttttttuuuuuuuuvv{{{{{{{}}}}}}}

Nawet liczba bajtów jest niedyskryminująca!

Wypróbuj online!

Steadybox
źródło
Ooo ... Chciałem być pierwszym sprawcą komentarzy. Fajny, ale podoba mi się sposób sortowania znaków dla komentarza ^ _ ^
Magic Octopus Urn
1
Można obniżyć ją do 324 bajtów , zmieniając zarówno 128do 222tak 8można usunąć.
Kevin Cruijssen
1
279 bajtów przez zmianę nazwy i, v, S, si Lna znaki, które już pojawiają się słowa kluczowe char, fora return: try it on-line!
Laikoni
@Laikoni Thanks! Wczoraj nie miałem czasu na właściwe granie w golfa.
Steadybox
@MagicOctopusUrn Są posortowane, ponieważ byłem zbyt leniwy, aby dodać je ręcznie .
Steadybox
9

05AB1E , 20 18 16 14 bajtów

S¢Z≠sË*sZ¢≠SË*

Wypró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ęść)

S          # push input split into list of chars
 ¢         # count the occurrence of each char in input
  Z≠       # check that the max count is not 1
    sË     # check if all counts are equal
      *    # multiply

Wyjaśnienie (druga część)

s          # swap input to top of stack
 Z¢        # count the number of occurrences of the largest element
   ≠       # check that the count isn't 1
    SË     # split into list and check that each element are equal (always true)
      *    # multiply (as it is with 1, the original result is left unchanged)
Emigna
źródło
{γ€gDË*P≠qq{γ€gDË*P≠to kolejny za 20;).
Magic Octopus Urn
1
@MagicOctopusUrn: Fajnie! Miałem też kilka innych w wieku 20 lat. Mam też jeden w wieku 18 lat :)
Emigna
2
CZARY! Żadnych innych wyjaśnień!
Magic Octopus Urn
1
¢... dobry pomysł człowieku, również cieszę się, że był tak przydatny, jak myślałem, że może być haha!
Magic Octopus Urn
9

Łuska , 14 bajtów

§<ε#εu§m#u
m
<

Wypróbuj online!

Wyjaśnienie

Dwie krótkie linie to brak operacji, ponieważ główna funkcja nigdy ich nie wywołuje.

§<ε#εu§m#u  Implicit input, say S = "asasdd"
         u  Remove duplicates: "asd"
      §m#   For each, get number of occurrences in S: [2,2,2]
     u      Remove duplicates: L = [2]
   #ε       Number of elements in L that are at most 1: 0
  ε         1 if L is a singleton, 0 otherwise: 1
§<          Is the former value smaller than the latter?
Zgarb
źródło
Ale to ma „u” więcej niż „m”, więc nie spełnia wymagań.
WGroleau
@WGroleau mwystę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.
Zgarb
Myślę, że PO powinien wyjaśnić, czy wyjaśnienie programu może być skanowane wraz z programem. Ale tak naprawdę, jeśli to uwzględnisz, masz cztery „u” i dwa „m”
WGroleau
Nieważne; pomyliło mnie to w ten sam sposób, co inna odpowiedź.
WGroleau,
9

Python 2 , 75 69 bajtów

def f(s):len({2<<s.count(c)-2for c,in s})<2or{{e.dil:-tu,r.dil:-tu,}}

Wyjś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!

Dennis
źródło
Sztuczka z ujemnym błędem przesunięcia jest zgrabna! Podoba mi się, w jaki sposób wykorzystuje niski priorytet operatora zmiany biegów.
Vincent
1
{{e.dil:-tu,r.dil:-tu,}} Dobry Boże, co to jest?
Adam Barnes
1
@AdamBarnes Syntaktycznie poprawny bełkot, który w przypadku oceny generuje błąd NameError .
Dennis
Nie rozumiem Próbowałem to zamienić ai wszystko się zepsuło. Czy mógłbyś wyjaśnić dalej?
Adam Barnes,
@AdamBarnes To powinno zadziałać, o ile pozostawisz spację po or. Dodam wyjaśnienie, gdy jestem przy komputerze.
Dennis
9

Brachylog v2, 8 bajtów (w zestawie znaków Brachylog)

oḅ\k\koḅ

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

oḅ\k\koḅ
o          Sort {standard input}
 ḅ         Group identical adjacent values
  \        Assert rectangular; if it is, swap rows and columns
   k       Delete last element
    \      Assert rectangular; (rest of the program is irrelevant)

koḅNa końcu nie ma znaczenia; kzawsze będzie miał element do działania oi 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). Tak oḅ\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, truejeśli nie wystąpiły żadne awarie asercji, falsejeśli niektóre). Mamy przestrzegać ograniczenia układu źródło, choć, więc dodałem dodatkowy koḅ, który nie ma celu, ale która nie może zawieść (w przeciwieństwie do \, oi chętnie działają na pustych list).

ais523
źródło
1
To jest język tego miesiąca !
Erik the Outgolfer
7

Python 2 , 84 80 bajtów

x=input()
c=map(x.count,x)
print max(c)==min(c)>1
1. or our>ram>>utopia,
1., 1.,

Wypróbuj online!

Vincent
źródło
+1 za krótki kod Python, który nie powoduje błędów i naszą utopię
ramową
7

JavaScript (Node.js) , 144 ... 100 96 bajtów

o=>!(a=o.split``.map(i=>o.split(i||aeehhhlmmnnnpst)[`length`]-1)).some(g=>![g>1][-!1]||a[-!1]-g)

Wypróbuj online!

24 różne postacie * 6 razy każda

28 różnych znaków * 5 razy każdy

27 różnych znaków * 5 razy każdy

27 różnych znaków * 4 razy każdy

26 różnych znaków * 4 razy każdy

25 różnych znaków * 4 razy każdy

24 różne postacie * 4 razy każda

Wyjaśnienie

o=>!(
 a=o.split``.map(                            // Split the input into character array and
  i=>o.split(i||aeehhhlmmnnnpst)[`length`]-1 // count the occurrences of each character.
 )
).some(                                      // Then check
 g=>![g>1][-!1]                              // If each character appears at least twice
 ||a[-!1]-g                                  // and the counts are all the same number.
)                                            

More to add:
1. Using {s.split``} instead of {[...s]} is to reduce the number of {.} that dominates
   the count.
2. Using {!c.some} instead of {c.every} to reduce the number of inefficient characters 
   (v,r,y in every)
3. Still one unavoidable inefficient character left ({h}).

Update:
1. Got rid of one {.} by replacing {.length} by {["length"]}.
2. Got rid of one {=} by replacing {c[-!1]!=g} by {c[-!1]-g}.
3. Got rid of one {()} by replacing {!(g>1)} by {![g>1][-!1]}.
4. Finally, because count per character is now 4, the backslashes can be taken out.

Update:
1. Got rid of all {"} by replacing {"length"} by {`length`} and exploiting shortcut
   evaluation. 
   {aaaeehhhlmmnnnpst} is not defined but is not evaluated either because of {c} which
   must be evaluated to true.

Update:
1. Got rid of all {c} by shortcutting the undefined variable at {split(i)} and replacing 
   all {c} by {a}.
   Since {i} is never an empty string, it is always evaluated true (except compared 
   directly to true).

Update:
1. Got rid of all {,} by moving the assignment after the argument list. The {()} at the
   front can therefore be moved to the assignment, retaining same number of {()}s.
Shieru Asakoto
źródło
6

PowerShell , 104 bajty

($qe=$args[0]| group |sort count|% count)[0]-eq$qe[-1]-and$qe[0]-gt1####((()))%%%pppddd===aaccss11nu|0gr

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.

AdmBorkBork
źródło
6

Haskell, 90 75 72 bajtów

a[i]|d:n<-[[i|n<-i,n==a]|a<-i]=and[[i]<d,[d|i<-n]==n]--aadd,,,,:::::<=||

Każ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

n(l)|d<-[[0|n<-l,n==a]|a<-l]=and[[0]<d!!0,all(==d!!0)d]--an!((())),,,0<[]||

Wypróbuj online!

90 bajtów, każdy znak 3 razy:

a x|h:u<-[sum[1|d<-x,not(d/=c)]|c<-x],"  \"\\&,../1::>acdlmmnosst">[]=h>1&&all(not.(/=h))u

Wypróbuj online!

nimi
źródło
6

Python 2 , 108 104 92 88 bajtów

-12 bajtów dzięki Rod
-4 bajtów dzięki Kevinowi Cruijssenowi

s=input();c=s.count;print[all(c(s[[]>[1]])==c(o)>1. for o in s)];aaafffillpprrtuu>1.>1.;

Wypróbuj online!

ovs
źródło
1
Twój program musi być niedyskryminujący.
user202729,
1
Sam program musi być niedyskryminujący.
HyperNeutrino
@ user202729 Dzięki za informację, zaktualizowałem swoją odpowiedź.
ovs
6

MATL , 12 bajtów

q&=sqt&=tsvv

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.

q     % Implicit input. Convert chars to code points and subtract 1 from each (*)
&=    % Square matrix of all pairwise equality comparisons
s     % Sum of each column. Gives a row vector
q     % Subtract 1 from each value. An entry equal to 0 indicates the input string
      % is discriminating because some character appears only once
t     % Duplicate
&=    % Square matrix of all pairwise equality comparisons. An entry equal to 0
      % indicates the input string is discriminating because some character is
      % more repeated than some other
t     % Duplicate (*)
s     % Sum of each column (*) (all those sums will be positive if the previous
      % matrix doesn't contain zeros)
v     % Vertically concatenate the matrix and the vector of its column sums
v     % Vertically concatenate the resulting matrix with nothing (*)
      % Implicit display
Luis Mendo
źródło
5

Perl 5 , -p57 bajtów

Każda postać pojawia się 3 razy. Tylko jeden 1nic nie robi

12 bajtów dodanych do podstawowego 45-znakowego rozwiązania w celu zapewnienia niedyskryminacji

s{.}[@m[@1{$&}+=$.].=g]eg;$\=s()(e@m;1)&&m[e(\sg+)\1+;]}{

Wypróbuj online!

Ton Hospel
źródło
5

R , 90 bajtów

"?"=`u\164f8ToI\x6Et`;'!'=prod;!{y<-xtabs(~?readLines())}%in%{z<-y[1]}&z>T##&[]>~48bEfILpu

Wypróbuj online!

Dane wyjściowe TRUEdla niedyskryminującego ciągu znaków i FALSEdla ł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

y = table(utf8ToInt(readLines()))
z = y[1]
all(y == z) & (z > 1)

który konwertuje dane wejściowe na wektor liczb całkowitych, oblicza tabelę ywartoś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ć utf8ToInti prododpowiednio. (Nie mogę użyć, allponieważ potrzebuję a). Istnieją cztery zadania: dwa z =i dwa z <-. Oznacza to, że test równości między yi znie można użyć y==zani y-z; y%in%zprzychodzi 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 jak scan(,letters)lub scan(,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, że table(foo)jest to równoważne z xtabs(~foo)zapisaniem e. Mogę uratować ni tprzy pomocy sztuczki z kodem szesnastkowym / ósemkowym ; najbardziej golfowym rozwiązaniem jest użycie u\164f8ToI\x6Et(w backticks) utf8ToInt.

Robin Ryder
źródło
To imponujące, że możesz rozróżnić dwa przypadki w 90 bajtach (i miłe nadużycie operatora pomocy), ale niestety NAnie jest uważana za prawdziwą wartość (w R, jeśli (NA) x inaczej y powoduje błąd, więc NAnie jest ani prawdą, ani falsey )
JDL
1
@JDL Dzięki, masz rację. Najnowsza edycja rozwiązuje ten problem.
Robin Ryder
1
@JDL komentarze sugerują, że spójne, wyraźne odpowiedzi są odpowiednie dla prawdomówności i fałszu.
Giuseppe,
@Giuseppe Właściwie rozwiązałem ten problem kilka sekund temu (zobacz nową wersję, która jest zupełnie inna, ale ta sama liczba bajtów); teraz wyświetla PRAWDA i FAŁSZ.
Robin Ryder
4

Brachylog , 18 bajtów

oḅlᵐ=h≥2
oḅlᵐ=h≥2

Wypróbuj online!

Niestety nie mogę usunąć linii, ponieważ w przypadku pewnej liczby wywoływany jest błąd.

Erik the Outgolfer
źródło
Zdecydowanie możliwe jest zrobienie czegoś krótszego, co nie wymaga podawania linii (ale może być konieczna zmiana niektórych rzeczy);)
Fatalize
@Fatalize Nie ma czasu na obecnie i tak, przeczytałem tę dyskusję. :)
Erik the Outgolfer
4

Rubinowy , 87 78 bajtów

c=->m{y=m.chars;x=y.map{|d|y.count d}|[];x[-1]>1and not x[1]};->{pushrortpush}

26 znaków powtórzonych 3 razy każdy

Wypróbuj online!

Asone Tuhid
źródło
@nimi Dziękuję za zwrócenie uwagi, myślę, że to była jakaś dziwność z getsi ;. Zmieniłem to, i tak jest krótszy jak lambda
Asone Tuhid
3

R, 132 116 bajtów

crudcardounenforceableuploads<-function(b){{pi&&pi[[1-!1]];;;"";{1<{f<<-table(strsplit(b,"",,,)[[1]])}}&&!!!sd(-f)}}

Nie 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:

- , ; ! " ( ) [ ] { } & < 1 a b c d e f i l n o p r s t u 
4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4

przykłady:

> crudcardounenforceableuploads("aaabbbccc")
[1] TRUE
> crudcardounenforceableuploads("aaabbbcc")
[1] FALSE
> crudcardounenforceableuploads("abc")
[1] FALSE
> crudcardounenforceableuploads("crudcardounenforceableuploads<-function(b){{pi&&pi[[1-!1]];;;\"\";{1<{f<<-table(strsplit(b,\"\",,,)[[1]])}}&&!!!sd(-f)}}")
[1] TRUE
JDL
źródło
nie wiem, czy liczba bajtów jest ważna, ale prawdopodobnie możemy usunąć 2 i >s, zmieniając porównanie z f. Można również użyć =zamiast <<-. strsplitjest prawdopodobnie nieuniknione, co jest źródłem większości innych postaci.
JDL 1'18
potrzebujesz spacji? możesz również spróbować utf8ToIntzamiast strsplit, ale nie jestem pewien, czy to pomoże. Może także zawierać link do TIO?
Giuseppe
także wszystko .wydaje się zbędne.
Giuseppe
To jest golf golfowy , więc liczba komentarzy jest ważna.
Giuseppe
2
niektóre możliwe anagramy: brak biurokracji związanej z pipem; RIP węglowy dip grillowany z grilla. Znaleziono za pomocą wordplays.com/anagrammer
John Dvorak
2

BASH 144 bajtów

grep -o .|sort|uniq -c|awk '{s=$1}{e[s]=1}END{print((s>1)*(length(e)==1))}##>>>#|'#wwwuuutrqqqppooNNNnlllkkkiihhhggEEEDDDcccaaa1***{}[[[]]]...--''

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

Caleb
źródło
2

Stax , 26 24 18 bajtów

:u{m*_{y#m:u_hy#h*

Wypróbuj online!

Najkrótsze jak dotąd rozwiązanie, które wykorzystuje tylko drukowane ASCII pobite przez 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.

_{y#m:u_hy#h*
_{y#m           map each character to its number of occurences in the string
     :u         all counts are equal (result 1)
       _hy#     get the count of appearance for the first character
           h    halve it and take the floor, so that 1 becomes 0(result 2)
            *   multiply the two results
Weijun Zhou
źródło
@WGroleau, które postacie pojawiają się raz? Czy przeczytałeś wystarczająco uważnie moją odpowiedź?
Weijun Zhou
„#” pojawia się częściej niż „:” (tylko jeden przykład). Ups,
niepoprawny odczyt
@WGroleau Są dokładnie dwa #i dwa :, czy przeczytałeś moją odpowiedź w drugim wierszu? Czy właśnie pominąłeś pierwszy akapit w moim „Wyjaśnieniu”?
Weijun Zhou
Przepraszam, myślałem, że linia nad wyjaśnieniem była wszystkim.
WGroleau
1

Pip , 22 bajty

I1&MY$=_Y_NaMa$=y&1NIy

Wypróbuj online!

Wyjaśnienie

Każda postać występuje dwukrotnie.

                        a is first command-line argument
I1&MY$=_                No-ops to make the program non-discriminating
            Ma          Map this function to the characters of a:
         _Na             Count occurrences of each character in a
        Y               Yank the result into y
              $=y       Fold y on equals: truthy if all elements are equal
                 &      Logical and
                  1NIy  1 is not in y
                        Autoprint the result of the last expression

Alternatywna 22-bajtowa wersja z mniejszą liczbą braków:

$&MY_Y_NaMa$=y&--1=1Ny
DLosc
źródło
1

SmileBASIC, 164 152 148 140 bajtów

DeF M(X)DIM W[#R]WHILE""<X
INC w[ASC(x)]X[n]=""wEND
FOR F=e#TO--nOT-LEN(W)U=w[F]H=H||U&&U<MAx(W)neXT-!!!AASSS#&&Oxx||CCLL<<wIM#
RETURN!H
enD

35 różnych znaków, każdy powtórzony 4 razy.

Nie użyto żadnych komentarzy (ale wyrażenie po neXTnigdy tak naprawdę nie jest oceniane)

Skrypt do sprawdzania odpowiedzi:

12Me21
źródło
1

Retina 0.8.2 , 168 90 bajtów

Dane wyjściowe będą puste, jeśli fałszywe, lub niepuste, jeśli prawdziwe.

***???;;;;```!!$$$$MMMMOOOO..1111ssss222{{{{\^^^^

s;{O`.
M!*\`^((.)\2(?!\2))*$
(.)(?!\1)

Wypróbuj online

Program podstawowy (39 bajtów)

s;{O`.
M!*\`^((.)\2(?!\2))*$
(.)(?!\1)

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.

mbomb007
źródło
Fajnie, moja odpowiedź jest krótsza, ale nie jestem pewien, czy dobrze skaluje się do bycia ustalonym dla 0/1 jako wyjścia, więc po prostu dodam ją tutaj, na wypadek, gdyby Ci to pomogło: tio.run
FryAmTheEggman
@FryAmTheEggman Szukałem czystego rozwiązania wyrażenia regularnego, aby dopasować grupy znaków o tej samej długości wszystkie z rzędu, ale nie mogłem tego pojąć.
mbomb007
@FryAmTheEggman Dokonano dużej poprawy! Tak naprawdę nie użyłem tego, co miałeś, ale zacząłem od zera, próbując wymyślić lepszą metodę.
mbomb007
Ładnie wykonane! I wydaje mi się, że nie myślałem wystarczająco dużo o moim programie, ale przynajmniej znalazłeś lepszy :)
FryAmTheEggman
1

Pyth, 30 bajtów

  "&8<MQSlqr{"&q1lJ{hMrSz8<1hJ

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.

&q1lJ{hMrSz8<1hJ

 q1l                (1 == len(
    J{                  J = deduplicate(
      hM                  map(lambda a: a[0],
        r  8                length_encode(
         Sz                   sorted(input())
                            )
                          )
                        )
                    )
&                     and
            <1hJ    (1 < J[0])

length_encodehere ( 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 rSz8lub hMrSz8ale nie mogę znaleźć.

RK.
źródło
1

C (gcc) , 153 bajty

f(h,a,c,f){{{{{{{char*o=f=h,*r;for(a=!h;*o;o++){for(c=!h,r=h;*r;c+=!(*r++^*o)){}f*=!!(c^!!h)*(!a+!(a^c));a=c;}(a^c^c^f^f^h)+o,a+r,o,o,+h^*r;(a=f);}}}}}}}

Wypróbuj online!

Zwraca adres ciągu jako prawdziwą wartość, a zero jako fałsz.

f(
h,                              Address of string.
a,                              # instances of previous character
c,                              # instances of current character
f                               Return value
){{{{{{{                        
char*o=f=h,*r;                  Point o to string, while giving f a non-zero value.
for(a=!h;*o;o++){               Set previous char count to 0, and then traverse the string.
for(c=!h,r=h;*r;                Set current char count to 0 and r to string,
                                and start counting instances of current character.
c+=!(*r++^*o))                  Add to counter if current character matches.
{}                              Lower the amount of semi-colons
f*=                             Multiply (AND) return value with:
   !!(c^!!h)                    Is current count not 1? (Must be 2 or above.)
            *(!a+!(a^c));       AND, is previous count valid (meaning this is not the first
                                character counted), and matches current count?
a=c;}                           Previous count = current count.
(a^c^c^f^f^h)+o,a+r,o,o,+h^*r;  Spend surplus characters to make source code valid.
(a=f);}}}}}}}                   Return value.
gastropner
źródło
1

Perl 6 , 58 57 bajtów

{.max==.min>()**()}o{(bag .comb){*}}###=>>abccggiinnoxx  

Wypróbuj online!

Okazuje się, że wersja trzyznakowa jest nieco krótsza niż wersja dwuznakowa.

Jo King
źródło