Aynı sayı harfleri


19

Kelimelerin harfleri adalet ister.

Aynı cümle içinde aynı sayıda görünmeye karar verdiler.

Misal:

Priorities

Olacak:

Ppprrioooritttieeesss

Her harf 3 kez görünür, en yaygın harf i3 kez görünür.

Benzer bir harfin yanına geldikleri sürece tekrarlanan harfleri nereye koyduğunuz önemli değildir.

yani:

Pppriooorritttieeesss tamam ('r' harfi)

Ppprioororitttieeesss uygun değil ('r' harfi)

Başka bir örnek:

invoice

Olacak:

innvvooiccee

Başka bir örnek:

Remittance Advice

Olacak:

Rrremmmiitttaannncce Adddvvvice

Boşluk, virgül, soru işareti, tırnak vb. Bu meydan okuma için harf olarak kabul edilmez. Sadece [a-zA-Z] 'yi göz önünde bulundurmanız gerekir. Sadece bir kez boşluk yeterlidir ve harflerin sırası aynı kalmalıdır.

Harflerin büyük harf kullanımı önemli değildir, büyük ve küçük harfler aynı harf olarak sayılır. Yani: Pip2 'P ve 1' I 'vardır, böylece olur Piip.

Duyarsız harflerin herhangi bir biçimde olabileceği, Piip=piip=piiP=PiiP

Bu


2
Ana soru göndermeden önce tüm ayrıntıları
Jo King

"Rrreeemmmiiitttaaannncccdddvvv" verilen örnekte kabul edilebilir bir çıktı mıdır ( ayrı harflerin sırası (az olarak tanımlandığı gibi) hala sağlandığından)? (Jelly cevabım şu anda bu yorumun iyi olmasına dayanıyor.)
Jonathan Allan

1
@JonathanAllan Hmm, seçimi OP'ye bırakmama rağmen, bundan çok şüpheliyim. Harf olmayan karakterler (boşluk) gitmedi, aynı zamanda tüm karakterleri aynı yerde tutmak yerine yan yana koydunuz. Çıktınız meydan okumayı farklı ve daha kolay hale getirir (imho).
Kevin Cruijssen

1
@KevinCruijssen boşluk solda - bu yüzden uymak gerekmez bir mektup değildir "ve harflerin sırası aynı kalmalıdır"
Jonathan Allan

1
@JonathanAllan Ah, alanı fark etmedim, kötüyüm. Jelly cevabınızda verdiğiniz gerekçeyi tamamen anlıyorum ve bunun gerçekten geçerli bir çıktı olduğuna dayanıyorum, ancak ifadenin değiştiğini görmeyi tercih ediyorum, daha sonra çıktınıza izin veriyor, çünkü meydan okumayı tamamen değiştirecek.
Kevin Cruijssen

Yanıtlar:


5

05AB1E , 16 bayt

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

Çevrimiçi deneyin!

açıklama

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 bayt

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

Çevrimiçi deneyin!

Base R yaklaşımı:

  • @ J.Doe R + stringr yaklaşımından bazı fikirler çalarak , 26 bayt kurtardım!
  • R +operatörünü kötüye kullanmak için @ J.Doe önerisi kullanılarak kaydedilen başka bir 5 bayt

Base-R ile 111'e gitmenden etkilendim!
J.Doe

@ J.Doe: Orijinal 137 bayt çözümümü yayınladıktan sonra, sizden esinlenerek yaklaşımımı biraz değiştirdim ve temelde çözümünüze yaklaştım, sadece stringr kaldırıldı: D
digEmTüm

1
Operatörün kötüye kullanıldığı 106 bayt . Base-R kazanır!
J.Doe

@ J.Doe: harika!
digEmTüm

5

Perl 6 , 82 bayt

Nwellnhof sayesinde -3 bayt

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

Çevrimiçi deneyin!

Değişken bir dize alır ve yerinde değiştirir.

Açıklama:

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

.=Operatörü zincirleyebilirsiniz a.=lc.=subst(...). Mevcut bir harfin büyük / küçük harf durumunu değiştirmeye izin verilip verilmediğinden emin değilim. Ayrıca <:L>yerine <:Ll>.
nwellnhof

@nwellnhof Evet, asker çıktının büyük / küçük harfe duyarsız olduğunu söylüyor
Jo King

5

JavaScript (ES6), 112 bayt

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

Çevrimiçi deneyin!

Yorumlananlar

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

Bu bölümü hakkında karıştı biraz değilim bu yüzden benim JS becerileri, emmek: o[l] = // updates o[l] to a non-numeric value. Doğru anlıyorsam o, Fve gfonksiyonlarında bir tamsayı dizisi var , ama daha cönce bahsettiğim bölümdeki karakterin bir veya daha fazla kez tutan bir dize dizisine değişir ? Ayrıca ben değerlerini tahmin oolan undefinedvarsayılan olarak kullandığınız beri o[l]=-~o[l]yerine ++o[l]?
Kevin Cruijssen

1
@KevinCruijssen Her bir mektubun yalnızca bir kez maksimum sayıya doldurulmasını istiyoruz. o[l]Bir harfin güncellenmesi ile aynı harfle müteakip herhangi bir yineleme m - o[l] --> NaN(tamsayı eksi harfi) ve karakterine yol açar l.repeat(NaN) == ''. (Son nokta hakkında: evet, bu doğru.)
Arnauld

Ah tamam, açıklama için teşekkürler! :)
Kevin Cruijssen

(ve harf yerine dize söylemeliydim )
Arnauld

5

J , 33 56 46 bayt

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

Çevrimiçi deneyin!

~:tolowerİki kez kullanmaktan kaçınmanın bir yolu bulunamadı .

Nasıl çalışır

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 bayt

Çok iyi değilim stringr. Sorunun önemli olmadığını söylediği için küçük ve büyük harflerin bir karışımını döndürür.

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}

Çevrimiçi deneyin!

açıklama

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 bayt

Çözüm:

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

Örnekler:

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"

Açıklama:

Farklı bir yaklaşımla golf edilebilir olabilir, düşünmeye devam eder

{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

Kömür , 33 32 bayt

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

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı versiyonudur. Açıklama:

  θ                                 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 bayt

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

@Nevay sayesinde -14 bayt .

Çıktı tam büyük harflidir.

Çevrimiçi deneyin. (NOT: Java 11 henüz TIO'da olmadığı için aynı bayt sayımı için String.repeat(int)taklit edilmiştir repeat(String,int).)

Açıklama:

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

Bayt için var kullanabilir misiniz?
Quintec

Yerine charmi demek istiyorsun? Ne yazık ki hayır. varyalnızca tek alanlar için kullanılabilir. Yani bunun yerine char m=1,i=127,a[]=new char[i];olurdu var m=1;var i=127;var a=new char[i];. Java 10'larla yapabilecekleriniz ve yapamayacağınız şeylerin yararlı bir ipucu var. ( intDöngüdeki ile değiştirebilirim var, ancak bayt sayısı aynı kalacaktı.)
Kevin Cruijssen

Yakaladım, teşekkürler. Java 9/10/11'in nasıl çalıştığı hakkında hala bir fikrim yok, haha, 8'e sadık kalacağım; p
Quintec

@Quintec Java 9 Ben de anlamıyorum, çünkü esas olarak bu REPL'e odaklanmış durumda. Java 10, Java 8 ile çoğunlukla aynıdır var. Ve Java 11 String.repeatzaten zaten birçok kez kullandığım yöntem dışında, tüm codegolf ile ilgili herhangi bir değişiklik yok . Ayrıca, yalnızca önde gelen / sondaki boşluklar gibi davranan ve (yalnızca boş veya boşluk) ile aynı olan yeni String.stripLeadingveya vardır . String.stripTrailingtrimString.isBlank()String.trim().isEmpty()
Kevin Cruijssen

1
-14 bayt: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 bayt

@ETHproductions adlı öğeden -3 bayt

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

Açıklamaya çalışmak

;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

Çevrimiçi deneyin!


1
Umursamıyorsun, açıklamanın bir kısmını genişlettim (yaklaşık 10 karakterin ne yaptığını açıklayan bir satır: P) úHile dehası, btw :-)
ETHproductions

@ETHproductions Bunu takdir ediyorum. İngilizce'de çok iyi değilim, teşekkürler
Luis felipe De jesus Munoz

1
Ne yazık ki, dahil olmayan harfler olduğunda başarısız gibi görünüyor (değiştirilmemelidir). Basit bir düzeltme eklemek için ñ oC ó¥olsa da, geri ekleme gerektirir ;...
ETHproductions

Bekle ... Ne zamandan beri ñteller üzerinde çalıştı ?! @ETHproductions, lütfen bana bunun yeni bir ek olduğunu söyle ve bu kadar süredir gözden kaçırmadım!
Shaggy

@Shaggy Görünüşe göre 2.5 ay önce - ama endişelenme, hatta bu cevaba kadar var olduğunu unutmuştum ;-)
ETHproductions 6:18 '

2

Ruby , 89 bayt

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

Çevrimiçi deneyin!

Farklı yaklaşımlar denedim, ama gerçekten çok fazla bayt tasarrufu sağlayan bir seferde bir karakter eklemektir.

Nasıl:

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

Karakter aralığı kullanır 'a'..'z'. Aşağıdaki önceki Powershell komut dosyasına bakın.

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

Açıklanan test komut dosyası:

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

Çıktı:

True: Pppriooorritttieeesss
True: innvvooiccee
True: Rrremmmitttannnce Aadddvvviicce

Powershell 5.1-, 133 bayt

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

2

Kırmızı , 252 bayt

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

Çevrimiçi deneyin!

Gülünç derecede uzun çözüm ...

Açıklama:

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 bayt

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

Çevrimiçi deneyin!

Hiç bitmeyen ek kısıtlamalar için ilk çözümümden +33 bayt. JS, bildiğiniz büyük / küçük harf duyarsız dize manipülasyonlarını berbat eder.

-3 bayt geri Teşekkürler @Arnauld.

açıklama

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

Çözümlerin karma kasa girişlerini işleyebilmesi gerekir.
Shaggy

@Shaggy Bence meydan okuma yorumundan sonra düzenlendi. Çıkışın durumu önemli değil gibi görünüyor.
Arnauld

Öte yandan, fonksiyonlar yeniden kullanılabilir olmalıdır , bu burada böyle değildir.
Arnauld

@Arnauld Oh, bazen fgeçici depolama olarak kullandığınızı görüyorum, bu yüzden iyi olduğunu düşündüm
Shieru Asakoto

map()yerel kapsamda tanımlandıkları için geri arama işlevlerinin depolama için kullanımı güvenlidir. Global olarak tanımlanmış olan ana işlevi kullanmak daha tehlikelidir. Burada, sizi 137 baytamap() geri getiren ilk geri aramayı kullanabilirsiniz .
Arnauld

2

Kabuk , 15 bayt

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

Çevrimiçi deneyin!

Kaba kuvvet, çok yavaş.

açıklama

ḟ§Ë#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).

hiç sonuç
alınamadı

@asmgx Program gerçekten yavaş. 8 dakika ve daha uzun girişler için TIO'da zaman aşımına uğramış gibi görünüyor, çünkü hesaplamayı 1 dakika sonra öldürüyor. Çevrimdışı tercüman yeterince beklerseniz bir sonuç vermelidir (uzunluk-10 girişleri için muhtemelen birkaç saat).
Zgarb

2

Perl 6 , 77 70 bayt

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

Çevrimiçi deneyin!

GB'nin tüm karakterler aynı sayıda görünene kadar karakter ekleme yaklaşımını kullanmak. Yerinde değiştirilen bir dize alır.

Alt çizgiler harf gibi ele alınabiliyorsa, normal ifade /\w/iki bayt tasarrufu sağlayabilir .

açıklama

{
                    .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 Ben {*}hileyi keşfetmeden önce sizin geliştirmeniz eski sürüme dayanıyor gibi görünüyor .
nwellnhof

Yani bu bir kısayol gibi .value(s)mi? Düzgün, bazı eski çözümlerimi güncellemem gerekebilir
Jo King


1

C (çınlama) , 246 223 220 210 208 193 188 bayt

Derleyici bayrağı -DF=;for(i=0;b[i];i++ -DB=b[i](29 bayt)

Karışık kasa desteği eklendi.

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

Çevrimiçi deneyin!


1

Pyth, 31 30 bayt

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

Burada deneyin

açıklama

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 Bayt

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

Ungolfed

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
}

Çevrimiçi deneyin!


0

Kotlin Android, 413 bayt

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

Çevrimiçi deneyin

Açıklama adım 1 -> Ayrı karakterlerin listesini seçin. 2. adım -> Dizgideki her karakter sayısını alın ve maksimum karakter sıklığını seçin. adım 3 -> karakterlerin maksimum karakter frekansına göre karakter sıklığı farkını elde edin. adım 4 -> karakter dizesindeki konumlara göre karakteristikleri yerleştirin. Mutlu Çözme!



0

PHP ,185 173 170 bayt

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

Çevrimiçi deneyin!

Değişmez (ve üç değişkenli ve optimize edilmemiş).

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; 
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.