Nicht diskriminierende Programmierung


74

Wir sagen, eine Zeichenfolge ist nicht diskriminierend, wenn jedes Zeichen der Zeichenfolge gleich oft und mindestens zweimal vorkommt.

Beispiele

  • "aa!1 1 !a !1"ist nicht diskriminierend , weil jedes der Zeichen , !, aund 1dreimal erscheinen.
  • "abbaabb"ist nicht nicht diskriminierend, weil bes öfter auftritt als a.
  • "abc"ist auch nicht diskriminierend, da die Zeichen nicht mindestens zweimal vorkommen.

Aufgabe

Schreiben Sie ein nicht diskriminierendes Programm oder eine nicht diskriminierende Funktion, die einen Wahrheitswert zurückgibt , wenn eine bestimmte Zeichenfolge nicht diskriminierend ist , und ansonsten einen falschen Wert.

Das heißt, das auf seinem eigenen Quellcode ausgeführte Programm sollte einen Wahrheitswert zurückgeben.

Jede Einreichung muss in der Lage sein, nicht leere Zeichenfolgen zu verarbeiten, die druckbares ASCII enthalten , sowie alle Zeichen, die im Quellcode der Einreichung erscheinen.

Testfälle

Wahrheit:

<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"

Falsch:

"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>"

4
@Laikoni können wir Kommentare missbrauchen, um dies zum Laufen zu bringen?
Magic Octopus Urn

6
Nebenbei bemerkt, ich liebe Herausforderungen, bei denen ich andere Einträge verwenden kann, um die Gültigkeit meines Eintrags zu testen.
Magic Octopus Urn

3
@MagicOctopusUrn Ich denke, dass er in der Sandbox gesagt hat, dass das erlaubt ist, da es nicht feststellbar ist.
Erik der Outgolfer

11
Genau. Auch wenn Sie es irgendwie schaffen, Kommentare objektiv zu verbieten, was ist dann mit nicht verwendeten String-Literalen ect? Wie auch immer, ich denke, die Wertung ist ein Anreiz, Kommentare so weit wie möglich zu vermeiden.
Laikoni

4
Ich verstehe, es ist nur ein Rätsel, aber die Verschmelzung von "nicht diskriminierend" mit "allen identifizierbaren, gekennzeichneten Elementtypen, die in genau gleichen Teilen existieren" ist leicht störend ... "diskriminieren" bedeutet "den Unterschied zwischen" und "zu unterscheiden unfair zu tun bedeutet, jemanden unfair zu behandeln oder zu beurteilen, indem er ihn als anders als eine andere Klasse von Menschen ansieht. Natürlich macht der Spaß weiter so!
ErikE

Antworten:


37

Brachylog , 10 Bytes

=ᵍbᵐbᵐlᵍ=l

Probieren Sie es online!

Erläuterung

=ᵍ                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

25

Java 8, 198 192 186 174 168 165 160 Bytes (Zeichenanzahl 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]);}

Probieren Sie es online aus.
Der Code, der zum Überprüfen des Vorkommens der Zeichen verwendet wurde , war meine Antwort auf diese Herausforderung .

-5 Bytes danke an @ OlivierGrégoire , indem du den Kommentar loswerdest und ein Durcheinander machst . ;)

Alte 168-Byte-Antwort (Zeichenanzahl 6) :

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::::{{{{{;;||||}}}}}>>

Probieren Sie es online aus.
Code, der zum Überprüfen des Vorkommens der Zeichen ohne Kommentar verwendet wurde. Dies war meine Antwort auf diese Herausforderung .

-6 Bytes dank @ OliverGrégoire entfernen, <indem Sie die Schecks auf >.

Erklärung des Basis-Golfprogramms (98 Bytes):
Probieren Sie es online aus.

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

Einige Dinge, die ich getan habe, um die Anzahl der verwendeten Zeichen zu reduzieren:

  • Variablennamen o, w, u, f, r, und ewurden absichtlich gewählt , um wieder zu verwenden Charaktere , die wir bereits haben (aber nicht mehr als 6).
  • 2222wird anstelle von verwendet 256.
  • Changed die if-Check e>0&u!=e|u<2zu !(e<2|u==e)|u<26x zu entfernen &.
  • Entfernte die zwei getrennten Rückgaben und benutzte ein Flag f, und wir gaben zurück, ob es am Ende immer noch 0 ist (dies bedeutete, dass ich das 6x byvon bytejetzt entfernen konnte, das wir nur nin int6-mal anstelle von 8 verwenden).
  • e<2und u<2geändert zu 2>eund 2>uum 6x zu entfernen <.

Was ich getan habe, um die Zeichenanzahl von 6 auf 5 zu reduzieren:

  • 2x intbis byteso ist die verwendete Menge n4 statt 6.
  • Wird x[0]anstelle einer neuen Variablen verwendet, f=0sodass =5 anstelle von 6 verwendet werden.
  • Geändert 2222zu: 3333Die verwendete Menge 2ist 2 statt 6.
  • Geänderte Variablen fund rwieder sind sie auch nicht mehr 6.

Was @ OlivierGrégoire getan hat, um den Kommentar und damit die 5x loszuwerden /:

  • Hinzufügen nicht verwendeter Variablen ,i,fe,fi,w;.
  • Hinzufügen von nicht verwendeten Etiketten: s:w:no0r3sswwyyy:.
  • Hinzufügen von nicht verwendeten |2>2
  • Hinzufügen {}von for-Schleifen und ifs und Hinzufügen eines nicht verwendeten {}-Blocks.
  • Ändern !zu !!!.
  • Ändern |zu ||.
  • Ändern 333, +333-3|2um übrig gebliebene arithmetische Operatoren +-|und die loszuwerden 2.
  • Ändern !(x[0]>0)zu !!(0>--x[0]).

1
180 Bytes : alles<ingeändert>.
Olivier Grégoire

@ OlivierGrégoire Sorry, ich bin schon bei 174 :) Mal schauen, ob dein Trick noch angewendet werden kann.
Kevin Cruijssen

Die Änderung kann immer noch angewendet werden, um 6 Bytes zu sparen.
Olivier Grégoire

Am nächsten bin ich bei 162 Zeichen (161 Zeichen) . Ich versuche, den Kommentar zu entfernen, aber ich muss noch irgendwo ein Komma setzen. Ich kann einfach keinen Platz finden.
Olivier Grégoire

1
160 Bytes ( Proof ). Sehr wahrscheinlich mehr Golf.
Olivier Grégoire

15

Jelly , 18 16 12 10 Bytes

Ġ¬zḊḊ¬zĠȦȦ

Probieren Sie es online!

Wie es funktioniert

Ġ¬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

13

Brachylog , 14 12 Bytes

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

Probieren Sie es online!

Erläuterung

ọ   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.

Alternative 12-Byte-Lösung, die wiederverwendet wird tanstelle von :

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

13

T-SQL, 320 Byte (je 32 Zeichen x 10)

Die Eingabe erfolgt über bereits bestehende Tabelle FILLmit Varchar Feld STEW, je unseren IO - Standards .

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)----------<<<<<<

Ich war noch nie so erfreut und doch entsetzt über ein Stück Code.

Muss auf einem Server oder einer Datenbank ausgeführt werden, bei denen zwischen Groß- und Kleinschreibung unterschieden wird. Es gibt jeweils 10 von 32 verschiedenen Zeichen, einschließlich Groß- und Kleinbuchstaben E(bei SQL-Befehlen wird die Groß- und Kleinschreibung nicht berücksichtigt, daher werden einige nach Bedarf umgedreht), Leerzeichen und Tabulatoren (Tabulatoren werden im obigen Code zur besseren Lesbarkeit als Zeilenumbrüche angezeigt).

Ich habe Möglichkeiten gefunden, 10 der anderen Symbole + = ,in den Code aufzunehmen, konnte dies aber leider nicht tun <, sodass ich das Kommentarzeichen hinzufügen musste -.

Hier ist der formatierte Code, bevor ich den gesamten zusätzlichen Füllstoff eingepfercht habe:

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)

Die oberste Zeile ist ein rekursiver CTE, der eine Zahlentabelle generiert b, die wir mit der Quellzeichenfolge verknüpfen, um sie nach Zeichen zu trennen. Diese Zeichen werden gruppiert und gezählt, und die IIFAnweisung gibt 0 oder 1 zurück, je nachdem, ob die Eingabezeichenfolge nicht diskriminierend ist.


11

C (gcc) ,  333.168  Bytes

Danke an Kevin Cruijssen für das Speichern von 9 Bytes und danke an Laikoni für das Speichern von 45 Bytes!

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{{{{{{}}}}}}

Probieren Sie es online!

C 333 Bytes

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{{{{{{{}}}}}}}

Auch das bytecount ist nicht diskriminierend!

Probieren Sie es online!


Awwhh ... Ich wollte der erste Kommentarbetrüger sein. Schön, aber ich mag, wie Sie die Zeichen für den Kommentar sortiert ^ _ ^
Magic Octopus Urn

1
Sie können den Wert auf 324 Byte senken, indem Sie beide 128in ändern , 222damit der 8Wert gelöscht werden kann.
Kevin Cruijssen

1
279 Bytes durch Umbenennen i, v, S, sund Lzu Zeichen , die bereits in den Schlüsselwörtern erscheinen char, forund return: Versuchen Sie es online!
Laikoni

@Laikoni Danke! Ich hatte gestern nicht die Zeit, richtig Golf zu spielen.
Steadybox

@MagicOctopusUrn Sie sind sortiert, weil ich zu faul war, sie von Hand hinzuzufügen .
Steadybox

9

05AB1E , 20 18 16 14 Bytes

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

Probieren Sie es online!

Das Programm ist im Wesentlichen in zwei Teile unterteilt, wobei das Ziel des ersten Teils darin besteht, die eigentliche Aufgabe zu erledigen, und das Ziel des zweiten Teils darin, dieselben Funktionen wie im ersten Teil zu verwenden, ohne das Ergebnis zu verändern.

Erklärung (erster Teil)

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

Erklärung (zweiter Teil)

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)

{γ€gDË*P≠qq{γ€gDË*P≠ist eine andere für 20;).
Magic Octopus Urn

1
@MagicOctopusUrn: Schön! Mit 20 hatte ich noch ein paar andere. Ich habe jetzt auch eine um 18 :)
Emigna

2
HEXEREI! Keine andere Erklärung!
Magic Octopus Urn

1
¢... gute Idee Mann, auch ich bin froh zu sehen, dass es so nützlich war, wie ich dachte, es könnte sein, haha!
Magic Octopus Urn

9

Schale , 14 Bytes

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

Probieren Sie es online!

Erläuterung

Die beiden kurzen Zeilen sind No-Ops, da die Hauptfunktion sie niemals aufruft.

§<ε#ε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?

Aber dies hat "u" mehr als "m", so dass es die Anforderungen nicht erfüllt.
WGroleau

@WGroleau mkommt auch zweimal vor: in der ersten Zeile und in der zweiten Zeile. Die Erklärung enthält die beiden kurzen Zeilen nicht, da sie das Verhalten des Programms nicht beeinflussen.
Zgarb

Ich denke, das OP sollte klären, ob eine Erklärung des Programms zusammen mit dem Programm gescannt werden kann. Aber tatsächlich, wenn Sie das einschließen, haben Sie vier 'u' und zwei 'm'
WGroleau

Keine Ursache; Das verwirrte mich genauso wie eine andere Antwort.
WGroleau

9

Python 2 , 75 69 Bytes

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

Die Ausgabe erfolgt über das Vorhandensein oder Fehlen eines Fehlers. Der Fehler ist entweder ein ValueError (ein oder mehrere Zeichen kommen nur einmal vor) oder ein NameError (die Zeichenanzahl ist ungleich).

Probieren Sie es online!


Der Trick mit negativen Schaltfehlern ist ordentlich! Ich mag, wie es die niedrige Priorität des Schichtbetreibers ausnutzt.
Vincent

1
{{e.dil:-tu,r.dil:-tu,}} Guter Herr, was ist das?
Adam Barnes

1
@AdamBarnes Syntaktisch gültiger Kauderwelsch, der bei Auswertung einen NameError auslöst .
Dennis

Ich verstehe es nicht. Ich habe versucht, es auszutauschen, aund alles ist kaputt gegangen. Könnten Sie das bitte näher erläutern?
Adam Barnes

@AdamBarnes Das sollte funktionieren, solange Sie nach dem ein Leerzeichen lassen or. Ich werde eine Erklärung hinzufügen, wenn ich an einem Computer bin.
Dennis

9

Brachylog v2, 8 Bytes (in Brachylogs Zeichensatz)

oḅ\k\koḅ

Probieren Sie es online!

Sieht so aus, als ob in Brachylog ein Golfkrieg um diese Frage ausgetragen wurde, und ich dachte, ich würde mitmachen und ein paar Bytes für die nächstbeste Antwort einsparen.

Dies ist ein vollständiges Programm, das Eingaben als Liste von Zeichencodes akzeptiert. (Dies liegt zum Teil daran, dass Brachylog einige sehr bizarre Fehler im Zusammenhang mit Backslashes in Zeichenfolgen aufweist, und zum Teil daran, dass der \Befehl nicht für Listen von Zeichenfolgen funktioniert.)

Erläuterung

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)

Das koḅam Ende ist irrelevant; kwird immer ein Element haben, auf das man einwirken kann, ound kann nicht fehlschlagen, wenn man eine Liste als Eingabe erhält.

Der Grund für den Start oḅsollte klar sein; es partitioniert die eingabeliste nach wert, [1,2,1,2,4,1]würde zB werden [[1,1,1],[2,2],[4]]. Damit jedes Zeichen gleich oft vorkommt, muss jede dieser Listen gleich lang sein, dh die resultierende Liste ist ein Rechteck. Wir können diese Rechteckigkeit mit behaupten \, die als Nebeneffekt auch die Zeilen und Spalten transponiert.

Wir haben jetzt einen aktuellen Wert, der aus mehreren Kopien des Zeichensatzes besteht, zB wenn die Eingabe [4,2,1,2,4,1]der aktuelle Wert wäre [[1,2,4],[1,2,4]]. Wenn wir eine Kopie löschen, ist die resultierende Matrix immer noch rechteckig, sodass wir sie mit zurückdrehen können \. Wenn jedoch der Grund die Matrix rechteckig ist , dass alle eingegebenen Zeichen waren eindeutig, die resultierende Matrix wird keine Elemente verlassen hat und \sie nicht eine „0 × 0“ Matrix als rechteckig behandeln (besser gesagt, es scheitert). Es wird also oḅ\k\effektiv behauptet, dass jedes Zeichen, das in der Eingabe erscheint, gleich oft vorkommt und dass diese Anzahl nicht 1 ist.

Das ist die gesamte Funktionalität unseres Programms (als vollständiges Programm erhalten wir, truewenn keine Assertionsfehler aufgetreten sind, falsewenn einige aufgetreten sind ). Wir haben die Quelle Layout Einschränkung zu gehorchen, obwohl, so habe ich ein zusätzliches , koḅdie keinen Zweck hat , aber das kann nicht umhin , ( im Gegensatz zu \, ound ist glücklich über leere Listen zu handeln).




7

JavaScript (Node.js) , 144 ... 100 96 Bytes

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

Probieren Sie es online!

24 verschiedene Zeichen * jeweils 6 Mal

28 verschiedene Zeichen * 5 mal

27 verschiedene Zeichen * 5 mal

27 verschiedene Zeichen * 4 mal

26 verschiedene Zeichen * jeweils 4 Mal

25 verschiedene Zeichen * jeweils 4 Mal

24 verschiedene Zeichen * 4 mal

Erläuterung

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.

6

PowerShell , 104 Byte

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

Probieren Sie es online!

Das hat Spaß gemacht, Golf zu spielen. Die Einschränkung war $, dass wir mindestens vier benötigen (eine für die Eingabe $args, eine für die Zuweisung des Berechnungsergebnisses $qe, eine für die Prüfung des letzten Zeichens $qe[-1]und eine für die Prüfung des ersten Zeichens $qe[0], so dass die maximale Anzahl von Zeichen funktioniert.

Von da an war es eine Frage des Golfspiels (und nicht des Golfspiels, wie wenn man einen aus zwei Buchstaben bestehenden Variablennamen hat), um das Programm gut durch vier teilbar zu machen. Beachten Sie, dass wir einen kleinen Kommentar haben (alles nach dem #), um einige fehlende Elemente zu erklären, aber ich habe versucht, den Kommentar so klein wie möglich zu halten.


6

Haskell, 90 75 72 Bytes

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

Jeder Buchstabe erscheint 6mal. Die Eingabezeichenfolge wird als Singleton-Liste verwendet .

Probieren Sie es online!

Als Referenz alte Versionen:

75 Bytes, jeweils 5 Zeichen

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

Probieren Sie es online!

90 Bytes, jedes Zeichen 3 mal:

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

Probieren Sie es online!


6

Python 2 , 108 104 92 88 Bytes

-12 Bytes dank Rod
-4 Bytes dank Kevin Cruijssen

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

Probieren Sie es online!


1
Ihr Programm muss nicht diskriminierend sein.
user202729

1
Das Programm selbst darf nicht diskriminierend sein.
HyperNeutrino

@ user202729 Danke, dass Sie mir gesagt haben, ich habe meine Antwort aktualisiert.
Ovs



6

MATL , 12 Bytes

q&=sqt&=tsvv

Die Eingabe ist eine Zeichenfolge in einfachen Anführungszeichen. Einfache Anführungszeichen in der Zeichenfolge werden durch Duplizieren maskiert.

Die Ausgabe ist eine nicht leere Matrix, die wahr ist, wenn sie keine Nullen enthält, und falsch ist, wenn sie mindestens eine Null enthält.

Probieren Sie es online! Oder überprüfen Sie alle Testfälle , einschließlich des Standardtests auf Richtigkeit und Falschheit.

Wie es funktioniert

Mit gekennzeichnete Aussagen (*)sind weder notwendig noch schädlich und wurden nur aufgenommen, um den Quellcode nicht zu diskriminieren.

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

5

Perl 5 , -p57 Bytes

Jeder Buchstabe erscheint 3mal. Nur ein Single 1macht nichts

Einer einfachen 45-Zeichen-Lösung werden 12 Bytes hinzugefügt, um die Unterscheidung zu erleichtern

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

Probieren Sie es online!


5

R , 90 Bytes

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

Probieren Sie es online!

Ausgaben TRUEfür eine nicht unterscheidende Zeichenfolge und FALSEfür eine unterscheidende Zeichenfolge. Ich habe viel hässlichen Code für Herausforderungen auf dieser Site geschrieben, aber ich denke, dass dies der hässlichste ist, den es bisher gibt.

45 Zeichen, jeweils zweimal verwendet (einschließlich einiger Zeichen in einem Kommentar). Die bisher beste R-Antwort war 116 Byte , wobei 29 Zeichen jeweils viermal verwendet wurden. Ich poste dies separat, da es wesentlich anders ist.

Der Code ist äquivalent zu

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

Diese Methode konvertiert die Eingabe in einen Ganzzahlvektor, berechnet eine Kontingenztabelle yder Werte und prüft dann, ob alle Zählungen in dieser Tabelle mit der ersten Zählung übereinstimmen und ob die erste Zählung größer als 1 ist.

Die anfängliche Schwierigkeit bestand darin, nur zwei Klammerpaare zu verwenden. Dies wird durch die Neudefinition der monadischen Funktionen erreicht !und ?zu sein utf8ToIntund prodjeweils. (Ich kann nicht verwenden, allweil ich das brauche a). Es gibt vier Zuordnungen: zwei mit =und zwei mit <-. Dies bedeutet, dass die Gleichheitsprüfung zwischen yund znicht y==znoch verwenden kann y-z; y%in%zkommt zur Rettung.

Das Definieren dieser Funktionen verbraucht alle möglichen Anführungszeichen: zwei doppelte Anführungszeichen, zwei einfache Anführungszeichen, und ich brauche die beiden Backticks im nächsten Absatz, also musste ich readLines()stattdessen darauf zurückgreifen scan(,""). (Die anderen Optionen, wie scan(,letters)oder scan(,month.abb)alle verwendeten ein kostbares, t das ich nicht verschonen konnte.)

Zu diesem Zeitpunkt hatte ich die meisten der Bausteine: utf8ToInt, prod, table, readLines, %in%. Drei Zeichen erscheinen dreimal in diesem Namen: ent. Zuerst entdeckte ich, dass table(foo)das gleichbedeutend ist mit dem xtabs(~foo)Speichern der e. Ich kann das nund das tmit dem Hex / Oktal-Code- Trick retten ; Die golferischste Lösung ist die Verwendung u\164f8ToI\x6Et(in Backticks) für utf8ToInt.


Es ist beeindruckend, dass Sie die beiden Fälle in 90 Bytes unterscheiden können (und den netten Missbrauch des NAHilfsoperators ), aber leider wird es nicht als wahrer Wert angesehen (in R, wenn (NA) x sonst y einen Fehler verursacht, NAist dies weder wahr noch falsch )
JDL

1
@JDL Danke, du hast recht. Die neueste Bearbeitung behebt dieses Problem.
Robin Ryder

1
@JDL die Kommentare legen nahe, dass konsistente, eindeutige Antworten für wahr und falsch in Ordnung sind.
Giuseppe

@ Giuseppe Eigentlich habe ich dieses Problem vor Sekunden gelöst (siehe neue Version, die ganz anders ist, aber die gleiche Anzahl von Bytes); gibt jetzt TRUE und FALSE aus.
Robin Ryder

4

Brachylog , 18 Bytes

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

Probieren Sie es online!

Leider kann ich die Zeilenvorschübe nicht entfernen, da bei einer Nummer ein Fehler ausgelöst wird.


Es ist definitiv möglich, etwas kürzeres zu machen, das keine Zeilenvorschübe erfordert (aber möglicherweise müssen Sie einige Dinge ändern);)
Fatalize

@Fatalize Keine Zeit bis zur Zeit, und ja, ich habe diese Diskussion gelesen. :)
Erik der Outgolfer

4

Ruby , 87 78 Bytes

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

26 Zeichen werden jeweils dreimal wiederholt

Probieren Sie es online!


@nimi Danke für den Hinweis, ich denke das war etwas komisch mit getsund ;. Geändert, es ist sowieso kürzer als ein Lambda
Asone Tuhid

3

R 132 116 Bytes

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

Es enthält auch keine Kommentare oder überflüssigen Zeichenfolgen, obwohl dies wahrscheinlich das einzige Mal ist, dass ich im Codegolf eine Funktion aufrufe crudcardounenforceableuploads. Es gibt wahrscheinlich irgendwo ein tolles Anagramm für den Funktionsnamen! Vielen Dank an John Dvorak für den Hinweis auf einen schönen Anagramm-Löser, den ich für den Namen verwendet habe.

Zeichentabelle:

- , ; ! " ( ) [ ] { } & < 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

Beispiele:

> 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

Ich weiß nicht, ob die Anzahl der Bytes wichtig ist, aber wir können wahrscheinlich die 2en und die >s entfernen , indem wir den Vergleich mit umschalten f. Kann auch =anstelle von verwenden <<-. strsplitist wahrscheinlich unvermeidlich, was die Quelle der meisten anderen Charaktere ist.
JDL

Benötigen Sie die Räume? Sie könnten auch versuchen , utf8ToIntstatt strsplit, aber nicht sicher , ob das helfen wird. Vielleicht auch einen Link zu TIO?
Giuseppe

auch all das .scheint überflüssig zu sein.
Giuseppe

Dies ist Code-Golf , daher ist die Anzahl der Bytes laut Ihrem Kommentar wichtig.
Giuseppe

2
Einige mögliche Anagramme: Keine Bürokratie in den Schränken; RIP kohlenstoffhaltiger gegrillter Pfund-Dip. Gefunden mit wordplays.com/anagrammer
John Dvorak

2

BASH 144 Bytes

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

Diese Codezeile verwendet eine stdin-Zeichenfolge als Eingabe. "grep -o." setzt jedes Zeichen in eine neue Zeile. "uniq -c" zählt die Verwendung jedes Zeichens. Das awk-Skript erstellt ein Array mit jeder Verwendung als anderes Element und gibt true aus, wenn nur 1 Arrayindex vorhanden ist und der Wert mindestens 2 beträgt. Jedes Zeichen wird viermal verwendet, sodass diese Quelle true zurückgibt


2

Stax , 26 24 18 Bytes

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

Probieren Sie es online!

Kürzeste Lösung, die bisher nur druckbare ASCIIs verwendet, die von MATL geschlagen wurden.

Ich schätze, ich bin falsch an das Problem herangegangen. Einen Arbeitsblock zu wiederholen ist weder golfen noch interessant. Jetzt sieht es wenigstens besser aus ...

Erläuterung

:u{m* erzeugt etwas Müll, der sich nicht auf die Ausgabe auswirkt.

_{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

@WGroleau Welche Zeichen kommen einmal vor? Hast du meine Antwort sorgfältig genug gelesen?
Weijun Zhou

'#' erscheint häufiger als ':' (nur ein Beispiel). Hoppla, falsch
gelesen

@WGroleau Es gibt genau zwei #und zwei :, hast du meine Antwort in der zweiten Zeile gelesen? Haben Sie gerade den ersten Absatz in meiner "Erklärung" übersprungen?
Weijun Zhou

Entschuldigung, dachte die Zeile über der Erklärung war die ganze Sache.
WGroleau

1

Pip , 22 Bytes

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

Probieren Sie es online!

Erläuterung

Jeder Buchstabe kommt zweimal vor.

                        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

Alternative 22-Byte-Version mit weniger No-Ops:

$&MY_Y_NaMa$=y&--1=1Ny

1

SmileBASIC, 164 152 148 140 Bytes

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 verschiedene Charaktere, jeweils 4-mal wiederholt.

Es wurden keine Kommentare verwendet (der Ausdruck danach neXTwird jedoch nie ausgewertet)

Skript zur Überprüfung der Antworten:


1

Retina 0.8.2 , 168 90 Bytes

Die Ausgabe ist leer, wenn sie falsch ist, oder nicht leer, wenn sie wahr ist.

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

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

Probieren Sie es online aus

Kernprogramm (39 Bytes)

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

Erläuterung

Das gesamte Kernprogramm befindet sich in einer stillen Schleife. Die erste Stufe sortiert die Eingabe. In der zweiten Stufe wird die aktuelle Zeichenfolge gedruckt, wenn sie aus aufeinanderfolgenden Paaren verschiedener Zeichen besteht. Die dritte Stufe entfernt das letzte Vorkommen jedes Zeichens (Entfernen eines jeden Zeichens in der Zeichenfolge).

Über den Müll an der Spitze: Die Reihenfolge ist wichtig. Ein Semikolon muss nicht nur syntaktisch gültig sein, sondern auch nach den Sternchen und vor den Backticks stehen, solange *es in der Konfigurationszeichenfolge enthalten ist, damit es nicht gedruckt wird.


Schön, meine Antwort ist kürzer, aber ich bin mir nicht sicher, ob es gut skaliert, um für 0/1 als Ausgabe festgelegt zu werden. Deshalb werde ich es hier nur hinzufügen, falls es Ihnen hilft: tio.run/##K0otycxLNPz/…
FryAmTheEggman

@FryAmTheEggman Ich suchte nach einer reinen Regex-Lösung, um Zeichengruppen gleicher Länge hintereinander zuzuordnen, aber ich konnte es nicht herausfinden.
mbomb007

@FryAmTheEggman Große Verbesserung! Ich habe nicht wirklich das verwendet, was Sie hatten, aber ich habe bei Null angefangen, um mir eine bessere Methode auszudenken.
mbomb007

Schön gemacht! Und ich hatte anscheinend nicht genug über mein Programm nachgedacht, aber zumindest hast du ein besseres gefunden :)
FryAmTheEggman


1

Pyth, 30 Bytes

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

Führende Leerzeichen erforderlich.

Probieren Sie es online!

Das eigentliche Programm ist eben &q1lJ{hMrSz8<1hJ. Ich habe die Zeichenfolge nur vorangestellt "&8<MQSlqr{", um sie nicht zu diskriminieren. Damit sich die Zeichenfolge jedoch nicht von selbst druckt, musste ich ein Leerzeichen hinzufügen, also habe ich zwei Leerzeichen hinzugefügt.

&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) nimmt eine Sequenz und gibt die Länge jedes Laufs desselben Zeichens aus, z. "aaabbcc"wird [[3, "a"], [2, "b"], [2, "c"]].

Dies nimmt also die Eingabe, sortiert sie, um sie in Längencodierung zu setzen, und nimmt das erste Element jeder Liste in der resultierenden Liste (z. B. würde das frühere Beispiel werden [3, 2, 2]). Dies gibt an, wie oft Zeichen vorkommen. Dann wird es dedupliziert (das frühere Beispiel würde [3, 2]), und J wird darauf gesetzt.

Dann wird geprüft, ob die Länge 1 ist, dh, es gibt nur 1 eindeutige Häufigkeit, mit der ein Zeichen vorkommt, und ob dies> 1 ist, dh> = 2.

Es könnte eine integrierte in sein zu ersetzen rSz8oder hMrSz8aber ich kann nicht finden.


1

C (gcc) 153 Bytes

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);}}}}}}}

Probieren Sie es online!

Gibt die Adresse des Strings als Wahrheitswert und Null als Falsch zurück.

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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.