Rasio Huruf Huruf Besar dan Huruf Kecil


28

Dalam tantangan ini, Anda dan teman Anda memperdebatkan kasus mana yang lebih baik, besar atau kecil? Untuk mengetahuinya, Anda menulis sebuah program untuk melakukan ini untuk Anda.

Karena esolang menakut-nakuti teman Anda, dan kode verbal membuat Anda takut, kode Anda harus sesingkat mungkin.


Contohnya

PrOgRaMiNgPuZzLeS & CoDe GoLf
0.52 uppercase

DowNGoAT RiGHtGoAt LeFTGoat UpGoAT
0.58 uppercase

Foo BaR Baz
0.56 lowercase

Spesifikasi

Input hanya akan terdiri dari karakter ASCII. Semua karakter non-alfabet harus diabaikan. Akan ada setidaknya 1 karakter dari setiap kasus

Outputnya harus berupa jumlah case yang paling sering muncul di atas jumlah total karakter alfabet. Itu harus menjadi desimal akurat untuk setidaknya 2 tempat desimal. Jika huruf besar muncul lebih sering, output harus diakhiri dengan uppercase, atau lowercase.

Tidak akan pernah ada jumlah huruf besar dan kecil yang sama.


7
Orang Esolang tidak menakuti teman-temanku. Apakah itu berarti kode saya bisa sangat liar?
Alex A.

@AlexA. kode verbose membuat Anda takut, jadi kode Anda juga harus golf.
Downgoat

16
Oh benar, saya sudah lupa tentang mimpi buruk Jawa berulang saya.
Alex A.

4
Apakah akan ada input dengan hanya satu kasing?
manatwork

1
Apakah "akurat untuk setidaknya 2 desimal" memerlukan setidaknya dua desimal untuk dicetak, atau bisakah desimal kedua nol dihilangkan?
hvd

Jawaban:


2

Pyth - 40 byte

Ini adalah pertama kalinya saya pernah menggunakan format string vektor yang sangat keren.

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

Test Suite .


7

JavaScript (ES6) 87 byte

Edit 1 byte disimpan thx ETHProduk
Edit 1 byte lebih disimpan thx l4me

Fungsi anonim. Lama, tapi saya tidak menemukan cara untuk bermain golf ini lagi

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

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

Saya yakin Anda bisa menghemat satu byte dengan menggunakan &&` ${t-l>l?1-l/t+'upp':l/t+'low'}ercase` .
ETHproduksi

Juga, c=>l+=++t&&c>'Z'apakah akan berhasil, saya pikir ...?
ETHproduksi

@ETHproduksi petunjuk pertama Anda sepertinya tidak berguna, yang kedua adalah pintar, thx
edc65

1
Bisakah kita melihat versi yang tidak diserang dengan penjelasan?
Cyoce

@Cyoce penjelasan ditambahkan - itu sebenarnya sederhana
edc65

4

CJam, 47 45 byte

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

Cobalah online.

Tidak bermain golf terlalu lama ...

Penjelasan

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 byte

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

(Catatan: SE menghapus char khusus, sebelumnya Ö, jadi silakan klik tautan untuk mendapatkan kode yang tepat)


Kerja bagus! Regex pertama Anda (termasuk tanda-tanda dolar) dapat diganti dengan "[a-z]", dan yang kedua dengan "A-Za-z". 0.5sama dengan ½. Anda juga dapat menghapus tanda kutip akhir.
Produk ETH

Dengan perubahan yang disebutkan dan kompresi string, saya mendapatkan 58: A=Uf"[a-z]" l /Uf"[A-Za-z]" l)>½?A+" low":1-A+" upp" +`\x80ÖÐAnda dapat memperoleh versi mentah dari tiga byte terakhir dengan Oc"ercase.
Produk ETH

@ Eth \x80tampaknya tidak melakukan apa-apa, dan ÖÐmenghasilkan "case" ... Mungkin beberapa invisi-chars yang terpotong? Btw, berikan mod saya sendiri, terima kasih atas tipsnya
nicael

@ EET Ok, berhasil menggunakan invisi-char :)
nicael

Sayangnya, backslash harus digandakan di dalam string agar parser regex berfungsi. Dalam hal ini, "\w"cukup cocokkan semua w, dan "\\w"cocokkan semua A-Za-z0-9_. Jadi saya pikir Anda harus menjaga "[a-z]".
ETHproduksi

4

R , 133 123 118 108 106 106 104 byte

Golf turun 10 byte berkat @ ovs, 8 terima kasih kepada @Giuseppe, dan 10 lagi berkat @ngm. Pada titik ini, ini benar-benar upaya kolaborasi di mana saya memberikan byte dan yang lain melepasnya;)

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

Cobalah online!


mencukur 1 byte lagi.
JayCe

3

MATL , 49 50 byte

Menggunakan versi bahasa saat ini (4.1.1) , yang lebih awal dari tantangan.

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

Contohnya

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

Penjelasan

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 byte

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

Ini adalah fungsi lambda yang menerima string dan mengembalikan string. Untuk menyebutnya, tetapkan ke variabel.

Tidak Disatukan:

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

Disimpan 2 byte berkat edc65!


1
Anda pasti dapat menyimpan 2 byte menggunakan ercasebukannyacase
edc65

@ edc65 Ide bagus, terima kasih!
Alex A.

3

Perl 6 ,  91 70 69 63   61 byte

{($/=($/=@=.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

Pemakaian:

# 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
Blok kode pemogokan? Itu sesuatu yang baru ...
Bojidar Marinov

1
Kurangi 3 karakter dengan menukar terner untuk maks ("0,55 upp", "0,45 rendah"): Cobalah
Phil H

3

C #, 135 byte

Membutuhkan:

using System.Linq;

Fungsi yang sebenarnya:

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

Dengan penjelasan:

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 byte

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
Anda dapat menyimpan 2 byte dengan mengganti ['upp','low'][n<.5]dengan 'ulpopw'[n<.5::2], dan 3 lainnya dengan mengganti [n,1-n][n<.5]dengan max(n,1-n).
PurkkaKoodari



2

PHP, 140 129 karakter

Putaran golf pertama saya - tidak terlalu buruk untuk bahasa 'standar', eh? :-)

Asli:

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

Dipendekkan menjadi 129 karakter berkat @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;}

Dengan komentar:

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

Mengingat $u+=…, saya kira Anda sudah memiliki error_reportingdefault, jadi membungkam peringatan. Kemudian hapus beberapa kutipan: ' '.($u<$l?low:upp).ercase.
manatwork

Jika Anda hanya memiliki satu pernyataan untuk diulangi oleh for, Anda bisa menghapus kawat gigi di sekitarnya. for($i=65;$i<91;$u+=$a[$i++])$l+=$a[$i+32];
manatwork

Dengan harga peringatan lain, Anda dapat menyisihkan forinisialisasi variabel kontrol dengan memutar 0..26 alih-alih 65..91:for(;$i<26;$u+=$a[$i+++65])$l+=$a[$i+97];
manatwork

Wow, terima kasih @manatwork, saya tidak tahu seberapa toleran PHP itu! : D Yang kedua sangat cerdas. Saya menerapkan ide-ide Anda, membawa hitungan ke 140-4-5-2 = 129 :-)
Christallkeks

2

Ruby, 81 + 1 = 82

Dengan bendera -p,

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

Beruntung bahwa untuk angka antara 0 dan 1, pengurutan leksikografis sama dengan pengurutan numerik.


2

Gangguan Umum, 132 byte

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

Cobalah online!


Dalam tes 0,52 adalah huruf besar bukan huruf kecil ...
RosLuP

1
@RosLuP, terkoreksi, terima kasih banyak!
Renzo

1

Gema, 125 karakter

\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

Contoh dijalankan:

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 karena esolang membuat teman Anda takut. (jk, upvoted)
ev3commander

1

Serius, 58 byte

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

Hex Dump:

22207570702222206c6f77226b2265726361736522402bbb2c3b3ba33b
962bef402d402d3b6c40a3402d6c2f3b312d6b3b693c40bd405a45ee6a

Ini hanya berfungsi pada penerjemah yang dapat diunduh ... yang online masih rusak.

Penjelasan:

" 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 byte

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

Cobalah online. Suite uji.

Penjelasan

             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 karakter

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

coffeescript awalnya mencoba meneruskan nilai pengembalian yang dimaksudkan sebagai argumen ke nilai "r", yang gagal dan sangat menjengkelkan karena r adalah angka, bukan fungsi. Saya mengatasinya dengan menempatkan sebuah di &&antara pernyataan untuk memisahkan mereka.


1

Pyth, 54 53

Satu byte disimpan berkat @Maltysen

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

Cobalah online

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>adalah perintah dua arity yang sama seperti [<any><any>)yang dapat menyelamatkan Anda byte
Maltysen

1

Ruby, 97 karakter

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

Contoh dijalankan:

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 byte

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

Cobalah online!


ʒ.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 byte

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 byte membuat port jawaban @ProgramFOX 'C # .NET .

Cobalah online.

Penjelasan:

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 byte

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 byte

Kode

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

Pemakaian

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 byte

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

Coba di sini

Penjelasan

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 byte

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

Cobalah online!

Terima kasih, Veskah , untuk menghemat enam byte dengan mengubah fungsi menjadi filter!


1
Anda dapat menyimpan dua byte gratis dengan menjadikannya filter alih-alih fungsi, yaitu filter F (kode)
Veskah

Saya tidak pernah tahu ini hal! Terima kasih, Veskah!
Jeff Freeman

1

Tcl , 166 byte

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}

Cobalah online!


1

APL (NARS), 58 char, 116 byte

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

uji:

  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 byte

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

tes dan hasil:

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

hasil

0.520000 uppercase
0.580645 uppercase
0.555556 lowercase

Itu kira set karakter Ascii.



@ceilingcat Anda dapat memperbarui Anda ke 116 byte ... 120 byte ini bagi saya jika cukup ...
RosLuP
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.