大写字母与小写字母的比率


28

在这个挑战中,您和您的朋友正在争论哪种情况更好,大写还是小写?为了找出答案,您编写了一个程序来为您执行此操作。

由于esolang会吓your您的朋友,而冗长的代码会吓you您,因此您的代码将需要尽可能短。


例子

PrOgRaMiNgPuZzLeS & CoDe GoLf
0.52 uppercase

DowNGoAT RiGHtGoAt LeFTGoat UpGoAT
0.58 uppercase

Foo BaR Baz
0.56 lowercase

技术指标

输入将仅包含ASCII字符。所有非字母字符都应忽略。每个案例至少要有1个字符

输出应该是字母字符总数中出现频率最高的情况。它应该是一个精确到至少 2个小数位的小数。如果大写字母出现得更频繁,则输出应以uppercase或结束lowercase

永远不会有相同数量的大写和小写字符。


7
以雪邦人不吓我的朋友。这是否意味着我的代码可能过于冗长?
Alex A.

@AlexA。冗长的代码会吓到您,因此您的代码也将需要使用。
Downgoat

16
哦,对了,我忘记了我经常发生的Java噩梦。
Alex A.

4
是否只有一种情况可以输入?
manatwork 2015年

1
“精确到至少2个小数位”是否需要至少打印两个小数,还是可以省去第二个小数零?
hvd 2015年

Answers:


2

Pyth-40个字节

这是我第一次使用矢量化字符串格式,这非常酷。

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

测试套件


7

JavaScript(ES6)87字节

编辑保存的1个字节thx ETHProductions
编辑保存的1个字节以上thx l4me

匿名函数。好久不见,但我没有找到更多打高尔夫球的方法

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

少打高尔夫球

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
)

我相信您可以使用节省一个字节&&` ${t-l>l?1-l/t+'upp':l/t+'low'}ercase`
ETHproductions 2015年

另外,c=>l+=++t&&c>'Z'我想...行得通吗?
ETHproductions 2015年

@ETHproductions您的第一个提示似乎没有用,第二个提示很聪明,谢谢
edc65

1
我们可以看到带有说明的非高尔夫版本吗?
Cyoce 2015年

@Cyoce说明已添加-实际上很简单
edc65

4

CJam,47个 45字节

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

在线尝试。

高尔夫时间不长...

说明

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

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

(注意:SE在之前Ö去除了一个特殊的字符,因此请单击链接以获取正确的代码)


干得好!您的第一个正则表达式(包括美元符号)可以替换为"[a-z]",第二个正则表达式可以替换为"A-Za-z"0.5等于½。您也可以删除最后的引号。
ETHproductions 2015年

通过上述更改和字符串压缩,我得到58:A=Uf"[a-z]" l /Uf"[A-Za-z]" l)>½?A+" low":1-A+" upp" +`\x80ÖÐ您可以使用获得最后三个字节的原始版本Oc"ercase
ETHproductions 2015年

@Eth \x80似乎没有执行任何操作,并ÖÐ产生了“ case”……也许某些invisi-chars被截断了?顺便说一句,提供了我自己的mod,谢谢你的提示
nicael

@ETH好的,设法使用了invisi-char :)
nicael

不幸的是,反斜杠必须在字符串中加倍才能使正则表达式解析器正常工作。在这种情况下,"\w"只需匹配所有ws,然后"\\w"匹配所有A-Za-z0-9_。因此,我认为您需要保留"[a-z]"
ETHproductions 2015年

4

R133123118108106105104字节

@ovs减少了10个字节,@ Giuseppe减少了8个字节,@ ngm再次减少了10个字节。在这一点上,这实际上是一种协作,我提供字节,其他字节取走;)

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

在线尝试!


减少了1个字节。
JayCe

3

MATL,49 50字节

使用该语言的当前版本(4.1.1),该版本早于质询。

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

例子

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

说明

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

朱莉娅76 74字节

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

这是一个lambda函数,它接受一个字符串并返回一个字符串。要调用它,请将其分配给变量。

取消高尔夫:

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

由于edc65,节省了2个字节!


1
U可以肯定使用ercase而不是case
edc65

@ edc65好主意,谢谢!
Alex A.

3

Perl 6的 91个70 69 63   61字节

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

用法:

# 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
删除线代码块?这是新东西...
Bojidar Marinov

1
通过将三元数交换为max(“ 0.55 upp”,“ 0.45 low”)来丢失3个字符:试试看
Phil H,

3

C#,135个字节

要求:

using System.Linq;

实际功能:

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

附带说明:

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

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
您可以通过更换节省2个字节['upp','low'][n<.5]'ulpopw'[n<.5::2]更换,和3个[n,1-n][n<.5]max(n,1-n)
PurkkaKoodari



2

PHP,140 129个字符

我的第一轮高尔夫-对于“标准”语言来说还不错,是吗?:-)

原版的:

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

由于@manatwork,缩短到129个字符:

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

有评论:

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

给定$u+=…,我想您已经error_reporting默认设置了,因此可以静默警告。然后删除一些引号:' '.($u<$l?low:upp).ercase
manatwork

如果您只需在之前重复一条语句for,则可以删除其周围的花括号。for($i=65;$i<91;$u+=$a[$i++])$l+=$a[$i+32];
manatwork

再次发出警告,您可以for通过循环0..26而不是65..91来避免初始化控制变量:for(;$i<26;$u+=$a[$i+++65])$l+=$a[$i+97];
manatwork

哇,谢谢@manatwork,我不知道PHP有多宽容!:D第二个非常聪明。我实现了您的想法,使计数达到140-4-5-2 = 129 :-)
Christallkeks

2

Ruby,81 + 1 = 82

带有标志-p

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

幸运的是,对于介于0和1之间的数字,字典顺序排序与数字排序相同。


2

Common Lisp,132个字节

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

在线尝试!


在测试中0.52是大写而不是小写...
RosLuP

1
@RosLuP,已更正,非常感谢!
伦佐

1

Gema,125个字符

\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

样品运行:

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因为esolangs会吓your您的朋友。(jk,已投票)
ev3commander 2015年

1

严重的是58个字节

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

十六进制转储:

22207570702222206c6f77226b2265726361736522402bbb2c3b3ba33b
962bef402d402d3b6c40a3402d6c2f3b312d6b3b693c40bd405a45ee6a

它仅适用于可下载的解释器...在线的解释器仍然损坏。

说明:

" 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个字节

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

在线尝试。 测试套件。

说明

             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个字符

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

coffeescript最初尝试将预期的返回值作为参数传递给“ r”值,该参数失败并且非常烦人,因为r是一个数字,而不是一个函数。我通过&&在语句之间放置一个分隔符来解决它。


1

佩斯54 53

@Maltysen节省了一个字节

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

在线尝试

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>是两个arity命令,与[<any><any>)可以为您节省一个字节的命令相同
Maltysen

1

Ruby,97个字符

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

样品运行:

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个字节

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

在线尝试!


ʒ.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,136130字节

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个字节创建@ProgramFOX的C#.NET答复的端口。

在线尝试。

说明:

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个字节

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

138位Kotlin

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

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

在这里尝试

说明

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 Core134128字节

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

在线尝试!

感谢Veskah,通过将函数转换为过滤器节省了六个字节!


1
您可以通过将其设置为过滤器而不是函数来保存两个空闲字节,即过滤器F(code)
Veskah's

我从来不知道这是一件事情!谢谢,维斯卡!
杰夫·弗里曼

1

Tcl,166字节

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}

在线尝试!


1

APL(NARS),58个字符,116个字节

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

测试:

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

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

测试和结果:

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

结果

0.520000 uppercase
0.580645 uppercase
0.555556 lowercase

它假定为Ascii字符集。



@ceilingcat,您可以将您的字节更新为116个字节……如果足够的话,这120个字节对我来说就可以了
RosLuP
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.