대문자와 소문자의 비율


28

이 도전에서 당신과 당신의 친구들은 어느 것이 더 나은지, 대문자인지 소문자인지에 대해 토론하고 있습니까? 알아 내기 위해이를 위해 프로그램을 작성하십시오.

esolang은 친구를 놀라게하고 자세한 코드는 두려운 것이기 때문에 코드는 가능한 짧아야합니다.


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
Esolangs는 내 친구들을 놀라게하지 않습니다. 그것은 내 코드가 극도로 장황하다는 것을 의미합니까?
Alex A.

@AlexA. 자세한 코드는 겁을주기 때문에 코드를 골프화해야합니다.
Downgoat

16
아 맞다, 나는 반복되는 Java 악몽에 대해 잊었다.
Alex A.

4
하나의 케이스에만 입력이 있습니까?
manatwork

1
"소수점 최소 2 자리까지 정확함"은 최소 2 개의 소수를 인쇄해야합니까, 아니면 2의 소수를 0으로 남겨 둘 수 있습니까?
hvd

답변:



7

자바 스크립트 (ES6) 87 바이트

편집 1 바이트 저장 들으 ETHProductions
편집 1 바이트 이상 저장 들으 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
)

을 사용하여 1 바이트를 절약 할 수 있다고 생각합니다 &&` ${t-l>l?1-l/t+'upp':l/t+'low'}ercase` .
ETHproductions

또한 효과 c=>l+=++t&&c>'Z'가 있다고 생각합니다 ...?
ETHproductions

@ETHproductions 첫 번째 힌트가 유용하지 않는 것, 두 번째는 영리, THX입니다
edc65은

1
설명이 포함 된 ungolfed 버전을 볼 수 있습니까?
Cyoce

@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

언급 된 변경 사항과 문자열 압축으로 58 A=Uf"[a-z]" l /Uf"[A-Za-z]" l)>½?A+" low":1-A+" upp" +`\x80ÖÐ을 얻습니다.를 사용하여 마지막 3 바이트의 원시 버전을 얻을 수 있습니다 Oc"ercase.
ETHproductions

@Eth \x80는 아무것도하지 않는 것처럼 보이며 ÖÐ"사례"를 만들었습니다. 어쩌면 일부 invisi-chars가 잘릴 수 있습니까? Btw, 팁 덕분에 내 자신의 모드를 제공
nicael

@ETH Ok, 그
invisi

불행히도 정규 표현식 파서가 작동하려면 문자열 내부에서 백 슬래시를 두 배로 늘려야합니다. 이 경우 "\w"단순히 모든 ws와 "\\w"일치하고 모두 와 일치합니다 A-Za-z0-9_. 그래서 당신은 유지해야한다고 생각합니다 "[a-z]".
ETHproductions

4

R , 133123118108106105104 바이트

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

문자열을 받아들이고 문자열을 반환하는 람다 함수입니다. 호출하려면 변수에 지정하십시오.

언 골프 드 :

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대신 다음을 사용하여 2 바이트를 절약 할 수 있습니다.case
edc65

@ edc65 감사합니다!
Alex A.

3

펄 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 진수를 바꾸어 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

파이썬 2, 114110 바이트

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

또 다른 경고가 발생하면 for65..91 대신 0..26을 반복 하여 제어 변수 초기화를 절약 할 수 있습니다 .for(;$i<26;$u+=$a[$i+++65])$l+=$a[$i+97];
manatwork

와우, @manatwork 감사합니다, 나는 PHP를 얼마나 견딜 수 있는지 몰랐습니다! : D 두 번째는 매우 영리합니다. 140-4-5-2 = 129 :-)로 카운트를 가져 오는 당신의 아이디어를 구현했습니다
Christallkeks

2

루비, 81 + 1 = 82

플래그와 -p,

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

0에서 1 사이의 숫자의 경우 사전 식 정렬은 숫자 정렬과 동일합니다.


2

공통 리스프, 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, 고마워요!
Renzo

1

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이 솔랑은 친구를 놀라게하기 때문에. (jk, upvoted)
ev3commander

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 덕분에 1 바이트 절약

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>[<any><any>)바이트를 절약 할 수 있는 것과 동일한 두 개의 arity 명령입니다
Maltysen

1

루비, 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

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

@ProgramFOX 'C # .NET 응답 포트를 만드는 -6 바이트 .

온라인으로 사용해보십시오.

설명:

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 바이트

암호

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 코어 , 134128 바이트

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

온라인으로 사용해보십시오!

함수를 필터로 변환하여 6 바이트를 절약 해 주셔서 감사합니다. Veskah


1
함수 대신 필터로 만들어 두 개의 여유 바이트를 절약 할 수 있습니다. 예 : 필터 F (코드)
Veskah

나는 이것이 일인 줄 몰랐다! 고마워, Veskah!
Jeff Freeman


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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.