Соотношение прописных и строчных букв


28

В этой задаче вы и ваши друзья обсуждаете, какой регистр лучше, прописными или строчными? Чтобы это выяснить, вы пишете программу, которая сделает это за вас.

Поскольку esolangs пугают ваших друзей, а подробный код пугает вас, ваш код должен быть максимально коротким.


Примеры

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 не пугают моих друзей. Значит ли это, что мой код может быть очень многословным?
Алекс А.

@AlexA. подробный код пугает вас, поэтому ваш код также должен быть в гольфе.
Downgoat

16
Ах да, я забыл о своих повторяющихся ночных кошмарах на Java.
Алекс А.

4
Будет ли вход только с одним случаем?
manatwork

1
Требуется ли для печати «с точностью не менее 2 десятичных разрядов» как минимум два десятичных знака или можно оставить второй десятичный знак от нуля?
HVd

Ответы:


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

Кроме того, c=>l+=++t&&c>'Z'будет работать, я думаю ...?
ETHproductions

@ETHproductions Ваша первая подсказка не кажется полезной, вторая - умной,
спасибо

1
Можем ли мы увидеть неопрятную версию с объяснением?
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ÖÐВы можете получить необработанную версию последних трех байтов с помощью Oc"ercase.
ETHproductions

@ Похоже, \x80что Эт ничего не делал, и ÖÐпроизвел "случай" ... Может быть, некоторые инвизи-чары, которые были усечены? Кстати, предоставил мой собственный мод, спасибо за советы
Nicael

@ETH Хорошо, удалось использовать этот invisi-char :)
nicael

К сожалению, обратные слеши должны быть удвоены внутри строк, чтобы синтаксический анализатор работал. В этом случае "\w"просто соответствует всем ws и "\\w"соответствует всем A-Za-z0-9_. Поэтому я думаю, вам нужно сохранить "[a-z]".
ETHproductions

4

R , 133 123 118 108 106 105 104 байт

Благодаря байту @ ovs уложилось в 10 байт, 8 - благодаря @Giuseppe и 10 - благодаря @ngm. На данный момент это действительно совместная работа, где я предоставляю байты, а другие снимают их;)

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

Это лямбда-функция, которая принимает строку и возвращает строку. Чтобы вызвать его, присвойте его переменной.

Ungolfed:

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

Сохранено 2 байта благодаря edc65!


1
Вы, конечно, можете сохранить 2 байта, используя ercaseвместоcase
edc65

@ edc65 Отличная идея, спасибо!
Алекс А.

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
Зачеркнутые блоки кода? Это что-то новое ...
Божидар Маринов

1
Потерять 3 символа, поменяв троицы на макс («0.55 upp», «0.45 low»): попробуйте
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';}

Сокращено до 129 символов благодаря @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;}

С комментариями:

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];
Манатворк

С ценой другого предупреждения вы можете сэкономить 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

Рубин, 81 + 1 = 82

С флагом -p,

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

К счастью, для чисел от 0 до 1 лексикографическая сортировка аналогична числовой сортировке.



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, проголосовал)
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

Pyth, 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>является командой из двух арностей, которая аналогична той, [<any><any>)которая может спасти вас от байта
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

Java 8, 136 130 байт

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 байт

Код

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 Core , 134 128 байт

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

Попробуйте онлайн!

Спасибо, Веска , за сохранение шести байтов путем преобразования функции в фильтр!


1
Вы можете сохранить два свободных байта, сделав его фильтром вместо функции, то есть фильтром F (код)
Веска

Я никогда не знал, что это вещь! Спасибо, Веска!
Джефф Фриман


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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.