Співвідношення великих літер до малих літер


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
Езоланги не лякають моїх друзів. Це означає, що мій код може бути дико багатослівним?
Олексій А.

@AlexA. багатослівний код вас лякає, тож ваш код також потребує гольфу.
Пуховик

16
О так, я забув про свої повторювані кошмари на Java.
Олексій А.

4
Чи буде введення лише одного випадку?
манатура

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 ваш перший натяк не здається корисним, другий - розумним, thx
edc65

1
Чи можемо ми побачити версію, що не перебуває у вогонь, з поясненням?
Кіос

@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

@Eth, схоже, \x80нічого не робив, і ÖÐстворив "справу" ... Можливо, деякі невидимки, які врізалися? Btw, надав власний мод, дякую за підказки
nicael

@ETH Добре, вдалося скористатись тим невидимим чар :)
nicael

На жаль, для того, щоб синтаксичний синтаксичний аналізатор працював, слід подвоїти косої риски вдвічі всередині рядків У цьому випадку "\w"просто відповідає всім ws і "\\w"відповідає всім A-Za-z0-9_. Тому я думаю, що вам потрібно буде зберегти "[a-z]".
ETHproductions

4

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

У 10 байтах було зроблено завдяки @ ovs, 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")

Це лямбда-функція, яка приймає рядок і повертає рядок. Щоб викликати його, призначте його змінній.

Безголівки:

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 вгору", "0,45 мінімум"): Спробуйте
Філ Х

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.
манатура

Якщо у вас буде лише одне твердження, яке потрібно повторити 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, я не знав, наскільки толерантний PHP! : D Другий дуже розумний. Я реалізував ваші ідеї, доводячи кількість до 140-4-5-2 = 129 :-)
Крісталкекс

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

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>)що може врятувати вас на байт
Мальтісен

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 (код)
Veskah

Я ніколи не знав, що це річ! Спасибі, Веска!
Джефф Фріман


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.