ตัวอักษรตัวเลขเดียวกัน


19

ตัวอักษรของคำต้องการความเป็นธรรม

พวกเขาตัดสินใจที่จะปรากฏจำนวนครั้งเดียวกันในประโยคเท่ากัน

ตัวอย่าง:

Priorities

จะกลายเป็น:

Ppprrioooritttieeesss

ตัวอักษรแต่ละตัวปรากฏขึ้น 3 ครั้งตามตัวอักษรที่พบบ่อยที่สุดคือiปรากฏขึ้น 3 ครั้ง

มันไม่สำคัญว่าคุณจะใส่ตัวอักษรที่ซ้ำไปซ้ำมานานเท่าไร

เช่น:

Pppriooorritttieeesss ก็โอเค (ตัวอักษร 'r')

Ppprioororitttieeesss ไม่เป็นไร (ตัวอักษร 'r')

ตัวอย่างอื่น:

invoice

จะกลายเป็น:

innvvooiccee

ตัวอย่างอื่น:

Remittance Advice

จะกลายเป็น:

Rrremmmiitttaannncce Adddvvvice

ช่องว่างเครื่องหมายจุลภาคเครื่องหมายคำถามใบเสนอราคา ฯลฯ ไม่ถือเป็นตัวอักษรสำหรับความท้าทายนี้ จำเป็นต้องพิจารณา [a-zA-Z] เท่านั้น เพียงครั้งเดียวที่มีพื้นที่เพียงพอและคำสั่งของตัวอักษรควรจะยังคงเหมือนเดิม

การใช้อักษรตัวพิมพ์ใหญ่ไม่สำคัญตัวพิมพ์ใหญ่และตัวพิมพ์เล็กจะนับเป็นตัวอักษรเดียวกัน นั่นคือ: Pipมี 2 'P และ 1 'ฉัน' Piipดังนั้นมันจะกลายเป็น

มันเป็นตัวพิมพ์เล็กและใหญ่กรณีที่สามารถอยู่ในรูปแบบใด ๆ Piip=piip=piiP=PiiP

นี่คือ


2
ฉันขอแนะนำให้ใช้Sandboxสำหรับความท้าทายในอนาคตเพื่อช่วยรีดรายละเอียดทั้งหมดก่อนโพสต์คำถามไปที่หน้าหลัก
Jo King

คือ "rrreeemmmiiitttaaannncccdddvvv" เอาต์พุตที่ยอมรับได้ในตัวอย่างที่กำหนด (เนื่องจากลำดับของตัวอักษรที่แตกต่างกัน (ตามที่กำหนดเป็น az) ยังคงอยู่)? (คำตอบ Jelly ของฉันขึ้นอยู่กับการตีความนี้ว่าใช้ได้)
Jonathan Allan

1
@JanathanAllan อืมแม้ว่าฉันจะเลือก OP แต่ฉันสงสัยอย่างมาก ไม่เพียง แต่ตัวละครที่ไม่ใช่ตัวอักษร (ช่องว่าง) หายไป แต่คุณยังได้ใส่อักขระทั้งหมดที่อยู่ติดกันแทนที่จะทำให้มันอยู่ในที่เดียวกัน ผลลัพธ์ของคุณทำให้ความท้าทายแตกต่างและง่ายขึ้น (imho)
Kevin Cruijssen

1
@KevinCruijssen พื้นที่อยู่ทางด้านซ้าย - มันไม่ใช่ตัวอักษรดังนั้นจึงไม่จำเป็นต้องปฏิบัติตาม "และคำสั่งของตัวอักษรควรจะยังคงเหมือนเดิม"
Jonathan Allan

1
@JanathanAllan Ah ไม่ได้สังเกตเห็นพื้นที่แย่ของฉัน ฉันเข้าใจเหตุผลที่คุณให้ไว้ในคำตอบของเยลลี่ของคุณอย่างสมบูรณ์และขึ้นอยู่กับว่ามันเป็นผลลัพธ์ที่ถูกต้อง แต่ฉันอยากเห็นคำพูดเปลี่ยนไปจากนั้นอนุญาตให้ผลลัพธ์ของคุณเพราะมันจะเปลี่ยนความท้าทายโดยสิ้นเชิง
Kevin Cruijssen

คำตอบ:


5

05AB1E , 16 ไบต์

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

ลองออนไลน์!

คำอธิบาย

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 ไบต์

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

ลองออนไลน์!

วิธีฐาน R:

  • ขโมยแนวคิดบางส่วนจาก@ J.Doe R + วิธี stringrฉันบันทึก 26 ไบต์ได้!
  • บันทึกอีก 5 ไบต์โดยใช้ @ J.Doe ข้อเสนอแนะในการใช้+โอเปอเรเตอร์ที่ไม่เหมาะสม

ฉันประทับใจคุณถึง 111 ด้วย base-R!
J.Doe

@ J.Doe: หลังจากเผยแพร่โซลูชัน 137 ไบต์เดิมของฉันฉันเปลี่ยนแนวทางของฉันเล็กน้อยที่ได้รับแรงบันดาลใจจากคุณและโดยทั่วไปฉันก็แปรสภาพเป็นโซลูชันของคุณเพียงแค่เอา stringr ออก: D
digEmAll

1
106 ไบต์พร้อมกับการใช้งานในทางที่ผิด Base-R ชนะ!
J.Doe

@ J.Doe: ยอดเยี่ยม!
digEmAll

5

Perl 6 , 82 ไบต์

-3 ไบต์ขอบคุณ nwellnhof

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

ลองออนไลน์!

รับสายที่เปลี่ยนแปลงได้และปรับเปลี่ยนให้เข้าที่

คำอธิบาย:

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

คุณสามารถโซ่ผู้ประกอบการเช่น.= a.=lc.=subst(...)ฉันไม่แน่ใจว่าจะอนุญาตให้เปลี่ยนกรณีของจดหมายที่มีอยู่หรือไม่ นอกจากนี้แทน<:L> <:Ll>
nwellnhof

@nwellnhof ใช่ผู้ถามบอกว่าผลลัพธ์ไม่ตรงตามตัวพิมพ์ใหญ่
Jo King

5

JavaScript (ES6), 112 ไบต์

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

ลองออนไลน์!

แสดงความคิดเห็น

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

ทักษะของฉัน JS o[l] = // updates o[l] to a non-numeric valueดูดดังนั้นฉันบิตสับสนเกี่ยวกับส่วนนี้: หากฉันเข้าใจอย่างถูกต้องoเป็นจำนวนเต็มอาร์เรย์ในFและgฟังก์ชั่น แต่การเปลี่ยนแปลงสตริงที่ถือตัวละครอย่างน้อยหนึ่งครั้งcในส่วนที่ฉันกล่าวถึงก่อนหน้านี้? นอกจากนี้ฉันเดาว่าค่าoจะเป็นundefinedค่าเริ่มต้นเนื่องจากคุณใช้o[l]=-~o[l]แทน++o[l]หรือไม่
Kevin Cruijssen

1
@KevinCruijssen เราต้องการให้จดหมายแต่ละฉบับมีจำนวนครั้งสูงสุดเพียงครั้งเดียว โดยการปรับปรุงo[l]ไปยังตัวอักษรที่ซ้ำ ๆ ที่ตามมาด้วยตัวอักษรเดียวกันจะนำไปสู่การm - o[l] --> NaN(จำนวนเต็มจดหมายลบ) l.repeat(NaN) == ''และ (เกี่ยวกับจุดสุดท้าย: ใช่ถูกต้องแล้ว)
Arnauld

โอเคขอบคุณสำหรับคำอธิบาย! :)
Kevin Cruijssen

(และฉันควรจะมีการกล่าวว่าสตริงมากกว่าตัวอักษร )
Arnauld

5

J , 33 56 46 46 ไบต์

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

ลองออนไลน์!

ไม่พบวิธีหลีกเลี่ยงการใช้~:tolowerสองครั้ง

มันทำงานอย่างไร

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 ไบต์

stringrผมไม่ได้ดีมากที่ ส่งคืนการผสมตัวพิมพ์เล็กและตัวพิมพ์ใหญ่เนื่องจากคำถามบอกว่ามันไม่สำคัญ

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}

ลองออนไลน์!

คำอธิบาย

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 ไบต์

วิธีการแก้:

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

ตัวอย่าง:

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"

คำอธิบาย:

อาจจะเล่นกอล์ฟได้ด้วยวิธีการที่แตกต่างกันจะคิดต่อไป

{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

Charcoal , 33 32 ไบต์

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

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด คำอธิบาย:

  θ                                 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 ไบต์

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 ไบต์ขอบคุณที่@Nevay

เอาต์พุตเป็นตัวพิมพ์ใหญ่เต็ม

ลองออนไลน์ (หมายเหตุ: String.repeat(int)มีการจำลองrepeat(String,int)สำหรับไบต์เดียวกันเนื่องจาก Java 11 ยังไม่ได้อยู่ใน TIO)

คำอธิบาย:

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

คุณสามารถใช้ var เป็นไบต์ได้หรือไม่?
Quintec

@Quintec แทนที่จะเป็นcharคุณหมายถึงอะไร? น่าเสียดายที่ไม่มี varสามารถใช้ได้สำหรับฟิลด์เดียวเท่านั้น ดังนั้นแทนที่จะมันจะเป็นchar m=1,i=127,a[]=new char[i]; นี่เป็นเคล็ดลับที่เป็นประโยชน์ของสิ่งที่คุณสามารถและไม่สามารถทำอะไรกับ Java 10 (ฉันสามารถแทนที่การวนซ้ำด้วยแต่การนับไบต์จะยังคงเหมือนเดิม)var m=1;var i=127;var a=new char[i];varintvar
Kevin Cruijssen

Gotcha ขอบคุณ ยังไม่มีความคิดว่า Java 9/10/11 ทำงานอย่างไรฮ่าฮ่าฉันจะติดกับ 8; p
Quintec

@Quintec Java 9 ฉันยังไม่ได้รับจริงๆเพราะส่วนใหญ่เพ่งความสนใจไปที่ REPL Java 10 เป็นส่วนใหญ่เช่นเดียวกับ Java 8 varยกเว้น และ Java 11 แทบจะไม่มีการเปลี่ยนแปลงใด ๆ ที่เกี่ยวข้องกับ codegolf ทั้งหมดยกเว้นString.repeatวิธีที่ฉันใช้โหลดครั้งแล้ว นอกจากนี้ยังมีใหม่String.stripLeadingหรือString.stripTrailingที่ทำหน้าที่เหมือนtrimแต่เฉพาะ whitespaces ชั้นนำ / ต่อท้ายและString.isBlank()ซึ่งเป็นเช่นเดียวกับString.trim().isEmpty()(ว่างเปล่าหรือช่องว่างเท่านั้น)
Kevin Cruijssen

1
-14 ไบต์: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 ไบต์

-3 ไบต์จาก @ETHproductions

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

พยายามอธิบาย

;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

ลองออนไลน์!


1
หวังว่าคุณจะไม่รังเกียจฉันได้ขยายคำอธิบายส่วนหนึ่ง (นั่นคือหนึ่งบรรทัดที่อธิบายสิ่งที่เกี่ยวกับ 10 chars ในครั้งเดียว: P) úเคล็ดลับคืออัจฉริยะ btw :-)
ETHproductions

@ ETHproductions ฉันขอขอบคุณมัน ฉันไม่เก่งภาษาอังกฤษมากเกินไปขอบคุณ
Luis felipe De jesus Munoz

1
น่าเสียดายที่ดูเหมือนว่าจะล้มเหลวเมื่อไม่มีตัวอักษรที่เกี่ยวข้อง (ไม่ควรเปลี่ยนแปลง) การแก้ไขอย่างง่ายจะเป็นการแทรกñ oC ó¥แม้ว่าจะต้องเพิ่มกลับใน;...
ETHproductions

รอ ... ตั้งแต่เมื่อไหร่ที่ñทำงานกับสตริง?! @ETHproductions โปรดบอกฉันว่าเป็นส่วนเสริมล่าสุดและฉันไม่ได้มองข้ามมันตลอดเวลา!
Shaggy

@Shaggy เห็นได้ชัดว่ามันคือ2.5 เดือนที่ผ่านมา - แต่ไม่ต้องกังวลแม้ฉันจะลืมมันไปจนกระทั่งคำตอบนี้ ;-)
ETHproductions

2

Ruby , 89 ไบต์

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

ลองออนไลน์!

ฉันลองใช้วิธีที่แตกต่างกัน แต่สิ่งที่ช่วยประหยัดได้มากในไบต์คือการเพิ่มตัวละครทีละตัว

วิธี:

->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 ไบต์

'a'..'z'จะใช้ช่วงถ่าน ดูสคริปต์สำหรับ Powershell หน้าที่ด้านล่าง

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

สคริปต์ทดสอบที่อธิบาย:

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

เอาท์พุท:

True: Pppriooorritttieeesss
True: innvvooiccee
True: Rrremmmitttannnce Aadddvvviicce

Powershell 5.1-, 133 ไบต์

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

2

สีแดง 252 ไบต์

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

ลองออนไลน์!

วิธีแก้ปัญหาที่ยาวขัน ...

คำอธิบาย:

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 ไบต์

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

ลองออนไลน์!

+33 ไบต์จากโซลูชันแรกของฉันสำหรับข้อ จำกัด เพิ่มเติมที่ไม่มีที่สิ้นสุด JS ดูดการจัดการสตริงที่ไม่สนใจตัวพิมพ์เล็กและใหญ่ที่คุณรู้

-3 ไบต์กลับขอบคุณ @Arnauld

คำอธิบาย

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

โซลูชันต้องสามารถจัดการอินพุตผสมตัวพิมพ์เล็ก
Shaggy

@Shaggy ฉันคิดว่าความท้าทายนี้ได้รับการแก้ไขหลังจากความคิดเห็นของคุณ ดูเหมือนว่ากรณีของการส่งออกไม่สำคัญ
Arnauld

ในทางกลับกันฟังก์ชั่นจะต้องสามารถนำมาใช้ซ้ำซึ่งไม่ใช่กรณีที่นี่
Arnauld

@Arnauld โอ้ฉันเห็นคุณใช้fs เป็นที่เก็บข้อมูลชั่วคราวดังนั้นฉันคิดว่าไม่เป็นไร
Shieru Asakoto

map()ฟังก์ชั่นการโทรกลับมีความปลอดภัยที่จะใช้สำหรับการจัดเก็บข้อมูลเพราะพวกเขากำหนดไว้ในขอบเขตท้องถิ่น การใช้ฟังก์ชั่นหลัก - ซึ่งกำหนดไว้ทั่วโลก - เป็นอันตรายมากกว่า ที่นี่คุณสามารถใช้โทรกลับจากครั้งแรกที่map()ซึ่งจะนำคุณกลับไปที่137 ไบต์
Arnauld

2

Huskขนาด 15 ไบต์

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

ลองออนไลน์!

กำลังดุร้ายช้ามาก

คำอธิบาย

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

ไม่สามารถรับผลลัพธ์ได้เลย
asmgx

@asmgx โปรแกรมช้ามาก ๆ ดูเหมือนจะหมดเวลากับ TIO สำหรับอินพุตที่มีความยาว 8 และนานกว่านั้นเพราะจะฆ่าการคำนวณหลังจาก 1 นาที ล่ามแบบออฟไลน์ควรให้ผลลัพธ์ถ้าคุณรอนานพอ (อาจใช้เวลาหลายชั่วโมงสำหรับอินพุต -10)
Zgarb

2

Perl 6 , 77 70 ไบต์

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

ลองออนไลน์!

ใช้วิธีการของ GB ในการแทรกอักขระจนกว่าอักขระทั้งหมดจะปรากฏเป็นจำนวนเท่ากัน รับสตริงที่ถูกแก้ไขแบบแทนที่

หากสามารถใช้เครื่องหมายขีดล่างได้เช่นตัวอักษร Regex อาจกลายเป็น/\w/บันทึกสองไบต์

คำอธิบาย

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

@ โจกิ้งดูเหมือนว่าการปรับปรุงของคุณจะขึ้นอยู่กับเวอร์ชันเก่าก่อนที่ฉันจะค้นพบ{*}เคล็ดลับ
nwellnhof

ถ้าอย่างนั้นทางลัด.value(s)ใช่ไหมฉันอาจต้องอัปเดตโซลูชั่นเก่า ๆ ของฉัน
Jo King



1

Pyth, 31 30 ไบต์

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

ลองที่นี่

คำอธิบาย

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 ไบต์

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
}

ลองออนไลน์!


0

Kotlin Android, 413 ไบต์

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

ลองออนไลน์

คำอธิบายขั้นตอนที่ 1 -> เลือกรายการตัวอักษรที่แตกต่างกัน ขั้นตอนที่ 2 -> รับจำนวนถ่านทุกตัวและเลือกความถี่ถ่านสูงสุด ขั้นตอนที่ 3 -> รับความแตกต่างในความถี่ของตัวอักษรที่เกี่ยวกับความถี่สูงสุดถ่านขั้นตอนที่ 4 -> วางตัวอักษรที่เกี่ยวกับตำแหน่งในสตริง การแก้ปัญหามีความสุข!



0

PHP ,185 173 170 ไบต์

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

ลองออนไลน์!

Ungolfed (และยกเลิกการปรับแต่งและยกเลิกการปรับให้เหมาะสม)

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; 
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.