Proporción de letras mayúsculas a minúsculas


28

En este desafío, usted y sus amigos están debatiendo sobre qué caso es mejor, ¿mayúsculas o minúsculas? Para averiguarlo, escribe un programa para hacer esto por usted.

Debido a que esolangs asusta a tus amigos, y el código detallado te asusta, tu código deberá ser lo más corto posible.


Ejemplos

PrOgRaMiNgPuZzLeS & CoDe GoLf
0.52 uppercase

DowNGoAT RiGHtGoAt LeFTGoat UpGoAT
0.58 uppercase

Foo BaR Baz
0.56 lowercase

Presupuesto

La entrada consistirá solo en caracteres ASCII. Todos los caracteres no alfabéticos deben ignorarse. Habrá al menos 1 personaje de cada caso

El resultado debe ser la cantidad de mayúsculas y minúsculas que aparece con mayor frecuencia sobre la cantidad total de caracteres alfabéticos. Debe ser un decimal exacto con al menos 2 decimales. Si las mayúsculas aparecen con más frecuencia, la salida debería terminar con uppercase, o lowercase.

Nunca habrá la misma cantidad de letras mayúsculas y minúsculas.


77
Esolangs no asusta a mis amigos. ¿Eso significa que mi código puede ser muy detallado?
Alex A.

@AlexA. el código detallado lo asusta, por lo que su código también tendrá que jugarse.
Downgoat

16
Ah, claro, me había olvidado de mis pesadillas recurrentes en Java.
Alex A.

44
¿Habrá entrada con un solo caso?
manatwork

1
¿Requiere "al menos dos decimales" precisos para imprimir al menos dos decimales, o puede omitirse un segundo decimal de cero?
hvd

Respuestas:


2

Pyth - 40 bytes

Esta es la primera vez que utilizo el formato de cadena vectorizado que es bastante bueno.

Kml-zrzd2eS%Vm+cdsK" %sercase"Kc"upp low

Test Suite .


7

JavaScript (ES6) 87 bytes

Editar 1 byte guardado thx ETHProductions
Editar 1 byte guardado thx l4me

Una función anónima. Largo, pero no encontré una manera de jugar golf más

s=>(l=t=0,s.replace(/[a-z]/ig,c=>l+=++t&&c>'Z'),l/=t,l<.5?1-l+' upp':l+' low')+'ercase'

Menos golf

s=>( // arrow function returning the value of an expression
  // here I use comma for clarity, 
  // in the golfed version it's all merged in a single expression
  t = 0, // counter for letters
  l = 0, // counter for lowercase letters 
  s.replace(
    /[a-z]/ig, // find all alphabetic chars, upper or lowercase
    c => // execute for each found char (in c)
        l += ++t && c>'Z', // increment t, increment l if c is lowercase
  ),
  l /= t, // l is the ratio now
  ( l < .5 // if ratio < 1/2
    ? (1-l) +' upp' // uppercase count / total (+" upp")
    : l +' low'     // lowrcase count / total (+" low")
  ) + 'ercase' // common suffix
)

Creo que podría guardar un byte usando &&` ${t-l>l?1-l/t+'upp':l/t+'low'}ercase` .
ETHproductions

Además, c=>l+=++t&&c>'Z'¿funcionaría, creo ...?
ETHproductions

@ETHproductions su primera pista no parece útil, la segunda es inteligente, gracias
edc65

1
¿Podemos ver la versión no golfista con una explicación?
Cyoce

Se agregó la explicación de @Cyoce, de hecho es simple
edc65

4

CJam, 47 45 bytes

q__eu-\_el-]:,_:+df/" low upp"4/.+:e>"ercase"

Pruébalo en línea.

No jugar al golf por mucho tiempo ...

Explicación

q               e# Read input.
__eu-           e# Get only the lowercase characters.
\_el-           e# Get only the uppercase characters.
]:,             e# Get the lengths of the two strings.
_:+             e# Sum of the lengths.
df/             e# Lengths divided by the sum of the lengths.
" low upp"4/.+  e# Append the first number with " low" and the second " upp"
:e>             e# Find the maximum of the two.
"ercase"        e# Output other things.

4

Japt , 58 bytes

A=Uf"[a-z]" l /Uf"[A-Za-z]" l)>½?A+" low":1-A+" upp" +`ÖÐ

(Nota: SE eliminó un carácter especial antes Ö, así que haga clic en el enlace para obtener el código correcto)


¡Buen trabajo! Su primera expresión regular (incluidos los signos de dólar) se puede reemplazar con "[a-z]", y la segunda con "A-Za-z". 0.5es igual a ½. También puede eliminar las comillas finales.
ETHproductions

Con los cambios mencionados y la compresión de cadenas, obtengo 58: A=Uf"[a-z]" l /Uf"[A-Za-z]" l)>½?A+" low":1-A+" upp" +`\x80ÖÐPuede obtener la versión sin procesar de los últimos tres bytes con Oc"ercase.
ETHproductions

@Eth \x80no parecía hacer nada, y ÖÐprodujo "caso" ... ¿Quizás algunos caracteres invisibles que se truncaron? Por cierto, proporcioné mi propio mod, gracias por los consejos
nicael

@ETH Ok, logré usar ese invisi-char :)
nicael

Desafortunadamente, las barras invertidas deben duplicarse dentro de las cadenas para que funcione el analizador de expresiones regulares. En estos casos, "\w"simplemente coincide con todos ws, y "\\w"coincide con todos A-Za-z0-9_. Así que creo que tendrás que seguir "[a-z]".
ETHproductions

4

R , 133 123 118 108 106 105 104 bytes

Bajó 10 bytes gracias a @ ovs, 8 gracias a @Giuseppe y 10 nuevamente gracias a @ngm. En este punto, es realmente un esfuerzo de colaboración donde proporciono los bytes y otros los quitan;)

function(x)cat(max(U<-mean(utf8ToInt(gsub('[^a-zA-Z]',"",x))<91),1-U),c("lowercase","uppercase")[1+2*U])

Pruébalo en línea!


afeitado 1 byte más.
JayCe

3

MATL , 49 50 bytes

Utiliza la versión actual (4.1.1) del lenguaje, que es anterior al desafío.

jt3Y2m)tk=Ymt.5<?1w-YU' upp'h}YU' low'h]'ercase'h

Ejemplos

>> matl
 > jt3Y2m)tk=Ymt.5<?1w-YU' upp'h}YU' low'h]'ercase'h
 > 
> PrOgRaMiNgPuZzLeS & CoDe GoLf
0.52 uppercase

>> matl
 > jt3Y2m)tk=Ymt.5<?1w-YU' upp'h}YU' low'h]'ercase'h
 > 
> Foo BaR Baz
0.55556 lowercase

Explicación

j                   % input string
t3Y2m)              % duplicate. Keep only letters
tk=Ym               % duplicate. Proportion of lowercase letters
t.5<?               % if less than .5
    1w-             % compute complement of proportion
    YU' upp'h       % convert to string and append ' upp'
}                   % else
    YU' low'h       % convert to string and append ' low' 
]                   % end
'ercase'            % append 'ercase'

3

Julia, 76 74 bytes

s->(x=sum(isupper,s)/sum(isalpha,s);(x>0.5?"$x upp":"$(1-x) low")"ercase")

Esta es una función lambda que acepta una cadena y devuelve una cadena. Para llamarlo, asígnelo a una variable.

Sin golf:

function f(s::AbstractString)
    # Compute the proportion of uppercase letters
    x = sum(isupper, s) / sum(isalpha, s)

    # Return a string construct as x or 1-x and the appropriate case
    (x > 0.5 ? "$x upp" : "$(1-x) low") * "ercase"
end

¡Guardado 2 bytes gracias a edc65!


1
U seguramente puede guardar 2 bytes usando en ercaselugar decase
edc65

@ edc65 Gran idea, gracias!
Alex A.

3

Perl 6 ,  91 70 69 63   61 bytes

{($/=($/=@=.comb(/\w/)).grep(*~&' 'ne' ')/$/);"{$/>.5??$/!!1-$/} {<low upp>[$/>.5]}ercase"} # 91
{$/=m:g{<upper>}/m:g{\w};"{$/>.5??$/!!1-$/} {<low upp>[$/>.5]}ercase"} # 70
{"{($/=m:g{<upper>}/m:g{\w})>.5??$/!!1-$/} {<low upp>[$/>.5]}ercase"} # 69
{"{($/=m:g{<upper>}/m:g{\w})>.5??"$/ upp"!!1-$/~' low'}ercase"} # 63

{"{($/=m:g{<:Lu>}/m:g{\w})>.5??"$/ upp"!!1-$/~' low'}ercase"} # 61

Uso:

# give it a lexical name
my &code = {...}

.say for (
  'PrOgRaMiNgPuZzLeS & CoDe GoLf',
  'DowNGoAT RiGHtGoAt LeFTGoat UpGoAT',
  'Foo BaR Baz',
)».&code;
0.52 uppercase
0.580645 uppercase
0.555556 lowercase

2
¿Bloques de código de tachado? Eso es algo nuevo ...
Bojidar Marinov

1
Pierda 3 caracteres intercambiando ternary por max ("0.55 upp", "0.45 low"): Pruébelo
Phil H

3

C #, 135 bytes

Requiere:

using System.Linq;

Función real:

string U(string s){var c=s.Count(char.IsUpper)*1F/s.Count(char.IsLetter);return(c>0.5?c+" upp":1-c+" low")+"ercase";}

Con explicación:

string U(string s)
{
    var c = s.Count(char.IsUpper) // count uppercase letters
               * 1F               // make it a float (less bytes than (float) cast)
               / s.Count(char.IsLetter); // divide it by the total count of letters
    return (c > 0.5 
        ? c + " upp"  // if ratio is greater than 0.5, the result is "<ratio> upp"
        : 1 - c + " low") // otherwise, "<ratio> low"
        + "ercase"; // add "ercase" to the output string
}

3

Python 2, 114 110 bytes

i=input()
n=1.*sum('@'<c<'['for c in i)/sum(c.isalpha()for c in i)
print max(n,1-n),'ulpopw'[n<.5::2]+'ercase'

1
Puede guardar 2 bytes reemplazando ['upp','low'][n<.5]con 'ulpopw'[n<.5::2]y 3 más reemplazando [n,1-n][n<.5]con max(n,1-n).
PurkkaKoodari



2

PHP, 140 129 caracteres

Mi primera ronda de golf, no está mal para un lenguaje 'estándar', ¿eh? :-)

Original:

function f($s){$a=count_chars($s);for($i=65;$i<91;$i++){$u+=$a[$i];$l+=$a[$i+32];}return max($u,$l)/($u+$l).($u<$l?' low':' upp').'ercase';}

Acortado a 129 caracteres gracias a @manatwork:

function f($s){$a=count_chars($s);for(;$i<26;$u+=$a[$i+++65])$l+=$a[$i+97];return max($u,$l)/($u+$l).' '.($u<$l?low:upp).ercase;}

Con comentarios:

function uclcratio($s)
{
  // Get info about string, see http://php.net/manual/de/function.count-chars.php
  $array = count_chars($s);

  // Loop through A to Z
  for ($i = 65; $i < 91; $i++) // <91 rather than <=90 to save a byte
  {
    // Add up occurrences of uppercase letters (ASCII 65-90)
    $uppercount += $array[$i];
    // Same with lowercase (ASCII 97-122)
    $lowercount += $array[$i+32];
  }
  // Compose output
  // Ratio is max over sum
  return max($uppercount, $lowercount) / ($uppercount + $lowercount)
  // in favour of which, equality not possible per challenge definition
         . ($uppercount < $lowercount ? ' low' : ' upp') . 'ercase';
}

Dado el $u+=…, supongo que ya tiene error_reportingpor defecto, por lo que silencia las advertencias. A continuación, retire algunas citas: ' '.($u<$l?low:upp).ercase.
manatwork

Si solo tuviera que repetir una declaración por for, podría eliminar los corchetes a su alrededor. for($i=65;$i<91;$u+=$a[$i++])$l+=$a[$i+32];
manatwork

Con el precio de otra advertencia, puede ahorrar la forinicialización de la variable de control haciendo un bucle 0..26 en lugar de 65..91:for(;$i<26;$u+=$a[$i+++65])$l+=$a[$i+97];
manatwork

Wow, gracias @manatwork, ¡no sabía cuán tolerante es PHP! : D El segundo es muy inteligente. Implementé tus ideas, llevando el conteo a 140-4-5-2 = 129 :-)
Christallkeks

2

Rubí, 81 + 1 = 82

Con bandera -p,

$_=["#{r=$_.count(a='a-z').fdiv$_.count(a+'A-Z')} low","#{1-r} upp"].max+'ercase'

Es una suerte que para los números entre 0 y 1, la clasificación lexicográfica sea lo mismo que la clasificación numérica.


2

Lisp común, 132 bytes

(setq s(read-line)f(/(count-if'upper-case-p s)(count-if'alpha-char-p s)))(format t"~f ~aercase"(max f(- 1 f))(if(> f .5)"upp""low"))

Pruébalo en línea!


En la prueba de 0,52 está en mayúsculas en minúsculas no ...
RosLuP

1
@RosLuP, corregido, ¡muchas gracias!
Renzo

1

Gema, 125 caracteres

\A=@set{l;0}@set{u;0}
<J1>=@incr{l}
<K1>=@incr{u}
?=
\Z=0.@div{@cmpn{$l;$u;$u;;$l}00;@add{$l;$u}} @cmpn{$l;$u;upp;;low}ercase

Ejecución de muestra:

bash-4.3$ for input in 'PrOgRaMiNgPuZzLeS & CoDe GoLf' 'DowNGoAT RiGHtGoAt LeFTGoat UpGoAT' 'Foo BaR Baz'; do
>     gema '\A=@set{l;0}@set{u;0};<J1>=@incr{l};<K1>=@incr{u};?=;\Z=0.@div{@cmpn{$l;$u;$u;;$l}00;@add{$l;$u}} @cmpn{$l;$u;upp;;low}ercase' <<< "$input"
>     echo " <- $input"
> done
0.52 uppercase <- PrOgRaMiNgPuZzLeS & CoDe GoLf
0.58 uppercase <- DowNGoAT RiGHtGoAt LeFTGoat UpGoAT
0.55 lowercase <- Foo BaR Baz

-1 porque esolangs asusta a tus amigos. (jk, votado a favor)
ev3commander

1

En serio, 58 bytes

" upp"" low"k"ercase"@+╗,;;ú;û+∩@-@-;l@ú@-l/;1-k;i<@╜@ZEεj

Hex Dump:

22207570702222206c6f77226b2265726361736522402bbb2c3b3ba33b
962bef402d402d3b6c40a3402d6c2f3b312d6b3b693c40bd405a45ee6a

Solo funciona en el intérprete descargable ... el en línea todavía está roto.

Explicación:

" upp"" low"k"ercase"@+╗                                    Put [" lowercase"," uppercase"]
                                                            in reg0
                        ,;;ú;û+∩@-@-                        Read input, remove non-alpha
                                    ;l@                     Put its length below it
                                       ú@-                  Delete lowercase
                                          l                 Get its length
                                           /                Get the ratio of upper/total
                                            ;1-k            Make list [upp-ratio,low-ratio]
                                                ;i<         Push 1 if low-ratio is higher
                                                   @        Move list to top
                                                    ╜@Z     Zip it with list from reg0
                                                       E    Pick the one with higher ratio
                                                        εj  Convert list to string.

1

Pyth, 45 bytes

AeSK.e,s/LzbkrBG1s[cGshMKd?H"upp""low""ercase

Pruébalo en línea. Banco de pruebas.

Explicación

             rBG1               pair of alphabet, uppercase alphabet
    .e                          map k, b over enumerate of that:
      ,                           pair of
           b                          lowercase or uppercase alphabet
        /Lz                           counts of these characters in input
       s                              sum of that
                                    and
            k                         0 for lowercase, 1 for uppercase
   K                            save result in K
 eS                             sort the pairs & take the larger one
A                               save the number of letters in and the 0 or 1 in H

s[                              print the following on one line:
  cG                              larger number of letters divided by
    shMK                            sum of first items of all items of K
                                    (= the total number of letters)
        d                         space
         ?H"upp""low"             "upp" if H is 1 (for uppercase), otherwise "low"
                     "ercase      "ercase"

1

CoffeeScript, 104 caracteres

 (a)->(r=1.0*a.replace(/\W|[A-Z]/g,'').length/a.length)&&"#{(r>.5&&(r+' low')||(1-r+' upp'))+'ercase'}"

coffeescript inicialmente estaba tratando de pasar el valor de retorno previsto como un argumento para el valor "r", que falló y fue súper molesto porque r era un número, no una función. Lo solucioné colocando un &&entre las declaraciones para separarlas.


1

Pyth, 54 53

Un byte guardado gracias a @Maltysen

K0VzI}NG=hZ)I}NrG1=hK;ceS,ZK+ZK+?>ZK"low""upp""ercase

Pruébalo en línea

K0                  " Set K to 0
                    " (Implicit: Set Z to 0)

Vz                  " For all characters (V) in input (z):
  I}NG              " If the character (N) is in (}) the lowercase alphabet (G):
    =hZ             " Increment (=h) Z
  )                 " End statement
  I}NrG1            " If the character is in the uppercase alphabet (rG1):
    =hK             " Increment K
;                   " End all unclosed statements/loops

c                   " (Implicit print) The division of
  e                 " the last element of
    S,ZK           " the sorted (S) list of Z and K (this returns the max value)
+ZK                 " by the sum of Z and K

+                   " (Implicit print) The concatenation of
  ?>ZK"low""upp"    " "low" if Z > K, else "upp"
  "ercase"          " and the string "ercase".

,<any><any>es un comando de dos arity que es el mismo [<any><any>)que puede ahorrarle un byte
Maltysen

1

Ruby, 97 caracteres

->s{'%f %sercase'%[(l,u=[/[a-z]/,/[A-Z]/].map{|r|s.scan(r).size}).max.fdiv(l+u),l>u ?:low: :upp]}

Ejecución de muestra:

2.1.5 :001 > ['PrOgRaMiNgPuZzLeS & CoDe GoLf', 'DowNGoAT RiGHtGoAt LeFTGoat UpGoAT', 'Foo BaR Baz'].map{|s|->s{'%f %sercase'%[(l,u=[/[a-z]/,/[A-Z]/].map{|r|s.scan(r).size}).max.fdiv(l+u),l>u ?:low: :upp]}[s]}
 => ["0.520000 uppercase", "0.580645 uppercase", "0.555556 lowercase"] 

1

05AB1E , 28 bytes

ʒ.u}gság/Dò©_αð„Œ„›…#'ƒß«®èJ

Pruébalo en línea!


ʒ.u}g                        # filter all but uppercase letters, get length.
     ság/                    # Differential between uppercase and input length.
         Dò©                 # Round up store result in register w/o pop.
            _α               # Negated, absolute difference.
              ð              # Push space.
               „Œ„›…         # Push "upper lower"
                    #        # Split on space.
                     'ƒß«    # Concat "case" resulting in [uppercase,lowercase]
                         ®èJ # Bring it all together.

1

Java 8, 136 130 bytes

s->{float l=s.replaceAll("[^a-z]","").length();l/=l+s.replaceAll("[^A-Z]","").length();return(l<.5?1-l+" upp":l+" low")+"ercase";}

-6 bytes creando un puerto de respuesta @ProgramFOX 'C # .NET .

Pruébalo en línea.

Explicación:

s->{                  // Method with String as both parameter and return-type
  float l=s.replaceAll("[^a-z]","").length();
                      //  Amount of lowercase
  l/=l+s.replaceAll("[^A-Z]","").length();
                      //  Lowercase compared to total amount of letters
  return(l<.5?        //  If this is below 0.5:
          1-l+" upp"  //   Return `1-l`, and append " upp"
         :            //  Else:
          l+" low")   //   Return `l`, and append " low"
        +"ercase";}   //  And append "ercase"

1

REXX, 144 bytes

a=arg(1)
l=n(upper(a))
u=n(lower(a))
c.0='upp';c.1='low'
d=u<l
say 1/((u+l)/max(u,l)) c.d'ercase'
n:return length(space(translate(a,,arg(1)),0))



1

Kotlin , 138 bytes

Código

let{var u=0.0
var l=0.0
forEach{when{it.isUpperCase()->u++
it.isLowerCase()->l++}}
"${maxOf(u,l)/(u+l)} ${if(u>l)"upp" else "low"}ercase"}

Uso

fun String.y():String =let{var u=0.0
var l=0.0
forEach{when{it.isUpperCase()->u++
it.isLowerCase()->l++}}
"${maxOf(u,l)/(u+l)} ${if(u>l)"upp" else "low"}ercase"}

fun main(args: Array<String>) {
    println("PrOgRaMiNgPuZzLeS & CoDe GoLf".y())
    println("DowNGoAT RiGHtGoAt LeFTGoat UpGoAT".y())
    println("Foo BaR Baz".y())
}

1

Pyth, 40 39 bytes

Jml@dQrBG1+jdeS.T,cRsJJc2."kw񽙽""ercase

Pruébalo aquí

Explicación

Jml@dQrBG1+jdeS.T,cRsJJc2."kw񽙽""ercase
 m    rBG1                                For the lower and uppercase alphabet...
  l@dQ                                    ... count the occurrences in the input.
J                 cRsJJ                   Convert to frequencies.
               .T,     c2."kw񽙽"          Pair each with the appropriate case.
             eS                           Get the more frequent.
          +jd                    "ercase  Stick it all together.

1

PowerShell Core , 134 128 bytes

Filter F{$p=($_-creplace"[^A-Z]",'').Length/($_-replace"[^a-z]",'').Length;$l=1-$p;(.({"$p upp"},{"$l low"})[$p-lt$l])+"ercase"}

Pruébalo en línea!

¡Gracias, Veskah , por guardar seis bytes al convertir la función en un filtro!


1
Puede guardar dos bytes libres convirtiéndolo en un filtro en lugar de una función, es decir, el filtro F (código)
Veskah

¡Nunca supe que esto era una cosa! Gracias Veskah!
Jeff Freeman

1

Tcl , 166 bytes

proc C s {lmap c [split $s ""] {if [string is u $c] {incr u}
if [string is lo $c] {incr l}}
puts [expr $u>$l?"[expr $u./($u+$l)] upp":"[expr $l./($u+$l)] low"]ercase}

Pruébalo en línea!


1

APL (NARS), 58 caracteres, 116 bytes

{m←+/⍵∊⎕A⋄n←+/⍵∊⎕a⋄∊((n⌈m)÷m+n),{m>n:'upp'⋄'low'}'ercase'}

prueba:

  h←{m←+/⍵∊⎕A⋄n←+/⍵∊⎕a⋄∊((n⌈m)÷m+n),{m>n:'upp'⋄'low'}'ercase'}
  h "PrOgRaMiNgPuZzLeS & CoDe GoLf"
0.52 uppercase
  h "DowNGoAT RiGHtGoAt LeFTGoat UpGoAT"
0.5806451613 uppercase
  h "Foo BaR Baz"
0.5555555556 lowercase

1

C, 120 bytes

f(char*a){int m=0,k=0,c;for(;isalpha(c=*a++)?c&32?++k:++m:c;);printf("%f %sercase",(m>k?m:k)/(m+k+.0),m>k?"upp":"low");}

prueba y resultado:

main()
{char *p="PrOgRaMiNgPuZzLeS & CoDe GoLf", *q="DowNGoAT RiGHtGoAt LeFTGoat UpGoAT", *m="Foo BaR Baz";
 f(p);printf("\n");f(q);printf("\n");f(m);printf("\n");
}

resultados

0.520000 uppercase
0.580645 uppercase
0.555556 lowercase

Supone el conjunto de caracteres Ascii.



@ceilingcat puedes actualizar tu a esos 116 bytes ... Estos 120 bytes para mí si es suficiente ...
RosLuP
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.