Lần xuất hiện cao nhất hay thấp nhất?


13

Thử thách:

Đầu vào:

  • Một chuỗi chứa ASCII có thể in (không bao gồm dấu cách, tab và dòng mới)
  • Một boolean

Đầu ra:

Các phần của Chuỗi được chia thành bốn nhóm:

  • Chữ viết thường
  • Chữ viết hoa
  • Chữ số
  • Khác

Dựa trên boolean, chúng tôi hoặc xuất ra sự xuất hiện cao nhất của một (hoặc nhiều) trong bốn nhóm này hoặc thấp nhất, thay thế mọi thứ khác bằng khoảng trắng.

Ví dụ:

Đầu vào: "Just_A_Test!"
Nó chứa:
- 3 chữ cái viết hoa: JAT
- 6 chữ cái viết thường: ustest
- 0 chữ số
- 3 chữ cái khác:__!

Đây sẽ là đầu ra cho truehoặc false:

true:   " ust    est "

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

(Lưu ý: Bạn được phép bỏ qua dấu cách, do đó, kết quả đầu ra cũng có thể " ust est"""tương ứng.)

Quy tắc thử thách:

  • Đầu vào sẽ không bao giờ trống hoặc chứa khoảng trắng và sẽ chỉ bao gồm ASCII có thể in trong phạm vi 33-126hoặc '!'thông qua '~'.
  • Bạn được phép lấy đầu vào và / hoặc đầu ra dưới dạng mảng ký tự hoặc danh sách nếu bạn muốn.
  • Bất kỳ hai giá trị nhất quán và riêng biệt cho boolean đều được phép: true/ false; 1/ 0; 'H'/ 'L'; "highest"/ "lowest"; v.v ... Lưu ý rằng những giá trị riêng biệt này nên được sử dụng (phần nào) như là một boolean! Vì vậy, không được phép nhập hai chương trình hoàn chỉnh, một chương trình cho kết quả chính xác truevà chương trình kia falsevà sau đó chỉ có mã thực tế của bạn <run input with parameter>. Lỗ hổng mặc định mới có liên quan mà tôi đã thêm, mặc dù nó vẫn có thể sử dụng rất nhiều cách xử lý liên quan đến các định nghĩa ..
  • Nếu sự xuất hiện của hai hoặc nhiều nhóm là như nhau, chúng tôi xuất ra tất cả những lần xuất hiện đó.
  • Các không gian dấu cần thiết là tùy chọn và một dòng mới duy nhất cũng là tùy chọn. Không gian hàng đầu cần thiết là bắt buộc. Và bất kỳ không gian hàng đầu hoặc dòng mới nào khác đều không được phép.

Quy tắc chung:

  • Đây là , vì vậy câu trả lời ngắn nhất bằng byte thắng.
    Đừng để ngôn ngữ mã-golf ngăn cản bạn đăng câu trả lời với các ngôn ngữ không mã hóa. Cố gắng đưa ra một câu trả lời càng ngắn càng tốt cho ngôn ngữ lập trình 'bất kỳ'.
  • Các quy tắc chuẩn áp dụng cho câu trả lời của bạn, vì vậy bạn được phép sử dụng STDIN / STDOUT, các hàm / phương thức với các tham số thích hợp, các chương trình đầy đủ. Cuộc gọi của bạn.
  • Lỗ hổng mặc định bị cấm.
  • Nếu có thể, vui lòng thêm một liên kết với một bài kiểm tra cho mã của bạn.
  • Ngoài ra, xin vui lòng thêm một lời giải thích nếu cần thiết.

Các trường hợp thử nghiệm:

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

Có thể chấp nhận đầu ra nhiều nhất / ít nhất dưới dạng các mục riêng biệt không? Ví dụ, đối với trường hợp thử nghiệm "băm là vui", có thể "H "" 9 "(với các khoảng trắng thích hợp) được xuất ra thay vì "H 9"?
admBorkBork

@AdmBorkBork Tôi không hiểu ý bạn; cả H9là một phần của "ít nhất".
Erik the Outgolfer

Giá trị đầu vào boolean có thể là "max"/ "min", sau đó được sử dụng Math[b]để tham chiếu Math.maxhay Math.minkhông?
Justin Mariner

@JustinMariner Bạn biết đấy .. Tôi đã thay đổi suy nghĩ về điều đó. Tôi đoán đó là cho JS? Tôi nghĩ rằng rất nhiều ngôn ngữ lập trình có thể sử dụng một cái gì đó như thế này, vì vậy quá nhiều câu trả lời hiện có nên được thay đổi. Vì vậy, xin lỗi, bạn sẽ phải giữ b?"max":"min"trong câu trả lời của bạn .. Đó là một ranh giới mong manh Tôi đoán, có lẽ tôi chỉ nên sử dụng một truthy / giá trị falsey lần sau ..
Kevin Cruijssen

Câu trả lời:


3

Husk , 27 26 24 22 byte

-2 byte nhờ Zgarb

-2 byte nhờ Leo

Mất ' 'như False'a'như True(Trong vỏ trấu, khoảng trắng trong Fasly và tất cả các nhân vật khác là Truthy)

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

Hãy thử trực tuyến!

Làm thế nào nó hoạt động?

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

là một chức năng mà phải mất một vị ngữ pvà một danh sách Lvà trả về phần tử đầu tiên của Lthỏa mãn mà p. Nếu không có phần tử thỏa mãn pmột đối số mặc định được trả về. Trong trường hợp này ' '. Bằng cách áp dụng cho một chuỗi ký tự, về cơ bản chúng ta đang nói if p c then c else ' '.

Là hàm có một chức năng fvà hai danh sách L1, L2. Nó trả về một bảng fáp dụng trên tất cả các cặp L1L2. Trong trường hợp fnày là , L1danh sách 4 hàm của chúng ta và L2là danh sách một chuỗi ký tự.

Sau khi Ṫḟchúng tôi có một danh sách các chuỗi trong đó mỗi chuỗi là kết quả của việc thay thế các ký tự không thỏa mãn một trong các quy tắc bằng a ' '.

NB: Trong các phiên bản mới hơn của Husk, ġ#¬Ö#≡⁰có thể được thay thế bằng cách k#≡⁰tiết kiệm 3 byte!


Vì tò mò: tại sao ' ''a'? Có lẽ tôi hiểu nó tốt hơn khi lời giải thích được thêm vào, vì tôi không thể đọc Husk. ;)
Kevin Cruijssen

Đẹp! Đây là 24 byte sử dụng .
Zgarb

@Zgarb Cảm ơn! Tôi thực sự không hiểu những gì Mmmđang làm cho mình :)
H.PWiz

Thật không may, điều này không thực sự giúp ích cho việc chơi golf, nhưng S`?' có thể đơn giản hơn như?IK'
Leo

Tôi có xu hướng tránh sử dụng I, đôi khi nó làm cho trình thông dịch mất vĩnh viễn. Nó cũng có vẻ lãng phí.
H.PWiz

7

Thạch , 31 byte

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

Hãy thử trực tuyến!

Các giá trị boolean là 21(hoặc bất kỳ cặp chẵn / lẻ dương nào khác), đại diện TrueFalsetương ứng. Tôi sẽ cố gắng thêm một lời giải thích sau khi chơi golf.

Cảm ơn caird coinheringaahing vì đã lưu 2 byte và Lynn để lưu 4 byte! Nhờ một trong những thủ thuật của Erik , đã truyền cảm hứng cho tôi để tiết kiệm 4 byte!

Làm thế nào nó hoạt động

Lưu ý rằng đây là lời giải thích cho phiên bản 35 byte. Cái mới gần giống như vậy (nhưng được chỉnh sửa một chút bởi Lynn), vì vậy tôi sẽ không thay đổi nó.

Ø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 Cảm ơn! :) Tôi muốn chơi golf phần đó kể từ khi tôi đăng câu trả lời, nhưng tôi không thể hiểu tại sao nó không hoạt động ... Tôi có một µD không liên quan :
Ông Xcoder

31 byte : tạo các lớp dưới dạng ØṖḟØBṭØBUs26¤, và sau đó kiểm tra tư cách thành viên với fÇthay vì e¢$.
Lynn


5

R , 193 186 179 158 byte

-7 byte nhờ NofP và đề xuất của anh ấy về cbind

-6 byte sử dụng outer, chuyển đổi -1 byte [^a-zA-Z0-9]với[[:punct:]]

-21 byte nhờ MickyT đã chỉ ra danh sách các ký tự được cho phép

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='')}

Xác nhận tất cả các trường hợp kiểm tra

Lấy 1/Tnhư sự thật ( max) và 0/Fnhư falsey ( min), và lấy Slàm một danh sách các nhân vật duy nhất.

Hãy thử trực tuyến!

Trong phiên bản gốc của tôi (với các đề xuất của NofP), ma trận yđược xây dựng bằng cách đánh giá grepl(regex, S)từng loại regex, sau đó ghép chúng lại với nhau dưới dạng các cột của ma trận. Điều này dẫn đến nhiều cuộc gọi đến grepl, nhưng như đã Sđược sửa, có vẻ như cần phải thực hiện một số việc khác. Như tôi đã lưu ý:

Có những cách tiếp cận ngắn hơn tiềm năng; mapply, ví dụ:

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

thật không may, điều này sẽ không đơn giản hóa như một ma trận trong ví dụ 1 ký tự của "A".

Tôi đã sử dụng outerchứ không phải mapply, luôn trả về một mảng (một ma trận trong trường hợp này) và bị buộc phải Vectorize greplthực sự chỉ là một mapplytrình bao bọc xung quanh nó.

Tôi cũng phát hiện ra nhóm ký tự được xác định trước [:punct:]khớp với các ký tự dấu chấm câu (không phải dấu cách, không chữ và số).


1
Nếu bạn thay thế ma trận bằng một cbind, bạn có thể giảm xuống 186 byte: y = cbind (g ("[az]", S), g ("[AZ]", S), g ("\\ d", S), g ("[^ a-zA-Z0-9]", S))
NofP

@NofP oh, rất đẹp. Ngoài ra, bạn có thể bao quanh mã bằng backticks (`) để hiển thị mã like this. :)
Giuseppe

Các quy tắc nêu rõ rằng bạn có thể sử dụng một mảng ký tự hoặc danh sách làm đầu vào, do đó bạn có thể xóaS=el(strsplit(G,""))
MickyT

@MickyT ah, tôi bỏ qua điều đó, cảm ơn bạn.
Giuseppe

4

Husk , 31 29 28 byte

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

Sử dụng 0 cho tối thiểu và 1 cho số lượng ký tự tối đa. Hãy thử trực tuyến!

Giải trình

Danh sách các chức năng là mát mẻ.

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)

Hãy thử trực tuyến!

Jonathan Frech đã lưu một byte. Cảm ơn!

Cao nhất là m=-1, thấp nhất là m=0.


1
Tôi nghĩ bạn có thể tiết kiệm một byte bằng cách thay thế +x.isalpha()*-~(x>'Z')bằng -~(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]":"")," ");}

Hãy thử trực tuyến!



Bạn có thể loại bỏ +in \\|+$cho thêm -1 byte.
Kevin Cruijssen

Bạn có thể lưu thêm ba byte bằng cách thay đổi phần cuối cùng thành 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, và n=s.length()có thể n=-1>>>1cho thêm -4.
Kevin Cruijssen

Ồ, thêm một điều nhỏ nữa để chơi gôn: [0-9]->\\d
Kevin Cruijssen

3

Ruby , 118 116 byte

Đưa 0(thấp nhất) hoặc -1(cao nhất) cho đối số thứ hai của nó.

-2 byte nhờ 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:" "}}

Hãy thử trực tuyến!

Ung dung

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

Câu trả lời rất tuyệt! Bạn có thể sử dụng -1làm giá trị cao nhất trên mạng và thay thế minmax[t]bằng sort[t].
Lynn

3

Python 2, 190 183 174 173 byte

Cảm ơn Jonathan Frech đã rút ngắn nó

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

Điều này có các chuỗi 'max(l)''min(l)'như đúng và sai. (Tôi không nghĩ điều này phá vỡ quy tắc ...?) Cái này dài hơn hai câu trả lời của con trăn kia nhưng khác nhau nên tôi nghĩ tôi sẽ đăng nó. Tôi không phải là một tay golf cừ khôi nên tôi đoán điều này có thể được cải thiện hơn nữa nhưng tất cả những điều tôi đã thử đều không hiệu quả.

Hãy thử trực tuyến!


Xin Chào và Chào Mừng đến với trang! Khi tôi cố chạy cái này, tôi gặp lỗi và tôi không hoàn toàn chắc chắn tại sao. Một lý do có thể là như sum(1for m...vậy sum(1 for m..., nhưng tôi nghĩ cũng có những vấn đề khác. Bạn có thể cung cấp một liên kết đến một thông dịch viên trực tuyến (chẳng hạn như tio ) để chứng minh cách bạn gọi điều này và để hiển thị nó không bị lỗi?
DJMcMayhem

@DJMcMayhem Tôi vừa thêm một liên kết, cảm ơn vì đã cung cấp liên kết Tôi không chắc chắn cách thực hiện. Tôi không nhận được một lỗi khi tôi chạy nó ở đó.
dylnan

À, tôi không thể nói rằng bạn đã nhập max(l)min(l)dưới dạng chuỗi, đó là lý do tại sao tôi gặp lỗi. Cám ơn giải thích rõ ràng! Mặc dù bây giờ, điều này nằm ở rìa của vi phạm quy tắc số 3, 'Lưu ý rằng những giá trị riêng biệt này nên được sử dụng (phần nào) như là một boolean`, nhưng nó chắc chắn là một chút của một khu vực màu xám.
DJMcMayhem

BTW, đây là một mẹo TIO: Nếu bạn đặt các lệnh gọi hàm của mình vào trường chân trang , chúng sẽ không được tính vào số byte của bạn, vì vậy bạn có thể dễ dàng thấy câu trả lời của mình là bao lâu: Hãy thử trực tuyến!
DJMcMayhem

@DJMcMayhem À cảm ơn. Tôi đồng ý đó là một khu vực màu xám. Tôi có thể lấy 'max' và 'min' là true false sau đó thực hiện eval (c + '(l)') để thêm 6 Byte và có vẻ dễ chấp nhận hơn nhưng cho đến khi OP không chấp nhận câu trả lời của tôi, tôi cho rằng nó ổn.
dylnan

2

JavaScript (ES6), 151 149 byte

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>

Đáng buồn thay, các quy tắc có thể không cho phép tôi vượt qua Math.maxhoặc Math.minnhư cờ. Chỉnh sửa: Đã lưu 2 byte nhờ @JustinMariner.



1

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

"Thú vị" của tôi tham gia thử thách.

Cảm ơn Kevin Cruijssen vì đã cắt giảm các byte nhập loại bỏ hoàn toàn việc nhập!

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

Hãy thử trực tuyến!

Giải trình:

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

Đầu tiên thay thế mỗi nhóm bằng một số nguyên từ 0 đến 3 bằng cách sử dụng một số biểu thức chính quy đơn giản và lưu trữ phần này trong Chuỗi mới.

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

Khởi tạo một loạt các số nguyên cũng như một vài số nguyên khác để sử dụng sau này. Đặt ybiến thành kích thước int tối đa bằng cách sử dụng dịch chuyển bit phải không dấu.

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

Đối với mỗi ký tự trong chuỗi đã sửa đổi, giá trị này sử dụng modulo giá trị ASCII của nó để tính chỉ số của mảng đã nói ở trên để tăng.

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

Điều này sau đó lặp qua số đếm của từng nhóm được lưu trữ trong mảng và tính toán tối thiểu ( y) và tối đa ( z).

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

Lặp lại thông qua mọi ký tự trong Chuỗi, kiểm tra xem nhóm của nhóm ký tự đó có bằng min / max không (sử dụng thủ thuật modulo đã đề cập trước đó). Nếu nó không bằng nhau, thì một khoảng trắng được thêm vào Chuỗi mới ở vị trí ký tự, nếu không thì ký tự gốc được thêm vào.

return v;

Cuối cùng trả về Chuỗi mới!


1
Câu trả lời hay, +1 từ tôi! Hai điều nhỏ đối với golf: import java.util.stream.IntStream;có thể import java.util.stream.*;,icó thể ,i=0sau đó bạn có thể xóa i=0khỏi vòng lặp for. Ồ, và (s,b)->có thể s->b->.
Kevin Cruijssen

@KevinCruijssen Cảm ơn! Tôi không nhận ra bạn có thể xâu chuỗi lambdas
Luke Stevens

Nó được gọi là cà ri. :) Bạn có thể làm điều đó như thế này java.util.function.Function<String, java.util.function.Function<Boolean, String>> g = s->b->{...};.
Kevin Cruijssen

1
Oh, và một điều cần golf: IntStream z=IntStream.of(a);m=(b?z.max():z.min()).getAsInt();có thể l=s.length(),x=0,y=lfor(int x:a){z=x>z?x:z;y=x<y?x:y;}(b?z:y), do đó, bạn không còn cần phải nhập khẩu. Đặt tất cả lại với nhau trở thành: 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 byte ) .
Kevin Cruijssen

1
@KevinCruijssen Oooooh suy nghĩ tốt đẹp! Tôi có thể đợi một chút trước khi thay đổi nó chỉ trong trường hợp bạn nghĩ ra bất cứ điều gì khác;)
Luke Stevens

1

Bash, 229 227 212 byte

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

Dùng thử trực tuyến


Tôi không chắc cách các không gian xung quanh dấu ngoặc và khối vuông hoạt động trong Bash, nhưng dường như nó vẫn hoạt động mà không có khoảng trống tạif(){(( .
Kevin Cruijssen

1
vâng, không gian là bắt buộc thường ngoại trừ (, cũng có thể lưu 2 byte bằng cách sử dụng (thay vì {làm giảm hiệu suất vì tạo ra một mạng con
Nahuel Fouilleul

1

PHP, 161 158 byte

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;

Chạy với -nrhoặc thử trực tuyến .

  • vòng lặp đầu tiên: đối với từng vị trí, hãy nhớ nhóm của ký tự
    và đếm số lần xuất hiện của các nhóm mà ký tự hiện tại không có .
    (phủ định đó đã lưu 3 byte)
  • tùy thuộc vào tham số thứ hai, chọn tối thiểu không tính cho trung thực, không tính tối đa cho sai.
  • vòng lặp thứ hai: if (nhóm ký tự hiện tại) non-Count khác với
    min / max non-Count sau đó in không gian, khác in ký tự.

1
@KevinCruijssen Đảm bảo bạn đã chọn phiên bản PHP mới nhất (7.1.0).
Tít

1

JavaScript (ES6), 139 byte

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)

Đầu vào và đầu ra là một mảng các ký tự. Lấy các giá trị boolean thực tế cho đầu vào.

Một cách tiếp cận khác với câu trả lời của @ Neil ; gần như tránh các biểu thức thông thường. Thay vào đó, tôi đã sử dụng một loạt các kiểm tra để xác định danh mục của từng nhân vật:

  • Trở lại chữ số truecho c>-1vì không chữ số không so sánh toán học
  • Các chữ cái viết hoa phù hợp với biểu thức chính quy /[a-z]/ivà có các điểm mã nhỏ hơn"a"
  • Chữ thường phù hợp với biểu thức chính quy đó nhưng có điểm mã không nhỏ hơn "a"
  • Các biểu tượng không vượt qua bất kỳ thử nghiệm nào

Các trường hợp thử nghiệm

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.