Pemrograman Non-diskriminatif

74

Kami mengatakan string tidak membedakan jika masing-masing karakter string muncul jumlah yang sama dan setidaknya dua kali.

Contohnya

  • "aa!1 1 !a !1"adalah non-diskriminatif karena masing-masing karakter , !, adan 1muncul tiga kali.
  • "abbaabb"adalah tidak non-diskriminatif karena bmuncul lebih sering daripada a.
  • "abc"juga tidak non-diskriminatif karena karakter tidak muncul setidaknya dua kali.

Tugas

Tulis program atau fungsi non-diskriminatif yang mengembalikan nilai kebenaran jika string yang diberikan tidak diskriminatif , dan nilai palsu sebaliknya.

Yaitu, program yang dijalankan dengan kode sumbernya sendiri harus mengembalikan nilai kebenaran.

Setiap kiriman harus dapat menangani string non-kosong yang berisi ASCII yang dapat dicetak , serta semua karakter yang muncul dalam kode sumber kiriman.

Uji Kasus

Benar:

<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
sumber
4
@Laikoni apakah kita bisa menyalahgunakan komentar agar ini berfungsi?
Magic Octopus Urn
6
Sebagai catatan, saya suka tantangan di mana saya bisa menggunakan entri lain untuk menguji validitas entri saya.
Magic Octopus Urn
3
@ MagicOctopusUrn Saya pikir dia memang mengatakan di kotak pasir yang diizinkan, karena itu tidak dapat ditentukan secara jelas.
Erik the Outgolfer
11
Persis. Bahkan jika Anda entah bagaimana berhasil melarang komentar dengan cara yang objektif, lalu bagaimana dengan string literal yang tidak digunakan, dll? Pokoknya, saya pikir penilaian memberi insentif untuk menghindari komentar sebanyak mungkin.
Laikoni
4
Saya mengerti itu hanya teka-teki, tetapi penggabungan "non-diskriminatif" dengan "semua jenis anggota berlabel yang dapat diidentifikasi yang ada di bagian yang sama persis" agak mengganggu ... Untuk "membedakan" berarti "untuk membedakan antara", dan untuk melakukan hal ini secara tidak adil berarti memperlakukan atau menghakimi seseorang secara tidak adil berdasarkan melihat mereka berbeda dari kelas orang lain. Tentu saja, teruslah bersenang-senang!
ErikE

Jawaban:

37

Brachylog , 10 byte

=ᵍbᵐbᵐlᵍ=l

Cobalah online!

Penjelasan

=ᵍ                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.Piz
sumber
25

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

Cobalah online.
Kode digunakan untuk memverifikasi kemunculan karakter , yang merupakan jawaban saya untuk tantangan ini .

-5 byte terima kasih kepada @ OlivierGrégoire lagi dengan menyingkirkan komentar dan membuat kekacauan. ;)

Jawaban lama 168 byte (char-count 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::::{{{{{;;||||}}}}}>>

Cobalah online.
Kode digunakan untuk memverifikasi kemunculan karakter yang tidak termasuk komentar , yang merupakan jawaban saya untuk tantangan ini .

-6 byte berkat @ OliverGrégoire menghapus <dengan menukar cek ke >.

Penjelasan program dasar golf (98 byte):
Cobalah secara 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

Beberapa hal yang saya lakukan untuk mengurangi jumlah karakter yang digunakan:

  • Nama variabel o, w, u, f, r, dan edipilih dengan tujuan untuk digunakan kembali karakter kita sudah punya (tapi tidak melebihi 6).
  • 2222digunakan sebagai ganti 256.
  • Berubah jika periksa e>0&u!=e|u<2ke !(e<2|u==e)|u<2untuk menghapus 6x &.
  • Menghapus dua pengembalian yang terpisah dan menggunakan bendera f, dan kami mengembalikan apakah masih 0 pada akhirnya (ini berarti saya dapat menghapus 6x bydari bytesekarang yang hanya kami gunakan ndalam int6 kali, bukan 8).
  • e<2dan u<2diubah menjadi 2>edan 2>uuntuk menghapus 6x <.

Apa yang saya lakukan untuk mengurangi char-count 6 hingga 5:

  • 2x intuntuk bytejadi jumlah nyang digunakan adalah 4 bukan 6.
  • Digunakan x[0]alih-alih variabel baru f=0sehingga jumlah yang =digunakan adalah 5, bukan 6.
  • Berubah 2222ke 3333sehingga jumlah 2digunakan adalah 2 bukan 6.
  • Mengubah variabel fdan rlagi sehingga mereka tidak lagi 6.

Apa yang dilakukan @ OlivierGrégoire untuk menghilangkan komentar, dan karenanya 5x /:

  • Menambahkan variabel yang tidak digunakan ,i,fe,fi,w;.
  • Menambahkan label yang tidak terpakai: s:w:no0r3sswwyyy:.
  • Menambahkan yang tidak digunakan |2>2
  • Menambahkan {}sekitar for-loop dan ifs, dan menambahkan {}-block yang tidak digunakan .
  • Berubah !menjadi !!!.
  • Berubah |menjadi ||.
  • Mengubah 333untuk +333-3|2menyingkirkan sisa operator aritmatika +-|dan 2.
  • Berubah !(x[0]>0)menjadi !!(0>--x[0]).
Kevin Cruijssen
sumber
1
180 byte : ubah semua<menjadi>.
Olivier Grégoire
@ OlivierGrégoire Maaf, saya sudah di 174 :) Tapi akan melihat apakah trik Anda masih bisa diterapkan.
Kevin Cruijssen
Perubahan masih bisa diterapkan untuk menghemat 6 byte.
Olivier Grégoire
Saya terdekat dengan 162 karakter (161 karakter) . Saya mencoba menghapus komentar, tetapi saya masih harus meletakkan koma di suatu tempat. Saya tidak dapat menemukan tempat.
Olivier Grégoire
1
160 byte ( bukti ). Sangat mungkin lebih golf.
Olivier Grégoire
15

Jelly , 18 16 12 10 byte

Ġ¬zḊḊ¬zĠȦȦ

Cobalah online!

Bagaimana itu bekerja

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

Brachylog , 14 12 byte

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

Cobalah online!

Penjelasan

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

Solusi 12-byte alternatif yang menggunakan kembali talih-alih :

ọtᵐ==tℕ₂ℕ₂ọᵐ
Martin Ender
sumber
13

T-SQL, 320 byte (masing-masing 32 karakter x 10)

Input melalui tabel yang sudah ada sebelumnya FILLdengan bidang varchar STEW, sesuai standar IO kami .

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

Saya tidak pernah lebih senang, namun ngeri, dengan sepotong kode.

Harus dijalankan di server atau basis data yang diatur ke pemeriksaan case-sensitive. Ada 10 masing-masing 32 karakter yang berbeda, termasuk huruf besar dan kecil E(perintah SQL tidak peka huruf besar-kecil, sehingga membalik beberapa sesuai kebutuhan), spasi dan tab (tab ditampilkan sebagai jeda baris dalam kode di atas, agar mudah dibaca).

Saya menemukan cara untuk memasukkan 10 masing-masing simbol lain + = ,dalam kode, tetapi sayangnya tidak dapat menemukan cara untuk melakukannya <, jadi saya harus menambahkan karakter komentar -.

Berikut adalah kode yang diformat sebelum saya menjejali semua pengisi ekstra:

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)

Baris teratas adalah CTE rekursif yang menghasilkan tabel angka b, yang kita gabungkan ke string sumber untuk dipisahkan oleh karakter. Karakter-karakter tersebut dikelompokkan dan dihitung, dan IIFpernyataan mengembalikan 0 atau 1 tergantung pada apakah string input tidak diskriminatif.

BradC
sumber
11

C (gcc) ,  333  168 byte

Terima kasih kepada @Kevin Cruijssen karena telah menghemat 9 byte dan terima kasih kepada @Laikoni karena telah menghemat 45 byte!

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

Cobalah online!

C, 333 byte

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

Bahkan bytecount tidak diskriminatif!

Cobalah online!

Steadybox
sumber
Awwhh ... Saya ingin menjadi pelaku komentar pertama. Yang bagus, saya suka bagaimana Anda mengurutkan karakter untuk komentar ^ _ ^
Magic Octopus Urn
1
Anda dapat menurunkannya menjadi 324 byte dengan mengubah kedua 128hingga 222sehingga 8dapat dijatuhkan.
Kevin Cruijssen
1
279 byte oleh nama i, v, S, sdan Luntuk karakter yang sudah muncul dalam kata kunci char, fordan return: Cobalah secara online!
Laikoni
@Laikoni Terima kasih! Saya tidak punya waktu untuk bermain golf dengan benar kemarin.
Steadybox
@ MagicOctopusUrn Mereka disortir karena saya terlalu malas untuk menambahkannya dengan tangan .
Steadybox
9

05AB1E , 20 18 16 14 byte

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

Cobalah online!

Program ini pada dasarnya dibagi menjadi 2 bagian di mana tujuan dari bagian pertama adalah untuk melakukan tugas yang sebenarnya dan tujuan dari bagian kedua adalah menggunakan fungsi yang sama seperti bagian pertama tanpa mengubah hasilnya.

Penjelasan (bagian pertama)

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

Penjelasan (bagian kedua)

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
sumber
{γ€gDË*P≠qq{γ€gDË*P≠lain untuk 20;).
Magic Octopus Urn
1
@MagicOctopusUrn: Bagus! Saya punya beberapa orang lain di 20 juga. Saya punya satu di 18 sekarang juga :)
Emigna
2
SIHIR! Tidak ada penjelasan lain!
Magic Octopus Urn
1
¢... ide bagus, juga aku senang melihat itu berguna seperti yang kupikir mungkin haha!
Magic Octopus Urn
9

Sekam , 14 byte

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

Cobalah online!

Penjelasan

Dua baris pendek adalah no-ops, karena fungsi utama tidak pernah memanggil mereka.

§<ε#ε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
sumber
Tetapi ini memiliki 'kamu' lebih dari 'm', jadi itu tidak memenuhi persyaratan.
WGroleau
@WGroleau mjuga terjadi dua kali: di baris pertama dan di baris kedua. Penjelasan tidak termasuk dua garis pendek karena mereka tidak mempengaruhi perilaku program.
Zgarb
Saya kira OP harus mengklarifikasi apakah penjelasan program dapat dipindai bersama dengan program tersebut. Tetapi sebenarnya, jika Anda memasukkannya, maka Anda memiliki empat 'u' dan dua 'm'
WGroleau
Lupakan; ini membingungkan saya dengan cara yang sama jawaban lain lakukan.
WGroleau
9

Python 2 , 75 69 byte

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

Output adalah melalui ada atau tidak adanya kesalahan. Kesalahannya adalah ValueError (satu atau lebih karakter muncul hanya sekali) atau NameError (jumlah karakter tidak sama).

Cobalah online!

Dennis
sumber
Trik kesalahan shift negatif negatif! Saya suka bagaimana hal itu mengambil keuntungan dari operator shift yang lebih diutamakan.
Vincent
1
{{e.dil:-tu,r.dil:-tu,}} Tuan yang baik apa itu?
Adam Barnes
1
@AdamBarnes Omong kosong yang valid secara sintaksis yang melempar NameError jika dievaluasi.
Dennis
Saya tidak mengerti. Saya mencoba menukarnya adan semuanya pecah. Bisakah Anda jelaskan lebih lanjut?
Adam Barnes
@ AdamBarnes Itu seharusnya berfungsi, selama Anda meninggalkan tempat setelah or. Saya akan menambahkan penjelasan ketika saya di depan komputer.
Dennis
9

Brachylog v2, 8 byte (dalam rangkaian karakter Brachylog)

oḅ\k\koḅ

Cobalah online!

Sepertinya sudah ada perang golf yang terjadi pada pertanyaan ini di Brachylog, jadi saya pikir saya akan bergabung, menghemat beberapa byte untuk jawaban terbaik berikutnya.

Ini adalah program lengkap yang mengambil input sebagai daftar kode karakter. (Ini sebagian karena Brachylog tampaknya memiliki beberapa bug yang sangat aneh terkait dengan garis miring terbalik di string, dan sebagian karena \perintah tidak bekerja pada daftar string.)

Penjelasan

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)

Pada koḅakhirnya tidak relevan; kakan selalu memiliki elemen untuk ditindaklanjuti dan odan tidak dapat gagal jika diberi daftar sebagai input.

Alasan untuk memulai oḅharus jelas; itu mempartisi daftar input berdasarkan nilai, misalnya [1,2,1,2,4,1]akan menjadi [[1,1,1],[2,2],[4]]. Agar setiap karakter muncul jumlah kali yang sama, masing-masing daftar ini harus memiliki panjang yang sama, yaitu daftar yang dihasilkan adalah persegi panjang. Kita dapat menegaskan penggunaan segi empat ini \, yang juga mentransposisi baris dan kolom sebagai efek samping.

Kami sekarang memiliki nilai saat ini yang terdiri dari beberapa salinan dari rangkaian karakter, misalnya jika inputnya adalah [4,2,1,2,4,1]nilai saat ini [[1,2,4],[1,2,4]]. Jika kita menghapus salinan, matriks yang dihasilkan masih berbentuk persegi panjang, jadi kita bisa mengubahnya kembali menggunakan \. Namun, jika alasan matriks adalah persegi panjang adalah bahwa semua input karakter yang berbeda, matriks yang dihasilkan akan memiliki elemen yang tersisa, dan \tidak tidak memperlakukan "0 × 0" matriks sebagai persegi panjang (lebih tepatnya, gagal). Jadi oḅ\k\secara efektif menegaskan bahwa setiap karakter yang muncul dalam input muncul jumlah kali yang sama, dan jumlah kali itu bukan 1.

Itulah seluruh fungsionalitas program kami (sebagai program penuh, kami dapatkan truejika tidak ada kegagalan pernyataan, falsejika beberapa terjadi). Kita harus mematuhi batasan tata letak sumber, jadi saya menambahkan tambahan koḅyang tidak memiliki tujuan tetapi tidak dapat gagal (tidak seperti \, odan senang untuk bertindak pada daftar kosong).

ais523
sumber
1
Ini bahasa bulan ini !
Erik the Outgolfer
7

Python 2 , 84 80 byte

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

Cobalah online!

Vincent
sumber
+1 untuk kode Python pendek yang tidak menghasilkan kesalahan dan utopia ram kami;)
Shieru Asakoto
7

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

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

Cobalah online!

24 karakter berbeda * 6 kali masing-masing

28 karakter berbeda * 5 kali masing-masing

27 karakter berbeda * 5 kali masing-masing

27 karakter berbeda * masing-masing 4 kali

26 karakter berbeda * masing-masing 4 kali

25 karakter berbeda * masing-masing 4 kali

24 karakter berbeda * masing-masing 4 kali

Penjelasan

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
sumber
6

PowerShell , 104 byte

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

Cobalah online!

Ini sangat menyenangkan untuk bermain golf. Batasannya adalah $, yang kita butuhkan minimal empat (satu untuk input $args, satu untuk menetapkan hasil perhitungan $qe, satu untuk memeriksa karakter terakhir $qe[-1]dan satu untuk memeriksa karakter pertama $qe[0], sehingga itu adalah jumlah karakter maksimum yang bekerja.

Dari sana, itu masalah golf (dan bukan-golf, seperti memiliki nama variabel dua huruf) untuk membuat program dibagi dengan baik oleh empat. Perhatikan bahwa kami memiliki komentar kecil (semuanya mengikuti #) untuk menjelaskan beberapa elemen yang hilang, tetapi saya mencoba menjaga komentar sekecil mungkin.

AdmBorkBork
sumber
6

Haskell, 90 75 72 byte

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

Setiap karakter muncul 6 kali. String input diambil sebagai daftar tunggal .

Cobalah online!

Untuk referensi, versi lama:

75 byte, masing-masing karakter 5 kali

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

Cobalah online!

90 byte, masing-masing karakter 3 kali:

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

Cobalah online!

nimi
sumber
6

Python 2 , 108 104 92 88 byte

-12 byte terima kasih kepada Rod
-4 byte terima kasih kepada Kevin Cruijssen

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

Cobalah online!

ovs
sumber
1
Program Anda harus non-diskriminatif.
user202729
1
Program itu sendiri harus non-diskriminatif.
HyperNeutrino
@ user202729 Terima kasih telah memberi tahu saya, saya memperbarui jawaban saya.
ovs
6

MATL , 12 byte

q&=sqt&=tsvv

Inputnya adalah string yang dilampirkan dalam tanda kutip tunggal. Kutipan tunggal dalam string diloloskan dengan duplikasi.

Output adalah matriks non-kosong, yang truthy jika tidak mengandung nol, dan falsy jika mengandung setidaknya nol.

Cobalah online! Atau verifikasi semua kasus uji , termasuk uji kebenaran / kepalsuan standar untuk kenyamanan.

Bagaimana itu bekerja

Pernyataan yang ditandai (*)tidak diperlukan atau berbahaya, dan telah dimasukkan hanya untuk membuat kode sumber tidak diskriminatif.

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
sumber
5

Perl 5 , -p57 byte

Setiap karakter muncul 3 kali. Hanya satu yang 1tidak melakukan apapun

12 byte ditambahkan ke solusi 45 karakter dasar untuk membuat non-diskriminatif

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

Cobalah online!

Ton Hospel
sumber
5

R , 90 byte

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

Cobalah online!

Output TRUEuntuk string yang tidak diskriminatif, dan FALSEuntuk string yang diskriminatif. Saya telah menulis banyak kode jelek untuk tantangan di situs ini, tetapi saya pikir ini adalah yang paling jelek sejauh ini.

45 karakter, digunakan dua kali masing-masing (termasuk beberapa dalam komentar). Jawaban R terbaik sebelumnya adalah 116 byte , dengan 29 karakter digunakan masing-masing 4 kali; Saya memposting ini secara terpisah karena ini sangat berbeda.

Kode ini setara dengan

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

yang mengubah input ke vektor bilangan bulat, menghitung tabel kontingensi ydari nilai-nilai, kemudian memeriksa bahwa semua jumlah dalam tabel itu sama dengan jumlah pertama, dan bahwa jumlah pertama lebih besar dari 1.

Kesulitan awal adalah menggunakan hanya 2 pasang kurung. Ini dicapai dengan mendefinisikan kembali fungsi unary !dan ?menjadi utf8ToIntdan prodmasing - masing. (Saya tidak bisa menggunakan allkarena saya butuh a). Ada empat tugas: dua dengan =dan dua dengan <-. Ini berarti bahwa tes kesetaraan antara ydan ztidak dapat digunakan y==zjuga y-z; y%in%zdatang untuk menyelamatkan.

Menentukan fungsi-fungsi ini menggunakan semua tanda kutip yang mungkin: dua tanda kutip ganda, dua tanda kutip tunggal, dan saya akan membutuhkan dua tanda kutip pada paragraf berikutnya, jadi saya harus menggunakan readLines()alih-alih scan(,""). (Pilihan lain, seperti scan(,letters)atau scan(,month.abb)semua menggunakan barang berharga t yang tidak bisa saya simpan.)

Pada titik ini, saya memiliki sebagian besar blok bangunan: utf8ToInt, prod, table, readLines, %in%. Tiga karakter muncul tiga kali dalam nama mereka: ent. Pertama, saya menemukan itu table(foo)setara dengan xtabs(~foo), menyimpan e. Saya dapat menyelamatkan ndan tdengan trik kode hex / oktal ; solusi golfiest adalah menggunakan u\164f8ToI\x6Et(dalam backticks) untuk utf8ToInt.

Robin Ryder
sumber
Sangat mengesankan Anda dapat membedakan dua kasus dalam 90 byte (dan penyalahgunaan yang baik dari operator bantuan), tetapi sayangnya NAtidak dianggap sebagai nilai yang benar (dalam R, jika (NA) x NAselain itu menyebabkan kesalahan, jadi tidak benar atau salah) )
JDL
1
@JDL Terima kasih, kamu benar. Hasil edit terbaru memperbaiki masalah ini.
Robin Ryder
1
@ JDL komentar menunjukkan bahwa jawaban yang konsisten dan berbeda tidak masalah untuk kebenaran dan kepalsuan.
Giuseppe
@ Giuseppe Sebenarnya, saya memecahkan masalah ini beberapa detik yang lalu (lihat versi baru, yang sangat berbeda tetapi jumlah byte yang sama); sekarang menampilkan TRUE dan FALSE.
Robin Ryder
4

Brachylog , 18 byte

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

Cobalah online!

Sayangnya, saya tidak dapat menghapus umpan baris, karena pada nomor memicu kegagalan.

Erik the Outgolfer
sumber
Sangat mungkin untuk melakukan sesuatu yang lebih pendek yang tidak memerlukan umpan garis (tetapi Anda mungkin perlu mengubah beberapa hal);)
Fatalize
@Fatalize Tidak ada waktu untuk saat ini, dan ya saya memang membaca diskusi itu. :)
Erik the Outgolfer
4

Ruby , 87 78 byte

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

26 karakter diulang 3 kali masing-masing

Cobalah online!

Asone Tuhid
sumber
@nimi Terima kasih telah menunjukkannya, saya pikir itu adalah keanehan dengan getsdan ;. Menggantinya, lebih pendek dari lambda
Asone Tuhid
3

R, 132 116 byte

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

Itu tidak mengandung komentar atau string berlebihan, baik, meskipun ini mungkin akan menjadi satu-satunya waktu saya di golf kode memanggil fungsi crudcardounenforceableuploads. Mungkin ada anagram yang bagus di sana di suatu tempat untuk nama fungsi! Terima kasih kepada John Dvorak karena menunjukkan pemecah anagram yang bagus, yang saya gunakan untuk namanya.

Tabel karakter:

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

contoh:

> 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
sumber
tidak tahu apakah jumlah byte itu penting, tetapi kita mungkin dapat menghapus 2s dan >s, dengan memutar perbandingannya dengan f. Juga bisa digunakan =sebagai ganti <<-. strsplitmungkin tidak dapat dihindari, yang merupakan sumber dari sebagian besar karakter lain.
JDL
apakah Anda membutuhkan ruang? Anda juga bisa mencoba utf8ToIntbukan strsplit, tapi tidak yakin apakah yang akan membantu. Juga mungkin menyertakan tautan ke TIO?
Giuseppe
juga semua .tampaknya berlebihan.
Giuseppe
Ini adalah kode-golf , jadi jumlah byte penting, sesuai komentar Anda.
Giuseppe
2
beberapa anagram yang mungkin: tidak ada birokrasi lemari berikat pip; RIP celup dipanaskan dengan karbon. Ditemukan menggunakan wordplays.com/anagrammer
John Dvorak
2

BASH 144 byte

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

Baris kode ini mengambil string stdin sebagai input. "Grep -o." menempatkan setiap karakter pada baris baru. "uniq -c" menghitung penggunaan setiap chacter. Script awk membuat array dengan setiap penggunaan sebagai elemen yang berbeda, dan menghasilkan true ketika hanya ada 1 indeks array dan nilainya paling sedikit 2. Setiap karakter digunakan 4 kali, jadi sumber ini mengembalikan true

Caleb
sumber
2

Stax , 26 24 18 byte

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

Cobalah online!

Solusi terpendek sejauh ini yang hanya menggunakan ASCII yang dapat dicetak Dipukul oleh MATL.

Kira saya mendekati masalah dengan cara yang salah. Mengulangi blok kerja tidak golf atau menarik. Sekarang setidaknya terlihat lebih baik ...

Penjelasan

:u{m* menghasilkan beberapa sampah yang tidak mempengaruhi output.

_{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
sumber
@WGroleau karakter mana yang muncul sekali? Apakah Anda membaca jawaban saya cukup hati-hati?
Weijun Zhou
'#' muncul lebih sering daripada ':' (hanya satu contoh). Ups, salah membaca (lihat komentar lain)
WGroleau
@WGroleau Tepatnya ada dua #dan dua :, apakah Anda membaca jawaban saya di baris kedua? Apakah Anda hanya melewatkan paragraf pertama di "Penjelasan" saya?
Weijun Zhou
Maaf, pikir kalimat di atas penjelasannya adalah semuanya.
WGroleau
1

Pip , 22 byte

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

Cobalah online!

Penjelasan

Setiap karakter muncul dua kali.

                        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

Alternatif versi 22-byte dengan no-op yang lebih sedikit:

$&MY_Y_NaMa$=y&--1=1Ny
DLosc
sumber
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 karakter berbeda, masing-masing diulang 4 kali.

Tidak ada komentar yang digunakan (tetapi ungkapan setelah neXTtidak pernah benar-benar dievaluasi)

Script untuk memeriksa jawaban:

12Me21
sumber
1

Retina 0.8.2 , 168 90 byte

Output akan kosong jika salah, atau tidak kosong jika benar.

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

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

Cobalah online

Program inti (39 byte)

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

Penjelasan

Seluruh program inti berada dalam lingkaran diam. Tahap pertama mengurutkan input. Tahap kedua akan mencetak string saat ini jika terdiri dari pasangan karakter yang berbeda secara berurutan. Tahap ketiga menghapus kemunculan terakhir dari setiap karakter (menghapus satu dari setiap karakter dalam string).

Tentang sampah di atas: urutannya penting. Selain harus valid secara sintaksis, tanda titik koma harus berada setelah tanda bintang dan sebelum backtick, selama *berada dalam string konfigurasi, agar tidak dicetak.

mbomb007
sumber
Bagus, jawaban saya lebih pendek tapi saya tidak yakin itu baik untuk diperbaiki untuk 0/1 sebagai output, jadi saya hanya akan menambahkannya di sini jika itu membantu Anda: tio.run/##K0otycxLNPz/…
FryAmTheEggman
@FryAmTheEggman Saya mencari solusi regex murni untuk mencocokkan grup karakter dengan panjang yang sama semua berturut-turut, tapi saya tidak bisa mengetahuinya.
mbomb007
@FryAmTheEggman Membuat peningkatan besar! Saya tidak benar-benar menggunakan apa yang Anda miliki, tetapi saya mulai dari awal mencoba memikirkan metode yang lebih baik.
mbomb007
Bagus sekali! Dan sepertinya saya belum cukup memikirkan program saya, tetapi setidaknya Anda menemukan yang lebih baik :)
FryAmTheEggman
1

CoffeeScript 1 , 96 93 90 byte

(q,a=q.split(h).length-1for h in[q][0])->a.every (w,s,pplitnggffoorsvvyy)->w>1&&a[0&10]==w

Cobalah online!

Dimulai dari jawaban ES6 saya tetapi berjalan kembali menggunakan Array.every. 32 31 30 token @ 3 masing-masing

Shieru Asakoto
sumber
1

Pyth, 30 byte

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

Ruang terkemuka diperlukan.

Cobalah online!

Program yang sebenarnya adalah adil &q1lJ{hMrSz8<1hJ. Saya hanya menambahkan string "&8<MQSlqr{"agar tidak diskriminatif. Tetapi untuk membuat string tidak mencetak sendiri, saya harus menambahkan spasi, jadi saya menambahkan 2 spasi.

&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_encodedi sini ( r <any> 8) mengambil urutan dan menampilkan panjang masing-masing proses dengan karakter yang sama, mis. "aaabbcc"menjadi [[3, "a"], [2, "b"], [2, "c"]].

Jadi ini membutuhkan input, mengurutkannya untuk memasukkan penyandian panjang, dan mengambil elemen pertama dari setiap daftar dalam daftar yang dihasilkan (misalnya, contoh sebelumnya akan menjadi [3, 2, 2]). Ini menghitung berapa kali karakter muncul. Maka itu deduplicated (contoh sebelumnya akan menjadi [3, 2]), dan J diatur untuk itu.

Kemudian memeriksa apakah panjangnya 1, yaitu hanya ada 1 jumlah unik kali suatu karakter terjadi, dan jika itu adalah> 1, yaitu> = 2.

Mungkin ada built-in untuk menggantikan rSz8atau hMrSz8tetapi saya tidak dapat menemukannya.

RK.
sumber
1

C (gcc) , 153 byte

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

Cobalah online!

Mengembalikan alamat string sebagai nilai kebenaran, dan nol sebagai kepalsuan.

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
sumber
1

Perl 6 , 58 57 byte

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

Cobalah online!

Ternyata versi tiga karakter sedikit lebih pendek dari dua karakter satu.

Jo King
sumber