Kejadian Tertinggi atau Terendah?


13

Tantangan:

Input:

  • String yang berisi ASCII yang dapat dicetak (tidak termasuk spasi, tab, dan baris baru)
  • A boolean

Keluaran:

Bagian-bagian dari String dibagi menjadi empat kelompok:

  • Huruf kecil
  • Huruf besar
  • Digit
  • Lain

Berdasarkan boolean, kami dapat menampilkan kemunculan tertinggi satu (atau kelipatan) dari empat kelompok ini, atau yang terendah, menggantikan yang lainnya dengan spasi.

Sebagai contoh:

Input: "Just_A_Test!"
Berisi:
- 3 huruf besar: JAT
- 6 huruf kecil: ustest
- 0 digit
- 3 lainnya:__!

Ini akan menjadi output untuk trueatau false:

true:   " ust    est "

// digits have the lowest occurrence (none), so everything is replaced with a space
false:  "            "

(Catatan: Anda diizinkan untuk mengabaikan spasi tambahan, sehingga hasilnya juga bisa " ust est"dan"" masing masing.)

Aturan tantangan:

  • Input tidak akan pernah kosong atau berisi spasi, dan hanya akan terdiri dari ASCII dicetak dalam rentang 33-126atau '!'melalui '~'.
  • Anda diizinkan untuk mengambil input dan / atau output sebagai karakter-array atau daftar jika Anda mau.
  • Dua nilai yang konsisten dan berbeda untuk boolean diizinkan: true/ false; 1/ 0; 'H'/ 'L'; "highest"/ "lowest"; dll. Perhatikan bahwa nilai-nilai yang berbeda ini harus digunakan (agak) sebagai boolean! Jadi tidak diperbolehkan memasukkan dua program lengkap, satu yang memberikan hasil yang benar untuk truedan yang lainnya untuk false, dan kemudian hanya memiliki kode Anda yang sebenarnya <run input with parameter>. Celah default baru yang relevan yang telah saya tambahkan, meskipun masih dapat menggunakan banyak finetuning mengenai definisi ..
  • Jika kemunculan dua atau lebih kelompok adalah sama, kami menampilkan semua kemunculan itu.
  • Ruang trailing yang diperlukan adalah opsional, dan satu baris baru trailing juga opsional. Ruang terkemuka yang diperlukan wajib diisi. Dan spasi atau baris baru lainnya tidak diperbolehkan.

Aturan umum:

  • Ini adalah , jadi jawaban tersingkat dalam byte menang.
    Jangan biarkan bahasa kode-golf mencegah Anda memposting jawaban dengan bahasa non-codegolf. Cobalah untuk memberikan jawaban sesingkat mungkin untuk bahasa pemrograman 'apa pun'.
  • Aturan standar berlaku untuk jawaban Anda, jadi Anda diperbolehkan menggunakan STDIN / STDOUT, fungsi / metode dengan parameter yang tepat, program lengkap. Panggilanmu.
  • Celah default tidak diperbolehkan.
  • Jika memungkinkan, silakan tambahkan tautan dengan tes untuk kode Anda.
  • Juga, silakan tambahkan penjelasan jika perlu.

Kasus uji:

Inputs:                              Output:

"Just_A_Test!", true                 " ust    est "     (or " ust    est")
"Just_A_Test!", false                "            "     (or "")
"Aa1!Bb2@Cc3#Dd4$", either           "Aa1!Bb2@Cc3#Dd4$"
"H@$h!n9_!$_fun?", true              " @$ !  _!$_   ?"
"H@$h!n9_!$_fun?", false             "H     9        "  (or "H     9")
"A", true                            "A"
"A", false                           " "                (or "")
"H.ngm.n", true                      "  ngm n"
"H.ngm.n", false                     "       "          (or "")
"H.ngm4n", false                     "H.   4 "          (or "H.   4")

Apakah dapat menerima paling banyak / paling sedikit sebagai entri terpisah? Misalnya, untuk kasus uji "hashing is fun", dapatkah "H "dan " 9 "(dengan spasi yang sesuai) dijadikan keluaran alih-alih "H 9"?
AdmBorkBork

@ AdmBorkBork Saya tidak mengerti maksud Anda; keduanya Hdan 9merupakan bagian dari "paling sedikit".
Erik the Outgolfer

Bisakah nilai input boolean menjadi "max"/ "min", yang kemudian digunakan Math[b]untuk merujuk ke Math.maxatau Math.min?
Justin Mariner

@JustinMariner Anda tahu .. Saya berubah pikiran menyesal tentang itu. Saya kira itu untuk JS? Saya pikir banyak bahasa pemrograman dapat memanfaatkan sesuatu seperti ini, jadi terlalu banyak jawaban yang ada harus diubah. Maaf, Anda harus menyimpan b?"max":"min"jawaban Anda .. Ini adalah garis yang bagus saya kira, mungkin saya harus menggunakan nilai truthy / falsey lain kali ..
Kevin Cruijssen

Jawaban:


3

Sekam , 27 26 24 22 byte

-2 byte terima kasih kepada Zgarb

-2 byte terima kasih kepada Leo

Dibawa ' 'as Falsedan 'a'as True(In Husk, spasi putih di Fasly dan semua karakter lainnya adalah Truthy)

Fż▲→ġ#¬Ö#≡⁰Ṫḟë½D±o¬□m;

Cobalah online!

Bagaimana cara kerjanya?

Fż▲→ġ#¬Ö#≡⁰Ṫḟë½D±o¬□m;   Function, takes a character c and a string S as arguments
                    m;   Wrap each character in S into it's own string
             ë           List of four functions returning booleans:
              ½D±o¬      Lower case?,Upper case?,Digit?,Not alphanumeric?
           Ṫḟ            Outer product with find†
       Ö#≡⁰              Sort on how many characters have the same Truthyness as c
    ġ#¬                  Group strings with equal numbers of spaces
   →                     Take the last group
Fż▲                      Squash it all into one list

adalah fungsi yang mengambil predikat pdan daftar Ldan mengembalikan elemen pertama Lyang memuaskan p. Jika tidak ada elemen yang memenuhi pargumen default dikembalikan. Dalam hal ini ' '. Dengan menerapkan ke string satu karakter, kami pada dasarnya mengatakan if p c then c else ' '.

Apakah fungsi yang mengambil fungsi fdan dua daftar L1, L2. Ini mengembalikan tabel fditerapkan pada semua pasangan L1dan L2. Dalam hal ini fadalah , L1adalah daftar 4 fungsi kami, dan L2merupakan daftar string satu karakter.

Setelah Ṫḟkami memiliki daftar string di mana setiap string adalah hasil dari penggantian karakter yang tidak memenuhi salah satu aturan dengan a ' '.

NB: Dalam versi Husk yang lebih baru, ġ#¬Ö#≡⁰dapat diganti dengan k#≡⁰penghematan 3 byte!


Karena penasaran: mengapa ' 'dan 'a'? Mungkin saya mengerti lebih baik ketika penjelasan ditambahkan, karena saya tidak dapat membaca Husk. ;)
Kevin Cruijssen

Bagus! Inilah 24 byte yang digunakan .
Zgarb

@ Zgarb Terima kasih! Saya tidak begitu mengerti apa yang Mmmsaya lakukan sendiri :)
H.PWiz

Sayangnya ini tidak terlalu membantu dalam bermain golf, tetapi S`?' mungkin lebih sederhana seperti?IK'
Leo

Saya cenderung menghindari penggunaan I, terkadang itu membuat penerjemah butuh waktu lama. Sepertinya juga boros.
H.PWiz

7

Jelly , 31 byte

ØṖḟØBṭØBUs26¤f€³Lİ⁴¡$ÐṀFf
¹⁶Ç?€

Cobalah online!

Nilai boolean adalah 2dan 1(atau pasangan genap / ganjil lainnya), yang mewakili Truedan Falsemasing - masing. Saya akan mencoba menambahkan penjelasan setelah bermain golf lebih lanjut.

Terima kasih kepada caird coinheringaahing untuk menghemat 2 byte, dan untuk Lynn karena telah menghemat 4 byte! Berkat salah satu trik Erik , yang menginspirasi saya untuk menghemat 4 byte!

Bagaimana itu bekerja

Perhatikan bahwa ini adalah penjelasan untuk versi 35-byte. Yang baru kira-kira sama (tapi sedikit dimodifikasi oleh Lynn), jadi saya tidak akan mengubahnya.

ØBUs26f€³µ³ḟØBW,µẎLİ⁴¡$ÐṀF - Niladic helper link.
ØB                         - String of base digits: '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
                             abcdefghijklmnopqrstuvwxyz'. 
  U                        - Reverse.
   s26                     - Chop into sublists of length 26, preserving shorter
                             trailing substrings.
      f€³                  - For each, keep the common characters with the input.
            ØB             - Base digits.
          ³ḟ               - Get the signs in the input. Filter the characters of the
                             input that aren't alphanumeric.
              W,µẎ         - Concatenate (wrap, two element list, tighten).
                       ÐṀ  - Keep the elements with maximal link value.
                  L        - Length.
                    ⁴¡     - Do N times, where N is the second input.
                   İ       - Inverse. Computes 1 ÷ Length. 2 maps to the length itself,
                             because 1 ÷ (1 ÷ Length) = length; 1 yields
                             (1 ÷ Length), swapping the maximal numbers with minimal ones.
                         F - Flatten.

¹⁶e¢$?€ - Main link.
      € - For each character.
   e¢?  - If it is contained by the last link (called niladically), then:
¹       - Identity, the character itself, else:
 ⁶      - A space.


@cairdcoinheringaahing Terima kasih! :) Saya ingin bermain golf bagian itu sejak saya memposting jawabannya, tapi saya tidak tahu mengapa itu tidak berhasil ... Saya punya µD yang asing :
Mr. Xcoder

31 byte : menghasilkan kelas sebagai ØṖḟØBṭØBUs26¤, dan kemudian menguji keanggotaan dengan fdan Çbukannya e¢$.
Lynn


5

R , 193 186 179 158 byte

-7 byte terima kasih kepada NofP dan sarannya cbind

-6 byte menggunakan outer, -1 byte beralih [^a-zA-Z0-9]dengan[[:punct:]]

-21 byte, terima kasih kepada MickyT karena menunjukkan daftar karakter yang diizinkan

function(S,B){y=outer(c("[a-z]","[A-Z]","\\d","[[:punct:]]"),S,Vectorize(grepl))
S[!colSums(y[(s=rowSums(y))=="if"(B,max,min)(s),,drop=F])]=" "
cat(S,sep='')}

Verifikasi semua kasus uji

Membawa 1/Tsebagai truthy ( max) dan0/F sebagai falsey ( min), dan diambil Ssebagai daftar karakter tunggal.

Cobalah online!

Dalam versi asli saya (dengan saran NofP), matriks ydibangun dengan mengevaluasi grepl(regex, S)untuk masing-masing regex, kemudian menggabungkannya bersama-sama sebagai kolom dari sebuah matriks. Ini menghasilkan beberapa panggilan grepl, tetapi sebagaiS yang diperbaiki, tampaknya ada hal lain yang perlu dilakukan. Seperti yang saya perhatikan:

Ada beberapa pendekatan yang berpotensi lebih pendek; mapply, sebagai contoh:

y=mapply(grepl,c("[a-z]","[A-Z]","\\d","[^a-zA-Z0-9]"),list(S))

Sayangnya, ini tidak akan disederhanakan sebagai matriks dalam contoh 1 karakter "A".

Saya menggunakan outerdaripada mapply, yang selalu mengembalikan array (matriks dalam kasus ini), dan terpaksaVectorize grepl , yang benar-benar hanya sebuahmapply pembungkus di sekitarnya.

Saya juga menemukan grup karakter standar [:punct:]yang cocok dengan karakter tanda baca (non-spasi, non-alfanumerik).


1
Jika Anda mengganti matriks dengan cbind, Anda dapat mengurangi hingga 186 byte: y = cbind (g ("[az]", S), g ("[AZ]", S), g ("\\ d", S), g ("[^ a-zA-Z0-9]", S))
NofP

@ NofP oh, sangat bagus. Anda juga dapat mengelilingi kode dengan backticks (`) untuk menampilkannya like this. :)
Giuseppe

Aturan menyatakan bahwa Anda dapat menggunakan array karakter atau daftar sebagai input, sehingga Anda mungkin dapat menghapusS=el(strsplit(G,""))
MickyT

@MickyT ah, saya mengabaikannya, terima kasih.
Giuseppe

4

Sekam , 31 29 28 byte

SMS?' `ṁ§foSM≠?▲▼⁰M#Kë½D±o¬□

Menggunakan 0 untuk minimal dan 1 untuk jumlah karakter maksimal. Cobalah online!

Penjelasan

Daftar fungsinya keren.

SMS?' `ṁ§foSM≠?▲▼⁰M#Kë½D±o¬□  Inputs are bit B and string S.
                     ë        Make a list L of the four functions
                      ½       is-lowercase-letter,
                       D      is-uppercase-letter,
                        ±     is-digit, and
                         o¬□  not is-alphanumeric.
                  M#          For each of them, take number of matches in S,
              ?▲▼⁰            take maximum or minimum depending on B,
          oSM≠                and mark those entries that are not equal to it.
        §f          K         Remove from L the functions that correspond to marked entries, call the result L2.
                              These functions test whether a character should be replaced by a space.
SM                            Do this for each character C in S:
      `ṁ                      Apply each function in L2 to C and sum the results.
  S?'                         If the result is positive, return space, otherwise return C.

4

Python 2 , 140 byte

g=lambda x:x.isalnum()-~(x>'Z')*x.isalpha()
def f(s,m):k=map(g,s).count;print''.join([' ',c][k(g(c))==sorted(map(k,range(4)))[m]]for c in s)

Cobalah online!

Jonathan Frech menyimpan satu byte. Terima kasih!

Tertinggi m=-1, terendah m=0.


1
Saya pikir Anda dapat menyimpan byte dengan mengganti +x.isalpha()*-~(x>'Z')dengan -~(x>'Z')*x.isalpha().
Jonathan Frech


3

Java (OpenJDK 8) , 448 439 432 362 361 354 352 348 343 320 byte

s->b->{int w[]=new int[4],m=0,n=-1>>>1,l;s.chars().forEach(c->{if(c>96&c<123)w[0]++;else if(c>64&c<91)w[1]++;else if(c>47&c<58)w[2]++;else++w[3];});for(int W:w){m=W>m?W:m;n=W<n?W:n;}l=m-n;m=b?m:n;return l<1?s:s.replaceAll("["+(w[0]!=m?"a-z":"")+(w[1]!=m?"A-Z":"")+(w[2]!=m?"\\d]":"]")+(w[3]!=m?"|[^a-zA-Z0-9]":"")," ");}

Cobalah online!



Anda dapat menghapus +in \\|+$untuk -1 byte tambahan.
Kevin Cruijssen

Anda dapat menyimpan tiga byte lagi dengan mengubah bagian terakhir menjadi String r=(w[0]!=m?"[a-z]|":"")+(w[1]!=m?"[A-Z]|":"")+(w[2]!=m?"[0-9]|":"")+(w[3]!=m?"[^a-zA-Z0-9]|":"");return r.isEmpty()?s:s.replaceAll(r.replaceAll(".$","")," ");}.
Kevin Cruijssen

Oh, dan n=s.length()bisa n=-1>>>1untuk tambahan -4.
Kevin Cruijssen

Oh, satu hal kecil lagi untuk bermain golf: [0-9]->\\d
Kevin Cruijssen

3

Ruby , 118 116 byte

Mengambil 0(terendah) atau -1(tertinggi) untuk argumen kedua.

-2 byte terima kasih kepada Lynn.

->s,t{s.gsub(/./){|c|[/\d/,/[a-z]/,/[A-Z]/,/[^\da-z]/i].group_by{|x|s.scan(x).size}.sort[t][1].any?{|x|x=~c}?c:" "}}

Cobalah online!

Tidak disatukan

->s,t{
  s.gsub(/./) {|c|
    [ /\d/,
      /[a-z]/,
      /[A-Z]/,
      /[^\da-z]/i
    ]
    .group_by {|x| s.scan(x).size }
    .sort[t][1]
    .any? {|x| x =~ c } ? c : " "
  }
}

Very cool answer! You can use -1 as the “highest” value and replace minmax[t] by sort[t].
Lynn

3

Python 2, 190 183 174 173 bytes

Thanks to Jonathan Frech for shortening it

from re import*
def f(i,c):
 q='[a-z]','[A-Z]','\d','[\W_]';l=[len(set(finditer(p,i)))for p in q]
 for j,k in enumerate(l):
	if k-eval(c):i=compile(q[j]).sub(' ',i)
 print i

This takes the strings 'max(l)' and 'min(l)' as true and false. (I don't think this breaks the rules...?) This is longer than the other two python answers but different so I thought I'd post it. I'm not a great golfer so I'm guessing this could be improved further but all the things I tried didn't work.

Try it online!


Hello, and welcome to the site! When I try to run this, I get errors, and I'm not entirely sure why. One reason could be that sum(1for m... should be sum(1 for m..., but I think there are other problems too. Could you provide a link to an online interpreter (such as tio) to demonstrate how you're calling this, and to show it isn't erroring?
James

@DJMcMayhem I just added a link, thanks for providing the link I wasn't sure how to do it. I am not getting an error when I run it there.
dylnan

Ah, I couldn't tell that you were inputting max(l) and min(l) as strings, that's why I was getting errors. Thanks for clearing that up! Although now, this is on the edge of violating rule #3, ` Note that these distinct values should be used (somewhat) as a boolean`, but it's definitely a little bit of a gray area.
James

BTW, here's a TIO pro-tip: If you put your function calls in the footer field, they won't be counted towards your byte count, so you can easily see how long your answer is: Try it online!
James

@DJMcMayhem Ah thanks. I agree it's kind of a gray area. I could take 'max' and 'min' as true false then do eval(c+'(l)') which adds 6 Bytes and seems more acceptable but until OP disallows my answer I'm assuming it's okay.
dylnan

2

JavaScript (ES6), 151 149 bytes

g=
(s,f,a=[/\d/,/[A-Z]/,/[a-z]/,/[_\W]/],b=a.map(r=>s.split(r).length))=>s.replace(/./g,c=>b[a.findIndex(r=>r.test(c))]-Math[f?"max":"min"](...b)?' ':c)
<input id=s oninput=o.textContent=g(s.value,f.checked)><input id=f type=checkbox onclick=o.textContent=g(s.value,f.checked)><pre id=o>

Sadly the rules probably don't allow me to pass Math.max or Math.min as the flag. Edit: Saved 2 bytes thanks to @JustinMariner.



1

Java (OpenJDK 8), 307 + 34 306 + 27 295 bytes

My "interesting" take on the challenge.

Thanks to Kevin Cruijssen for cutting down the import bytes removing the import entirely!

s->b->{String t=s.replaceAll("\\d","2").replaceAll("[a-z]","0").replaceAll("[A-Z]","1").replaceAll("\\D","3"),v="";int a[]={0,0,0,0},i=0,z=0,y=-1>>>1;t.chars().forEach(j->{a[j%4]++;});for(int x:a){z=x>z?x:z;y=x<y?x:y;}for(;i<s.length();i++)v+=a[t.charAt(i)%4]!=(b?z:y)?" ":s.charAt(i);return v;}

Try it online!

Explanation:

String t=s.replaceAll("\\d","2")
          .replaceAll("[a-z]","0")
          .replaceAll("[A-Z]","1")
          .replaceAll("\\D","3")

First replaces each group with an integer between 0 and 3 using some simple regex and stores this in a new String.

int a[]={0,0,0,0},m,i=0,z=0,y=-1>>>1;

Initialises an array of integers as well as a couple of other integers to use later. Sets the y variable to the max int size using unsigned right bit shift.

t.chars().forEach(j->{a[j%4]++;});

For each character in the modified string, this uses its ASCII value modulo 4 to calculate the index of the aforementioned array to increment.

for(int x:a){
    z=x>z?x:z;
    y=x<y?x:y;
}

This then loops through the counts of each group stored in the array and calculates the minimum (y) and the maximum (z).

for(;i<s.length();i++)
    v+=a[t.charAt(i)%4]!=(b?z:y)?" ":s.charAt(i);

Loops through every character in the String again, checking if the group of that characters group is equal to the min/max (using the modulo trick mentioned earlier). If it isn't equal, then a space is added to the new String in the characters place, otherwise the original character is added.

return v;

Finally return the new String!


1
Nice answer, +1 from me! Two small things to golf: import java.util.stream.IntStream; can be import java.util.stream.*; and ,i can be ,i=0 after which you can remove i=0 from the for-loop. Oh, and (s,b)-> can be s->b->.
Kevin Cruijssen

@KevinCruijssen Thanks! I didn't realise you could chain lambdas
Luke Stevens

It's called currying. :) You can do it like this java.util.function.Function<String, java.util.function.Function<Boolean, String>> g = s->b->{...};.
Kevin Cruijssen

1
Oh, and another thing to golf: IntStream z=IntStream.of(a);m=(b?z.max():z.min()).getAsInt(); can be l=s.length(),x=0,y=l and for(int x:a){z=x>z?x:z;y=x<y?x:y;} and (b?z:y), so you no longer need the import. Putting it all together becomes: s->b->{String t=s.replaceAll("\\d","2").replaceAll("[a-z]","0").replaceAll("[A-Z]","1").replaceAll("\\D","3"),v="";int a[]={0,0,0,0},i=0,l=s.length(),z=0,y=l;t.chars().forEach(j->{a[j%4]++;});for(int x:a){z=x>z?x:z;y=x<y?x:y;}for(;i<l;i++)v+=a[t.charAt(i)%4]!=(b?z:y)?" ":s.charAt(i);return v;} (294 bytes).
Kevin Cruijssen

1
@KevinCruijssen Oooooh nice thinking! I might wait a bit before changing it just in case you come up with anything else ;)
Luke Stevens

1

Bash, 229 227 212 bytes

LANG=C;g="A-Z a-z 0-9 !A-Za-z0-9";declare -A H
f()(((i=$2?99:-1));r=$1;for h in $g;{ t=${r//[$h]};t=${#t};(($2?t<i:t>i))&&i=$t&&H=([$h]=1);((t-i))||H[$h]=1;};for h in $g;{((${H[$h]}))||r=${r//[$h]/ };};echo "$r")

Try it Online


I'm not sure how the spaces around brackets and square-blocks work in Bash, but it still seems to work without the space at f(){((.
Kevin Cruijssen

1
yes, space is mandatory generally except for (, also 2 bytes could be saved using ( instead of {, degrading performance because creating a subshell
Nahuel Fouilleul

1

PHP, 161 158 bytes

for([,$s,$z]=$argv;~$c=$s[$i++];)foreach([punct,upper,lower,digit]as$f)(ctype_.$f)($c)?$$i=$f:$g[$f]++;while(~$c=$s[$k++])echo$g[$$k]-($z?min:max)($g)?" ":$c;

Run with -nr or try it online.

  • first loop: for each position, remember the group of the character
    and count the occurences of groups that the current character is not in.
    (that negation saved 3 bytes)
  • depending on second parameter, pick min non-count for truthy, max non-count for falsy.
  • second loop: if (group of current character) non-count differs
    from min/max non-count then print space, else print character.

1
@KevinCruijssen Make sure you have the latest PHP version (7.1.0) selected.
Titus

1

JavaScript (ES6), 139 bytes

s=>b=>s.map(c=>++a[g(c)]&&c,a=[0,0,0,0],g=c=>c>-1?0:/[a-z]/i.test(c)?c<"a"?2:1:3).map(c=>a.map(v=>v-Math[b?"max":"min"](...a))[g(c)]?" ":c)

Input and output is an array of characters. Takes actual boolean values for input.

A different approach from @Neil's answer; almost avoiding regular expressions. Instead, I used a series of checks to determine the category of each character:

  • Digits return true for c>-1 because non-digits fail mathematical comparisons
  • Uppercase letters match the regex /[a-z]/i and have codepoints less than "a"
  • Lowercase letters match that regex but have codepoints not less than "a"
  • Symbols pass none of those tests

Test Cases

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.