Chữ cái giống nhau


19

Thư của các từ muốn công bằng.

Họ quyết định xuất hiện cùng một số lần trong một câu như nhau.

Thí dụ:

Priorities

Sẽ trở thành:

Ppprrioooritttieeesss

Mỗi chữ cái xuất hiện 3 lần, như chữ cái phổ biến nhất i, xuất hiện 3 lần.

Không quan trọng bạn đặt các chữ cái lặp đi lặp lại ở đâu, miễn là chúng nằm cạnh một chữ cái tương tự.

I E:

Pppriooorritttieeesss là OK (chữ 'r')

Ppprioororitttieeesss không ổn (chữ 'r')

Một vi dụ khac:

invoice

Sẽ trở thành:

innvvooiccee

Một vi dụ khac:

Remittance Advice

Sẽ trở thành:

Rrremmmiitttaannncce Adddvvvice

Không gian, dấu phẩy, dấu hỏi, trích dẫn, v.v. không được coi là chữ cái cho thử thách này. Chỉ cần xem xét [a-zA-Z]. Chỉ cần một lần không gian là đủ, và thứ tự của các chữ cái sẽ giữ nguyên.

Chữ viết hoa của chữ cái không quan trọng, chữ hoa và chữ thường được tính là cùng một chữ cái. Đó là: Pipcó 2 'P và 1' I ', vì vậy nó sẽ trở thành Piip.

Đây là trường hợp chữ không nhạy cảm có thể ở bất kỳ dạng nào, Piip=piip=piiP=PiiP

Đây là


2
Tôi có thể đề nghị sử dụng Hộp cát cho các thử thách trong tương lai để giúp giải quyết tất cả các chi tiết trước khi đăng câu hỏi lên chính
Jo King

Có phải "rrreeemmmiiitttaaannncccdddvvv" là một đầu ra chấp nhận được trong ví dụ đã cho (vì thứ tự của các chữ cái riêng biệt (như được định nghĩa là az) vẫn được duy trì)? (Câu trả lời Jelly của tôi hiện đang dựa vào việc giải thích này là OK.)
Jonathan Allan

1
@Jonathan ALLan Hmm, mặc dù tôi để sự lựa chọn cho OP, tôi rất nghi ngờ điều đó. Không chỉ các ký tự không phải chữ cái (dấu cách) biến mất, mà bạn còn đặt tất cả các ký tự cạnh nhau thay vì giữ nó ở cùng một vị trí. Đầu ra của bạn làm cho thử thách trở nên khác biệt và dễ dàng hơn (imho).
Kevin Cruijssen

1
@KevinCruijssen không gian ở bên trái - đó không phải là một chữ cái do đó không cần phải tuân thủ "và thứ tự của các chữ cái sẽ giữ nguyên"
Jonathan Allan

1
@Jonathan ALLan Ah, đã không nhận thấy không gian, xấu của tôi. Tôi hoàn toàn hiểu lý do bạn cung cấp trong câu trả lời Jelly của bạn và dựa trên đó thực sự là một đầu ra hợp lệ, nhưng tôi muốn thấy cụm từ thay đổi, sau đó cho phép đầu ra của bạn, vì nó sẽ thay đổi hoàn toàn thử thách.
Kevin Cruijssen

Câu trả lời:


5

05AB1E , 16 byte

lDáÙSйls¢Zα>×.;

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

Giải trình

l                  # convert input to lowercase
 D                 # duplicate
  á                # keep only letters
   Ù               # remove duplicates
    S              # split to list of chars
     Ð             # triplicate
      ¹ls¢         # count the occurrences of each letter in lowercase input
          Zα       # absolute valuue with max occurrence
            >      # increment
             ×     # repeat each unique char that many times
              .;   # replace the first occurrence of the char in lowercase input with this

7

R , 106 byte

function(s){for(A in L<-LETTERS)s=sub(A,strrep(A,max(x<-+s-+Map(gsub,L,'',s,T))-x[A]--1),s,T);s}
"+"=nchar

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

Cách tiếp cận cơ sở R:

  • ăn cắp một số ý tưởng từ cách tiếp cận @ J.Doe R + stringr , tôi đã lưu 26 ​​byte!
  • 5 byte khác được lưu bằng đề xuất @ J.Doe để lạm dụng +toán tử R

Tôi ấn tượng bạn đã lên 111 với cơ sở R!
J.Doe

@ J.Doe: Sau khi xuất bản giải pháp 137 byte ban đầu của tôi, tôi đã thay đổi một chút cách tiếp cận của mình lấy cảm hứng từ bạn và về cơ bản tôi đã hội tụ vào giải pháp của bạn, chỉ cần gỡ bỏ chuỗi: D
digEmAll

1
106 byte với lạm dụng toán tử. Base-R thắng!
J.Doe

@ J.Doe: tuyệt vời!
digEmAll

5

Perl 6 , 82 byte

-3 byte nhờ nwellnhof

->\a{a.=lc.=subst($_,$_ x a.comb(/<:L>/).Bag.values.max+1-a.comb($_))for 'a'..'z'}

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

Đưa ra một chuỗi có thể thay đổi và sửa đổi nó tại chỗ.

Giải trình:

->\a{        # Anonymous code block that takes a mutable string            }
 a.=lc;  # Lowercase
                                                               for 'a'..'z'  # For each letter
 .=subst(                                                    )  # Substitute
          $_,   #The first occurrence of the letter with
             $_ x  #The letter repeated
                  a.comb(/<:L>/).Bag.values.max    # The count of the most common letter
                                                 +1  # Plus 1
                                                   -a.comb($_)  # Minus the count of that letter already in the string

Bạn có thể xâu chuỗi các .=toán tử như thế nào a.=lc.=subst(...). Tôi không chắc liệu việc thay đổi trường hợp của một bức thư hiện có được cho phép hay không. Ngoài ra <:L>thay vì <:Ll>.
nwellnhof

@nwellnhof Vâng, người hỏi nói rằng đầu ra không phân biệt chữ hoa chữ thường
Jo King

5

JavaScript (ES6), 112 byte

s=>(m=g=F=>s.replace(/[a-z]/gi,c=>F(c.toLowerCase())))(c=>g[c]=c+c.repeat(m-g[c]),g(c=>m=(n=g[c]=-~g[c])<m?m:n))

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

Đã bình luận

s => (                       // s = input string
  m =                        // m = max. number of occurrences of the same letter
  g = F =>                   // g = helper function taking a callback function F
    s.replace(               //     (also used to store the # of occurrences of each letter)
      /[a-z]/gi,             //   for each letter c in s:
      c => F(                //     invoke F():
        c.toLowerCase()      //       with c.toLowerCase()
      )                      //     end of call to F()
    )                        //   end of replace()
)(c =>                       // invoke g() (second pass):
  g[c] =                     //   update g[c] to a non-numeric value
    c +                      //   append c once, unconditionally
    c.repeat(m - g[c]),      //   and append c as many times as required to reach m
                             //   (any subsequent iteration with the same letter will
                             //   lead to c.repeat(m - g[c]) --> c.repeat(NaN) --> '')
  g(c =>                     //   invoke g() (first pass):
    m = (n = g[c] = -~g[c])  //     increment g[c], save the result in n
      < m ? m : n            //     and update m to max(m, n)
  )                          //   end of first pass
)                            // end of second pass

Kỹ năng JS của tôi rất tệ, vì vậy tôi hơi bối rối về phần này : o[l] = // updates o[l] to a non-numeric value. Nếu tôi hiểu chính xác, olà một mảng số nguyên trong Fvà các ghàm, nhưng thay đổi thành một chuỗi chuỗi giữ một hoặc nhiều lần ký tự cở phần tôi đã đề cập trước đó? Ngoài ra, tôi đoán các giá trị của oundefinedtheo mặc định, kể từ khi bạn đang sử dụng o[l]=-~o[l]thay vì ++o[l]?
Kevin Cruijssen

1
@KevinCruijssen Chúng tôi muốn mỗi chữ cái được đệm với số lần xuất hiện tối đa chỉ một lần. Bằng cách cập nhật o[l]thành một chữ cái, bất kỳ lần lặp tiếp theo nào có cùng một chữ cái sẽ dẫn đến m - o[l] --> NaN(ký tự trừ số nguyên) và l.repeat(NaN) == ''. (Về điểm cuối cùng: có, điều đó đúng.)
Arnauld

À ok, cảm ơn đã giải thích! :)
Kevin Cruijssen

(và tôi nên nói chuỗi chứ không phải thư )
Arnauld

5

J , 33 56 46 byte

t=:~:tolower
(#~1+t*~:(*>./-])t*1#.e.)@toupper

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

Không thể tìm cách tránh sử dụng ~:tolowerhai lần.

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

t=:~:tolower    Auxiliary function: isupper
     tolower    Is lowercase version of itself...
   ~:           different from itself?

(#~1+t*~:(*>./-])t*1#.e.)@toupper    Main function
                          toupper    Convert to uppercase
                      e.     Build 2D array by comparing to itself
                   1#.       Row-wise sum; Count occurrences
                 t*     A) Filter by isupper (needed for finding max count)
           >./-]        Compute max of A) minus each element of A)
       ~:          Nub sieve; 1 if first occurrence, 0 otherwise
          *        Filter first occurrences only
     t*       Filter by isupper again, to ban non-alphabets from duplicating
   1+         Add one to preserve given chars
 #~           Duplicate

5

R + stringr, 108 byte

Tôi không giỏi lắm stringr. Trả về một hỗn hợp chữ thường và chữ hoa vì câu hỏi nói rằng nó không quan trọng.

function(x){for(l in L<-letters)x=sub(l,strrep(l,max(s<-stringr::str_count(tolower(x),L))-s[L==l]+1),x,T);x}

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

Giải trình

function(x){
for(l in letters){ # Iterate through builtin vector "a", "b", "c"...
   # Generate a 26-long integer vector for how many a's, b's, c's in lower case string
  s = stringr::str_count(tolower(x),letters)
    # Take the max of this
  m = max(s)
    # Repeat the letter in the iteration enough times to make the word 'fair'
  new.l = strrep(l,m-s[letters==l]+1)
    # Substitute the first instance only of the letter in the string for the repeated letter
    # This is case insensitive (the T at the end)
    # Notice we calculate the max letter frequency each loop
    # This is inefficient but doesn't change the answer and avoids bytes
  x=sub(l,new.l,x,T);
  }
x # Return the substituted string
}

3

K4 , 35 byte

Dung dịch:

{x@o@<o:(&^x),/(|/#:'g)#'g:" "_=_x}

Ví dụ:

q)k){x@o@<o:(&^x),/(|/#:'g)#'g:" "_=_x}"Priorities"
"PPPrrioooritttieeesss"
q)k){x@o@<o:(&^x),/(|/#:'g)#'g:" "_=_x}"invoice"
"innvvooiccee"
q)k){x@o@<o:(&^x),/(|/#:'g)#'g:" "_=_x}"Remittance Notice"
"RRRemmmiittaaanncce Noootice"

Giải trình:

Có thể chơi golf với một cách tiếp cận khác, sẽ tiếp tục suy nghĩ

{x@o@<o:(&^x),/(|/#:'g)#'g:" "_=_x} / the solution
{                                 } / lambda taking implicit argument x
                                _x  / lowercase input
                               =    / group
                           " "_     / drop space from keys
                         g:         / save as g
                       #'           / take each
               (      )             / do this together
                  #:'g              / count occurances in each group
                |/                  / take the maximum
             ,/                     / flatten with
        (&^x)                       / indices where input is null (ie " ")
      o:                            / save as o
     <                              / indices to sort o ascending
   o@                               / apply these to o
 x@                                 / apply these indices to original input

3

Than , 33 32 byte

⭆↧θ⁺§θκ×ι∧№βι∧⁼κ⌕↧θι⁻⌈Eβ№↧θλ№↧θι

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Giải trình:

  θ                                 Input string
 ↧                                  Lower case
⭆                                   Map over characters and join
      κ                             Current index
     θ                              Input string
    §                               Original character
   ⁺                                Concatenate with
        ι                           Lowercased character
       ×                            Repeated
            ι                       Lowercased character
           β                        Lowercase alphabet
          №                         Count
         ∧                          Logical And
                   ι                Lowercased character
                  θ                 Input string
                 ↧                  Lower case
                ⌕                   Find
               κ                    Current index
              ⁼                     Equals
             ∧                      Logical And
                       β            Lowercase alphabet
                      E             Map over characters
                           λ        Current character
                          θ         Input string
                         ↧          Lower case
                        №           Count
                     ⌈              Maximum
                    ⁻               Minus
                               ι    Lowercased character
                              θ     Input string
                             ↧      Lower case
                            №       Count
                                    Implicitly print

3

Java 11, 190 176 162 byte

s->{s=s.toUpperCase();char m=2,i=64,a[]=new char[127];for(int c:s.getBytes())m-=m+~++a[c]>>-1;for(;++i<91;)s=s.replaceFirst(i+"",repeat((i+""),m-a[i]));return s;}

-14 byte nhờ @Nevay .

Đầu ra là chữ hoa

Hãy thử trực tuyến. (LƯU Ý: String.repeat(int)được mô phỏng như repeat(String,int)cho cùng một số đếm byte, vì Java 11 chưa có trên TIO.)

Giải trình:

s->{                      // Method with String as both parameter and return-type
  s=s.toUpperCase();      //  Convert the input-String to full uppercase
  char m=2,               //  Max occurrence (+1), starting at 2
       i=64,              //  Index integer, starting at 64 ('A'-1)
       a[]=new char[127]; //  Create a count-array of size 127 (printable ASCII chars)
  for(int c:s.getBytes()) //  Loop over the characters of the String as integers
    m-=m+~++a[c]>>-1;     //   Increase the occurrence-counter of the char by 1 first
                          //   And if it's larger than the max-2, increase the max by 1
  for(;++i<91;)           //  Loop `i` in the range ['A', 'Z']
    s=s.replaceFirst(i+"",//   Replace the first char `i` in the string with:
       (i+"").repeat(     //   That same character repeated
        m-a[i]));         //   The max(+1) minus its array-occurrence amount of times
  return s;}              //  Then return the now modified String as result

Bạn có thể sử dụng var cho một byte không?
Quintec

@Quintec Thay charbạn là gì? Tiếc là không có. varchỉ có thể được sử dụng cho các lĩnh vực duy nhất. Vì vậy, thay vì char m=1,i=127,a[]=new char[i];nó sẽ được var m=1;var i=127;var a=new char[i];. Đây là một mẹo hữu ích về những gì bạn có thể và không thể làm với Java 10 var. (Tôi có thể thay thế intvòng lặp bằng var, nhưng số byte sẽ giữ nguyên.)
Kevin Cruijssen

Gotcha, cảm ơn. Vẫn không biết Java 9/10/11 hoạt động như thế nào, haha, tôi sẽ giữ nguyên 8; p
Quintec

@Quintec Java 9 Tôi cũng không thực sự hiểu, vì nó chủ yếu tập trung vào REPL đó. Java 10 hầu hết giống với Java 8, ngoại trừ var. Và Java 11 hầu như không có bất kỳ thay đổi nào ở tất cả các codegolf liên quan, ngoại trừ String.repeatphương thức mà tôi đã sử dụng vô số lần. Nó cũng có cái mới String.stripLeadinghoặc String.stripTrailing, hoạt động nhưtrim nhưng chỉ có khoảng trắng hàng đầu / dấu, và String.isBlank()giống như String.trim().isEmpty()(chỉ khoảng trống hoặc khoảng trắng).
Kevin Cruijssen

1
-14 byte:s->{s=s.toUpperCase();char m=2,i=91,a[]=new char[127];for(int c:s.getBytes())m-=m+~++a[c]>>-1;for(;i-->65;)s=s.replaceFirst(i+"",repeat((i+""),m-a[i]));return s;}
Nevay

3

Japt -h , 27 byte

-3 byte từ @ETHproductions

;v
ñ oC ó¥ ú £=iXÎpXèS)UbXg

Cố gắng giải thích

;v                          Convert implicit input to lowercase
ñ oC ó¥ ú £=iXÎpXèS)UbXg      Main function. Implicit lowercase input => "priorities"
ñ                           Sort => "eiiioprrst"
 oC                         Remove non alphabetical chars
   ó¥                       Split on different letters => ["e","iii","o","p","rr","s","t"]
     ú                      Right-pad each to the length of the longest with space => ["e  ","iii","o  ","p  ","rr ","s  ","t  "]
       £                    For each X in this array:
             XèS              Count the number of spaces in X
          XÎ                  Get the first character in X
            p   )             Repeat it (number of spaces) times
                              example the mapped value "e  " will become "ee"
         i                    Insert this into U at
                 UbXg           the first index of (first character in X) in U
        =                     Set U to the result

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


1
Hy vọng bạn không phiền, tôi đã mở rộng một phần của lời giải thích (rằng một dòng giải thích về khoảng 10 ký tự đã làm cùng một lúc: P) Thủ úthuật là thiên tài, btw :-)
ETHproductions

@ETHproductions Tôi đánh giá cao nó. Tôi không giỏi tiếng Anh lắm nên cảm ơn
Luis felipe De jesus Munoz

1
Thật không may, nó dường như thất bại khi không có chữ cái liên quan (chúng không nên thay đổi). Một sửa chữa đơn giản sẽ là chèn một ñ oC ó¥, mặc dù nó yêu cầu thêm lại trong ;...
ETHproductions

Đợi ... từ khi nào làm ñviệc trên dây?! @ETHproductions, xin vui lòng cho tôi biết đó là một bổ sung gần đây và tôi đã không nhìn thấy nó tất cả thời gian này!
Xù xì

@Shaggy Rõ ràng là 2,5 tháng trước - nhưng đừng lo lắng, thậm chí tôi đã quên nó tồn tại cho đến khi câu trả lời này ;-)
ETHproductions

2

Hồng ngọc , 89 byte

->s{1while(a=s.scan /\w/).map(&g=->x{s.scan(/#{x}/i).size}).uniq[1]&&s[a.min_by &g]*=2;s}

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

Tôi đã thử các cách tiếp cận khác nhau, nhưng điều thực sự tiết kiệm rất nhiều byte là thêm một ký tự một lần.

Làm sao:

->s{
    1while                             # 1 is a nop to the while
    (a=s.scan /\w/)                    # For all the letters in the string
    .map(&g=->x{s.scan(/#{x}/i).size}) # Count occurrences ignoring case.
    .uniq[1]                           # Break out of loop if all equals
    &&s[a.min_by &g]*=2                # Otherwise duplicate the letter
                                       #  with the lowest count
    ;s}                                # Return the string

2

Powershell 6, 123 byte

Nó sử dụng một phạm vi char 'a'..'z'. Xem kịch bản cho Powershell trước dưới đây.

param($s)for(;'a'..'z'|%{
if($d=($s-replace"[^$_]").Length-$n){if($d-gt0){1}else{$s=$s-replace"^(.*$_)","`$1$_"}}}){$n++}$s

Kịch bản kiểm tra giải thích:

$f = {

param($s)                               # a parameter string
for(;                                   # loop while exists at least one letter...
'a'..'z'|%{                             # for each letter
    $d=($s-replace"[^$_]").Length-$n    # let $d is a difference between a number of current letter and current $n 
    if($d-gt0){                         # if the difference > 0
        1                               # then return a object to increase $n on next iteration
    }
    if($d-lt0){                         # if the differenct < 0
        $s=$s-replace"^(.*$_)","`$1$_"  # append the current letter after a last instance of the letter. Use "^(.*?$_)" regexp to append it after a first instance of the letter.
    }
}){
    $n++                                # increment $n if exists at least one letter number of witch greather then $n
}                                       # and make next iteration of the 'for'.

$s                                      # return modified string if all letters in the string occur the same number of times

}

@(
    ,('Priorities', 'Ppprrioooritttieeesss', 'PPPriooorritttieeesss')
    ,('invoice', 'innvvooiccee')
    ,('Remittance Advice', 'Rrremmmiitttaannncce Adddvvvice', 'RRRemmmitttannnce Aadddvvviicce')
) | % {
    $s,$e = $_
    $r = &$f $s
    "$($r-in$e): $r"
}

Đầu ra:

True: Pppriooorritttieeesss
True: innvvooiccee
True: Rrremmmitttannnce Aadddvvviicce

Powershell 5.1-, 133 byte

param($s)for(;97..122|%{$_=[char]$_
if($d=($s-replace"[^$_]").Length-$n){if($d-gt0){1}else{$s=$s-replace"^(.*$_)","`$1$_"}}}){$n++}$s

2

Màu đỏ , 252 byte

func[s][a: charset[#"a"-#"z"#"A"-#"Z"]t: parse s[collect[any[keep a | skip]]]m: copy
#()foreach c t[c: form c either n: m/:c[m/:c: n + 1][m/:c: 1]]d: last sort extract next
to-block m 2 foreach c s[prin c: form c if n: m/:c[loop d - n[prin c]m/:c: d]]]

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

Giải pháp dài vô lý ...

Giải trình:

f: func [ s ] [
    a: charset [ #"a" - #"z" #"A" - #"Z" ]   ; letters
    t: parse s [                             ; parse the string 
        collect [ any [ keep a | skip ] ]    ; and keep only the letters
    ]
    m: copy #()                              ; initialize a map
    foreach c t [                            ; for each character in t
        c: form c                            ; the character as a string
        either n: select m c [ m/:c: n + 1 ] ; increase the count if already in map
                             [ m/:c: 1 ]     ; otherwise create a map entry with count 1 
    ]
    d: last sort extract next to-block m 2   ; convert the map to a block; extract only the 
                                             ; numbers and take the last of the sorted block
    foreach c s [                            ; for each character in the input
        c: form c                            ; the character as a string
        prin c                               ; print it (with no space nor newline)
        if n: select m c [                   ; if c is a key in the map
            loop d - n [ prin c ]            ; print the character again up to d times 
            m/:c: d                          ; set the count to max (flag it as used)
        ]
    ]
]

2

JavaScript (Node.js) , 140 137 byte

x=>[...x=x.toLowerCase()].map(F=c=>(F[c]=-~F[c],F[c]>w?w=F[c]:w,c),w=0).map(c=>x=x.replace(c,c.repeat(c>'`'&c<'{'?w-F[c]+1:1),F[c]=w))&&x

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

+33 byte từ giải pháp đầu tiên của tôi cho những ràng buộc bổ sung không bao giờ kết thúc. JS hút ở các thao tác chuỗi không phân biệt chữ hoa chữ thường mà bạn biết.

-3 byte trở lại Cảm ơn @Arnauld.

Giải trình

x =>                                     // The function.
  [...x = x.toLowerCase()].map(f = c => (// - Iterate among each character...
                                         // - Additional constraint 2
    f[c] = -~f[c],                       //   - Add one to the character counter
    f[c] > w ? w = f[c] : w,             //   - Update the maximum count if necessary
    c                                    //   - Return back the character for the use in
                                         //     the next map function
  ), w = 0)                              // - The counters
  .map(c =>                              // - Iterate again...
    x = x.replace(                       //   - Repeat the first appearance of
      c,                                 //   - Each character
      c.repeat(                          //   - Needed number times
        c > '`' & c < '{'                //   - Additional constraint 1
        ? w - f[c] + 1                   //   - If this is letter, repeat
        : 1                              //   - If not, stay as is
      ),                                 //   - That should've been clearly stated
      f[c] = w                           //   - And set the counter so that no further 
                                         //     replacements are done on this character 
    )                                    //   - (w - f[c] + 1 = 1 in further iterations)
  ) && x                                 // - Return the result

Các giải pháp cần có khả năng xử lý các trường hợp đầu vào hỗn hợp.
Xù xì

@Shaggy Tôi nghĩ rằng thách thức đã được chỉnh sửa sau khi nhận xét của bạn. Có vẻ như trường hợp đầu ra không thành vấn đề.
Arnauld

Mặt khác, các chức năng phải được tái sử dụng , đây không phải là trường hợp ở đây.
Arnauld

@Arnauld Oh đôi khi tôi thấy bạn sử dụng fs như một bộ lưu trữ tạm thời nên tôi nghĩ điều đó không sao
Shieru Asakoto

map()chức năng gọi lại an toàn để sử dụng để lưu trữ, vì chúng được xác định trong phạm vi cục bộ. Sử dụng chức năng chính - được xác định toàn cầu - nguy hiểm hơn. Tại đây, bạn có thể sử dụng hàm gọi lại đầu tiên map(), đưa bạn trở lại mức 137 byte .
Arnauld

2

Chồng , 15 byte

ḟ§Ë#f√MṘO´πL¹m_

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

Lực lượng vũ phu, nên rất chậm.

Giải trình

ḟ§Ë#f√MṘO´πL¹m_  Implicit input, say s = "To do"
             m_  Convert to lowercase: t = "to do"
           L¹    Length of s: 5
         ´π      All length-5 combinations of [1..5]:
                   [[1,1,1,1,1], [1,1,1,1,2], [2,1,1,1,1], ..., [5,5,5,5,5]]
        O        Sort them lexicographically:
                   [[1,1,1,1,1], [1,1,1,1,2], [1,1,1,1,3], ..., [5,5,5,5,5]]
      MṘ         For each, replicate letters of t that many times:
                   ["to do", "to doo", "to dooo", ..., "tttttooooo     dddddooooo"]
ḟ                Find the first string that satisfies this:
                   Example argument: x = "tto ddo"
    f√             Letters of x: "ttoddo"
  Ë                They have equal
 § #               number of occurrences in x: true (all have 2).

hoàn toàn không thể nhận được kết quả
asmgx

@asmgx Chương trình này rất chậm. Dường như đã hết thời gian trên TIO cho các đầu vào có độ dài 8 và dài hơn, vì nó sẽ tính toán sau 1 phút. Trình thông dịch ngoại tuyến sẽ đưa ra kết quả nếu bạn chờ đủ lâu (có thể là vài giờ cho độ dài 10 đầu vào).
Zgarb

2

Perl 6 , 77 70 byte

{s:i|$($!.min(*{*}).key)|$/$/|until [==] ($!=.lc.comb(/<:L>/).Bag){*}}

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

Theo cách tiếp cận của GB là chèn một ký tự cho đến khi tất cả các ký tự xuất hiện cùng một số lần. Nhận được một chuỗi được sửa đổi tại chỗ.

Nếu dấu gạch dưới có thể được coi như chữ cái, biểu thức chính quy có thể trở thành /\w/ , lưu hai byte.

Giải trình

{
                    .lc.comb(/<:L>/).Bag          # Create Bag of letter/count pairs
                ($!=                    )         # Store temporarily in $!
 ... until [==]                          .values  # Until all counts are equal
 s:i|                      |    |                 # Replace (ignoring case)
     $($!.min(*.value).key)                       # letter with minimum count
                            $/$/                  # with itself doubled
}

@JoKing Có vẻ như sự cải tiến của bạn dựa trên phiên bản cũ trước khi tôi phát hiện ra {*}mánh khóe.
nwellnhof

Vì vậy, nó giống như một lối tắt cho .value(s)nó phải không? Không, tôi có thể phải cập nhật một số giải pháp cũ của mình
Jo King


1

C (tiếng kêu) , 246 223 220 210 208 193 188 byte

Cờ trình biên dịch -DF=;for(i=0;b[i];i++ -DB=b[i](29 byte)

Thêm hỗ trợ trường hợp hỗn hợp.

f(char*c){char m,i,s,*b,a[255]={0};s=asprintf(&b,c)F)B=tolower(B),a[B]++F,a[B]>a[m]?m=B:0)F)a[B]^a[m]?b=realloc(b,s+i),bcopy(&B,b+i+1,s),a[B]++:(m=B);puts(b);}

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


1

Bình thường, 31 30 byte

JeSm/Qd=r0QVQ=tQ=+k*N-J/+kQN)k

Hãy thử nó ở đây

Giải trình

JeSm/Qd=r0QVQ=tQ=+k*N-J/+kQN)k
       =r0Q                        Convert input to lowercase.
JeSm/Qd                            Find the count of the most common character.
           VQ               )      For each character in the input...
             =tQ                   ... remove that character from the input...
                =+k*N-J/+kQN       ... append copies to k until we have enough.
                             k     Output.

1

C (GCC) - 175 byte

f(char*s){int c[999]={0},i=0,m=0,k,L;while((L=s[i++])&&(k=++c[L<97?L+32:L]))m=k>m?k:m;i=0;while(L=s[i++])for(L=L<97&&L>64?L+32:L,putchar(L);isalpha(L)&&++c[L]<=m;)putchar(L);}

Bị đánh cắp

f(char *s) {
  int c[999]={0},i=0,m=0,k,L;                      // Array used like a dictionary, temp vars
  while((L=s[i++])&&(k=++c[L<97?L+32:L]))          // store letter counts
    m=k>m?k:m;                                     // calculate max occurance
  i=0;                                             // reset string index
  while(L=s[i++])                                  // iterate string
    for(L=L<97&&L>64?L+32:L,putchar(L);isalpha(L)&&++c[L]<=m;) // set character L to lowercase if in alphabet, print always once, repeat if in alphabet
      putchar(L);                                  // print character
}

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


0

Android của Kotlin, 413 byte

var l: List<Char> = w.toList().distinct();val h = HashMap<Char, Int>();var x='m';var n=0;for(z in l.indices){var c=0;for (i in 0.rangeTo(w.length-1)){if(l[z]==(w[i]))c++};h.put(l[z],c);if(n<c){n=c}};for(entry in h){h.replace(entry.key,n-entry.value)};var v=ArrayList<Char>();for(i  in 0.rangeTo(w.length-1)){if(h.containsKey(w[i])){for(p in 0.rangeTo(h.get(w[i])!!)){v.add(w[i])};h.remove(w[i])}else{v.add(w[i])}}

Thử trực tuyến

Bước giải thích 1 -> Chọn danh sách các ký tự riêng biệt. bước 2 -> Lấy số lượng của mỗi char trong chuỗi và chọn tần số char tối đa. bước 3 -> nhận sự khác biệt về tần số ký tự liên quan đến tần số char tối đa Bước 4 -> đặt ký tự liên quan đến các vị trí trong chuỗi. Chúc bạn giải quyết vui vẻ!



0

PHP ,185 173 170 byte

function($s){$m=max($a=count_chars($s=strtolower($s),1));foreach(str_split($s)as$c)$o.=str_repeat($c,($b=$a[$d=ord($c)])!=($a[$d]=$m)&&$d>96&&$d<123?$m-$b+1:1);return$o;}

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

Ungolfed (và không ternaried và không tối ưu hóa).

function f($s) {
    $s = strtolower( $s );
    $a = count_chars( $s, 1 );
    $m = max( $a );
    foreach( str_split( $s ) as $c ) {
        if ( $c < 'a' or $c > 'z') {           // is non a-z
            $n = 1;
        } elseif ( $a[ord($c)] == $m ) {    // already has max number
            $n = 1;
        } else {
            $n = $m - $a[ord($c)] + 1;       // add this many chars
        }
        $o .= str_repeat( $c, $n );
        $a[ord($c)] = $m;                   // has reached the max
    }
    return $o; 
}
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.