Gleiche Anzahl Buchstaben


19

Buchstaben der Worte wollen Fairness.

Sie beschlossen, gleich oft in einem Satz vorzukommen.

Beispiel:

Priorities

Wird werden:

Ppprrioooritttieeesss

Jeder Buchstabe erscheint dreimal, wie der häufigste i, dreimal.

Es spielt keine Rolle, wo Sie die wiederholten Buchstaben ablegen, solange sie sich neben einem ähnlichen Buchstaben befinden.

Dh:

Pppriooorritttieeesss ist OK (der Buchstabe 'r')

Ppprioororitttieeesss ist nicht OK (der Buchstabe 'r')

Ein anderes Beispiel:

invoice

Wird werden:

innvvooiccee

Ein anderes Beispiel:

Remittance Advice

Wird werden:

Rrremmmiitttaannncce Adddvvvice

Leerzeichen, Komma, Fragezeichen, Anführungszeichen usw. gelten für diese Herausforderung nicht als Buchstaben. Ich muss nur [a-zA-Z] berücksichtigen. Nur einmal ist Platz genug und die Reihenfolge der Buchstaben sollte gleich bleiben.

Die Groß- und Kleinschreibung von Buchstaben spielt keine Rolle, Groß- und Kleinschreibung werden als der gleiche Buchstabe gezählt. Das heißt: Piphat 2 'P's und 1' I ', so wird es Piip.

Es ist der Fall, unempfindliche Buchstaben können in jeder Form sein, Piip=piip=piiP=PiiP

Das ist


2
Könnte ich vorschlagen, die Sandbox für zukünftige Herausforderungen zu verwenden, um alle Details auszubügeln, bevor Sie die Frage an main
Jo King,

Ist "rrreeemmmiiitttaaannncccdddvvv" im angegebenen Beispiel eine akzeptable Ausgabe (da die Reihenfolge der einzelnen Buchstaben (wie als az definiert) immer noch beibehalten wird)? (Meine Gelee-Antwort beruht derzeit auf dieser Interpretation als OK.)
Jonathan Allan

1
@ JonathanAllan Hmm, obwohl ich die Wahl OP überlasse, bezweifle ich es sehr. Nicht nur die Nicht-Buchstaben-Zeichen (das Leerzeichen) sind weg, sondern Sie haben auch alle Zeichen nebeneinander platziert, anstatt sie an derselben Stelle zu belassen. Ihre Ausgabe macht die Herausforderung anders und einfacher (imho).
Kevin Cruijssen

1
@ KevinCruijssen das Leerzeichen ist auf der linken Seite - es ist kein Buchstabe daher muss nicht eingehalten werden "und die Reihenfolge der Buchstaben sollte gleich bleiben"
Jonathan Allan

1
@ JonathanAllan Ah, ich habe den Raum nicht bemerkt, meine schlechte. Ich verstehe die Argumentation, die Sie in Ihrer Jelly-Antwort angegeben haben, vollständig und stütze mich darauf, dass es sich tatsächlich um eine gültige Ausgabe handelt. Ich würde jedoch lieber eine Änderung der Formulierung sehen und dann Ihre Ausgabe zulassen, da dies die Herausforderung selbst vollständig ändern würde.
Kevin Cruijssen

Antworten:


5

05AB1E , 16 Bytes

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

Probieren Sie es online!

Erläuterung

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 Bytes

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

Probieren Sie es online!

Base-R-Ansatz:

  • einige Ideen aus @ J.Doe R + stringr Ansatz zu stehlenIch habe und 26 Bytes gespart!
  • Weitere 5 Bytes, die mit dem @ J.Doe-Vorschlag gespeichert wurden, den R- +Operator zu missbrauchen

Ich bin beeindruckt, dass du mit Base-R auf 111 gekommen bist!
J.Doe

@ J.Doe: mein ursprünglichen 137 - Lösung Nach der Veröffentlichung Bytes, ich mein Ansatz etwas von Ihnen inspiriert geändert, und ich konvergierte im Grunde zu Ihrer Lösung, nur mit stringr entfernt: D
digEmAll

1
106 Bytes bei Missbrauch des Operators. Base-R gewinnt!
J.Doe

@ J.Doe: super!
digEmAll

5

Perl 6 , 82 Bytes

-3 bytes dank nwellnhof

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

Probieren Sie es online!

Nimmt eine veränderbare Zeichenfolge und ändert sie an Ort und Stelle.

Erläuterung:

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

Sie können den .=Operator wie verketten a.=lc.=subst(...). Ich bin mir nicht sicher, ob das Ändern der Groß- / Kleinschreibung eines vorhandenen Briefes zulässig ist. Auch <:L>statt <:Ll>.
Nwellnhof

@nwellnhof Ja, der Fragesteller sagt, dass bei der Ausgabe die Groß- und Kleinschreibung nicht berücksichtigt wird
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))

Probieren Sie es online!

Kommentiert

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

Meine JS Fähigkeiten saugen, so dass ich ein wenig verwirrt über diesen Teil bin: o[l] = // updates o[l] to a non-numeric value. Wenn ich das richtig verstehe, oist ein Integer-Array in Fund gfunktionsfähig, ändert sich aber in ein String-Array, das ein oder mehrmals das Zeichen cin dem zuvor erwähnten Teil enthält? Auch ich denke , die Werte osind undefinedstandardmäßig, da Sie verwenden o[l]=-~o[l]statt ++o[l]?
Kevin Cruijssen

1
@KevinCruijssen Wir möchten, dass jeder Buchstabe nur einmal mit der maximalen Anzahl von Vorkommen aufgefüllt wird. Bei der Aktualisierung o[l]auf einen Buchstaben führt jede nachfolgende Iteration mit demselben Buchstaben zu m - o[l] --> NaN(Ganzzahl minus Buchstabe) und l.repeat(NaN) == ''. (Über den letzten Punkt: Ja, das ist richtig.)
Arnauld

Ah ok, danke für die Erklärung! :)
Kevin Cruijssen

(und ich hätte sagen sollen, String statt Brief )
Arnauld

5

J , 33 56 46 Bytes

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

Probieren Sie es online!

Es konnte kein Weg gefunden werden, der Verwendung zu entgehen ~:tolower zweimal zu verwenden.

Wie es funktioniert

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 Bytes

Ich bin nicht sehr gut in stringr. Gibt eine Mischung aus Groß- und Kleinschreibung zurück, da die Frage besagt, dass es egal ist.

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}

Probieren Sie es online!

Erläuterung

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 Bytes

Lösung:

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

Beispiele:

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"

Erläuterung:

Könnte mit einer anderen Herangehensweise golfbar sein, wird weiter denken

{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

Kohle , 33 32 Bytes

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

Probieren Sie es online! Link ist eine ausführliche Version des Codes. Erläuterung:

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

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 Bytes dank @Nevay .

Die Ausgabe erfolgt in Großbuchstaben.

Probieren Sie es online aus. (HINWEIS: String.repeat(int)wird emuliert alsrepeat(String,int) bei derselben , da Java 11 noch nicht mit TIO ausgeführt wird.)

Erläuterung:

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

Können Sie var für ein Byte verwenden?
Quintec

@Quintec Statt der charmeinst du? Unglücklicherweise nicht. varkann nur für einzelne Felder verwendet werden. Also char m=1,i=127,a[]=new char[i];wäre es stattdessen var m=1;var i=127;var a=new char[i];. Hier ein nützlicher Tipp, was Sie mit Java 10 tun können und was nicht var. (Ich könnte das intin der Schleife durch ersetzen var, aber die
Byteanzahl

Gotcha, danke. Ich habe noch keine Ahnung, wie Java 9/10/11 funktioniert, haha, ich bleibe bei 8; p
Quintec

@Quintec Java 9 bekomme ich auch nicht wirklich, da es hauptsächlich auf diese REPL abzielt. Java 10 ist größtenteils dasselbe wie Java 8, mit Ausnahme von var. Und Java 11 hat kaum Änderungen in Bezug auf Codegolf, mit Ausnahme der String.repeatMethode, die ich schon viele Male verwendet habe. Es hat auch das neue String.stripLeadingoder String.stripTrailing, das wie trimaber nur die führenden / nachfolgenden Leerzeichen fungiert und String.isBlank()dasselbe ist wie String.trim().isEmpty()(leer oder nur Leerzeichen).
Kevin Cruijssen

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

-3 Bytes von @ETHproductions

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

Ich versuche es zu erklären

;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

Probieren Sie es online!


1
Ich hoffe, es macht dir nichts aus, ich habe einen Teil der Erklärung erweitert (diese eine Zeile, die erklärte, was ungefähr 10 Zeichen auf einmal taten: P). Der úTrick ist genial, übrigens :-)
ETHproductions

@ETHproductions Ich weiß das zu schätzen.
Ich bin

1
Leider scheint es zu scheitern, wenn es sich nicht um Buchstaben handelt (sie sollten nicht geändert werden). Eine einfache Lösung wäre, eine einzufügen ñ oC ó¥, obwohl es erforderlich ist, diese wieder in die ;...
ETHproductions

Warten Sie ... seit wann haben Sie ñan Saiten gearbeitet ?! @ETHproductions, bitte sagen Sie mir, dass es sich um eine neue Erweiterung handelt, die ich die ganze Zeit nicht übersehen habe!
Shaggy

@ Shaggy Anscheinend war es vor 2,5 Monaten - aber keine Sorge, ich hatte sogar vergessen, dass es bis zu dieser Antwort existiert
;-)

2

Ruby , 89 Bytes

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

Probieren Sie es online!

Ich habe verschiedene Ansätze ausprobiert, aber was wirklich viele Bytes spart, ist das Hinzufügen von jeweils einem Zeichen.

Wie:

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

Es wird ein Zeichenbereich verwendet 'a'..'z'. Siehe Skript für vorherige PowerShell unten.

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

Erklärtes Testskript:

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

Ausgabe:

True: Pppriooorritttieeesss
True: innvvooiccee
True: Rrremmmitttannnce Aadddvvviicce

Powershell 5.1-, 133 Bytes

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

2

Rot , 252 Bytes

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

Probieren Sie es online!

Lächerlich lange Lösung ...

Erläuterung:

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

Probieren Sie es online!

+33 Bytes aus meiner ersten Lösung für diese endlosen zusätzlichen Einschränkungen. JS nervt mit Manipulationen, bei denen die Groß- und Kleinschreibung nicht beachtet wird.

-3 Bytes zurück Danke @Arnauld.

Erläuterung

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

Lösungen müssen in der Lage sein, Eingaben in gemischten Groß- und Kleinschreibung zu verarbeiten.
Shaggy

@ Shaggy Ich denke, die Herausforderung wurde nach Ihrem Kommentar bearbeitet. Es scheint, dass der Fall der Ausgabe keine Rolle spielt.
Arnauld

Andererseits müssen Funktionen wiederverwendbar sein , was hier nicht der Fall ist.
Arnauld

@ Arnauld Oh, ich sehe dich manchmal fals temporären Speicher verwenden, also dachte ich, dass das in Ordnung ist
Shieru Asakoto

map()Rückruffunktionen können sicher für die Speicherung verwendet werden, da sie in einem lokalen Bereich definiert sind. Die Verwendung der global definierten Hauptfunktion ist gefährlicher. Hier können Sie den Rückruf des ersten verwenden map(), der Sie zurück zu bringt 137 Bytes .
Arnauld

2

Schale , 15 Bytes

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

Probieren Sie es online!

Brute Force, also sehr langsam.

Erläuterung

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

konnte überhaupt keine Ergebnisse
erzielen

@asmgx Das Programm ist nur sehr langsam. Bei Eingaben mit einer Länge von 8 und länger scheint es bei TIO eine Zeitüberschreitung zu geben, da die Berechnung nach 1 Minute abgebrochen wird. Der Offline-Interpreter sollte ein Ergebnis liefern, wenn Sie lange genug warten (wahrscheinlich mehrere Stunden für Eingaben der Länge 10).
Zgarb

2

Perl 6 , 77 70 Bytes

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

Probieren Sie es online!

So fügt GB ein Zeichen ein, bis alle Zeichen gleich oft vorkommen. Erhält eine Zeichenfolge, die direkt geändert wird.

Wenn Unterstriche wie Buchstaben behandelt werden, kann dies zu einem regulären Ausdruck werden /\w/ zwei Bytes einsparen.

Erläuterung

{
                    .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 Es scheint, dass Ihre Verbesserung auf der alten Version basiert, bevor ich den {*}Trick entdeckte.
Nwellnhof

Also, das ist wie eine Abkürzung für .value(s)? Klar, ich muss möglicherweise einige meiner alten Lösungen aktualisieren
Jo King,


1

C (clang) , 246 223 220 210 208 193 188 Bytes

Compiler-Flag -DF=;for(i=0;b[i];i++ -DB=b[i](29 Byte)

Unterstützung für gemischte Groß- und Kleinschreibung hinzugefügt.

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

Probieren Sie es online!


1

Pyth, 31 30 Bytes

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

Probieren Sie es hier aus

Erläuterung

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 Bytes

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
}

Probieren Sie es online!


0

Kotlin Android, 413 Bytes

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

Versuchen Sie es online

Erklärung Schritt 1 -> Liste der verschiedenen Zeichen auswählen. Schritt 2 -> Ermitteln Sie die Anzahl aller Zeichen in der Zeichenfolge und wählen Sie die maximale Zeichenfrequenz aus. Schritt 3 -> Unterschied in der Häufigkeit der Zeichen in Bezug auf die maximale Zeichenhäufigkeit ermitteln. Schritt 4 -> Zeichen in Bezug auf die Positionen in der Zeichenfolge platzieren. Viel Spaß beim Lösen!



0

PHP ,185 173 170 Bytes

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

Probieren Sie es online!

Ungolfed (und nicht ternär und nicht optimiert).

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; 
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.