Буквено-цифровий баланс


15

Напишіть програму, яка отримує рядок як свій вхід, і підраховує кількість буквено-цифрових та не буквено-цифрових символів у ній. Він повинен відображати результат таким чином:

вхід: http://stackexchange.com
вихід:20 + 4 = 24

Суть полягає в тому, що ваш вихідний код повинен мати таку ж кількість буквено-цифрових символів, як і не буквено-цифрові. Коментарі заборонені, пробіли проігноровані. (Мова під назвою Whitespace може змагатися за голоси, але не буде вибрана як переможець)

Символи в коді повинні мати хоча б якесь незначне обґрунтування, вони не повинні бути зовсім зайвими. Наприклад, дозволені більш тривалі імена змінних, i = (j*3)+4;а i = j*3+4;не дозволені. Однак i = i + 1;;;;;;це не так.

Крім цього, застосовуються стандартні правила коду-гольфу.


Якщо я визначу новий, попередньо оброблений варіант Ook, де є ключові слова O. , O?і O!потім будь-яка програма , яку я запис відповідає обмеженню класу характеру ... Звичайно , це, ймовірно, втратить від довжини бізнесу.
dmckee --- колишнє кошеня модератора

2
все це буде ascii?
Джордон Біондо

@JordonBiondo: Я думав про все, що ви хочете, від повного 8-бітного ANSI до unicode, але якщо ваш код підтримує лише 7-бітний ASCII, я також прийму його.
vsz

3
Чи пробіл всередині вихідного рядка зараховується до не алфавітно-цифрових знаків? Або проігноровано з усіма іншими (не рядковими-буквальними) пробілами?
Kninnug

1
@dmckee: Якщо ви збираєтеся визначити свою власну мову, просто визначте варіант обраної мови, коли непусті програми працюють так само, як у базовій мові, але порожня програма попередньо обробляється в код, який робить саме те, що питання задає.
user2357112 підтримує Monica

Відповіді:


8

Perl, 32 + 32 = 64

Рядок очікується в STDIN. Вихід записується в STDOUT. Білий простір ігнорується. Моя інтерпретація завдання полягає в тому, що програма повинна мати можливість працювати на собі, щоб отримати оцінку.

$/ = $,;
$_ = <>;
s x\sxxg;
$\ = length;
print s x[0-9a-z]xxgi,
      ' + ',
      s x.xxg,
      ' = '

Безголовка з коментарями

$/ = $,; # The input separator becomes undefined, because the default for $, is "undef"
$_ = <>; # now $_ takes the whole file (STDIN) instead of the first line
s x\sxxg; # $_ =~ s/\s//g;
          # white space is removed from $_
$\ = length; # The number of the other characters are put into $\,
             # which is automatically printed the end of "print".
print s x[0-9a-z]xxgi, # s/[0-9a-z]//gi
                       # Remove alphanumeric characters and return their count
      ' + ',
      s x.xxg, # s/.//g
               # Remove the remaining special characters and return their count.
               # "." does not catch new lines, but we have already
               # removed white spaces including new lines.
      ' = '

Я знайшов кілька варіацій з однаковим числом байтів, наприклад:

$/ = $x;
$_ = <>, s x\sxxg;
$\ = split $x;
print s x[\da-z]xxgi,
      " + ",
      s x.xxg,
      ' = '

Приклади

  • Приклад із запитання:

    echo 'http://stackexchange.com' | perl a.pl
    20 + 4 = 24
  • Запуск на себе ( a.pl):

    cat a.pl | perl a.pl
    32 + 32 = 64

    Розмір файлу - 104 байти, тому 40 байт ігнорується як пробіл.

Перл, 29 + 29 = 58

$_=<>;s x\sxxg;$\=length;print s x[0-9a-z]xxgi,' + ',s/.//g,' = '

Рядок очікується на STDIN і обмежений першим рядком. Результат друкується в STDOUT. Білий простір ігнорується.

Безумовно

$_ = <>;
s x\sxxg; # same as s/\s//gx; removes white space;
$\ = length($_); # sum is automatically appended at the end of print
print sx[0-9a-z]xxgi, # same as s/[0-9a-z]//gi;
                      # the number of alphanumeric characters
      ' + ',
      s/.//g, # the number of the remaining special characters
      ' = '

Приклади

Файл a.plмістить сценарій Perl.

  • Приклад із запитання:

    echo 'http://stackexchange.com' | perl a.pl
    20 + 4 = 24
  • Біг на себе:

    cat a.pl | perl a.pl
    29 + 29 = 58

    Розмір файлу a.plстановить 65 байт, таким чином, 7 байт ігноруються як пробіл.


Здається, ви припускаєте, що вхід знаходиться лише в одному рядку ... Я нічого не бачив про це в специфікації? Також, яке виправдання для прапора / x у першій заміні?
скибрянський

@skibrianski: (a) Питання не надто чітке щодо специфікації "string". Тепер я додав варіант, який може читати цілі файли. (b) Крім того, мені незрозуміло, як слід обробляти білий простір за сценарієм. Моя інтерпретація полягає в тому, що білий простір ігнорується як у завданні, так і в партитурі. (c) Прапор / x дозволяє пробілу в шаблоні збільшувати читабельність. Оновлена ​​відповідь використовує її.
Хайко Обердік

Re a), автор нічого не говорить про те, що буде в рядку, тому я думаю, що нерозумно робити припущення, що для мене означає, що повинні бути дозволені нові рядки. Re б) погодився, не ясно. Re c) Правильно, але у вашій відповіді пробіл не додає читабельності моєму оку, він просто додає буквено-цифровий символ ... Можливо, я занадто жорсткий з цього приводу, але мені показує, що ви використовуєте лише / x в одному з ваших регексів, мабуть, додати, що останній додатковий буквено-цифровий, щоб підрахунки підрівнялися =) Ще мені подобається ваша відповідь. Я приготував щось подібне.
skibrianski

ха-ха, тепер у нас по суті ідентичний код =) гарне шоу =)
skibrianski

@skibrianski: :-) Дякую, ви даєте мені підставу розмістити один із інших варіантів із трохи більшими відмінностями. Однак кількість байтів залишається.
Хайко Обердьєк

6

C - 96 (48 + 48) символів

Це дещо читабельно. Однак є можливість для вдосконалення.

i,j;main(_){while((_=getchar())>=0)isspace(_)||(isalnum(_)?i++:j++);printf("%i + %i = %i",i,j
,i+j);}

5

Bash + coreutils, 72 (36 + 36) непробільних символів

a=`tr -dc [:alnum:]<<<$1|wc -c`
n=`tr -dt [:space:]<<<$1|wc -c`
echo $a + $[n-a] = $n

Вихід:

$ ./alnumbalance.sh http://stackexchange.com 
20 + 4 = 24
$ ./alnumbalance.sh "$ (кішка alnumbalance.sh)"
36 + 36 = 72
$ 

Попередня відповідь:

Pure Bash, 92 (46 + 46) непробільних символів

nosp=${1//[[:space:]]}
noaln=${nosp//[[:alnum:]]}
echo $[${#nosp}-${#noaln}] + ${#noaln} = ${#nosp}

Вихід:

$ ./alnumbalance.sh http://stackexchange.com 
20 + 4 = 24
$ ./alnumbalance.sh "$ (кішка alnumbalance.sh)"
46 + 46 = 92
$ 

Woohoo - він навіть перемагає гольфскрипт ! ;-)
Digital Trauma

А як щодо контрольних символів? [: alnum:] не є зворотною стороною [: punct:]. Спробуйте, наприклад, head -c256 / dev / urandom | tr -d [: alnum:] [: punct:]
skibrianski

@skibrianski хороший момент. Я відредагував відповідь, щоб врахувати це.
Цифрова травма

3

PowerShell (43 + 43 = 86)

Гольф

function alf($i){$a=0;$n=0;[char[]]$i|%{if($_-match"[a-zA-Z0-9]"){$a++}else{$n++}}; write-host "$a+$n=$($a+$n)"}

Без гольфу

function alf($i){
    $a=0;$n=0;  
    [char[]] $i | %{ if ($_ -match "[a-zA-Z0-9]") { $a++ } else { $n++ } };
    write-host "$a+$n=$($a + $n)"
}

Тест

PS > alf "http://stackexchange.com"
20+4=24

Тестування з самим кодом для проходження критеріїв

PS > alf "function alf($i){$a=0;$n=0;[char[]]$i|%{if($_-match`"[a-zA-Z0-9]`"){$a++}else{$n++}}; write-host `"$a+$n=$($a+$n)`"}"
43+43=86

" уникнуто символом `, який не є частиною рядка.



2

Рубін 38 + 38 = 76

Ця програма рахує зворотний новий рядок у введенні.

puts"#{a=gets.scan(/[a-z0-9]/i).length}+#{b=$_.scan(/\W|_/).length}=#{a+b}"

Підрахунок символів проводиться самою програмою: $ ruby alphabalance.rb alphabalance.rb:)


2

Powershell, 70 байт (= 35 + 35)

param($s)"$(($l=$s.Length)-($n=($s|sls '\W' -a).Matches.Count))+$n=$l"

Тестовий сценарій:

$f = {
param($s)"$(($l=$s.Length)-($n=($s|sls '\W' -a).Matches.Count))+$n=$l"
}

&$f "http://stackexchange.com"
&$f $f.toString().Trim()

Вихід:

20+4=24
35+35=70

Powershell, 70 байт (= 35 + 35), альтернатива

"$(($l="$args"|% Length)-($n=($args|sls '\W'-a).Matches.Count))+$n=$l"

2

Пітон 2 (60 + 60 = 120)

Важкий, напевно, є можливість для вдосконалення. Як і факт, саме функцію можна використовувати для оцінки власного буквено-цифрового балансу.

def f(s):
 i=j=0
 for c in s:
  t=ord(c)
  if (t!=2**5): 
   i+=1  
  if (48<=t<=57 or 65<=t<=90 or 97<=t<=122):
   j+=1 
 print `j`,'+',`i-j`,'=',i      

Тест:

>>> f("http://stackexchange.com")
20 + 4 = 24

Яка версія Python це?
Гігафлоп

@Gigaflop Я це відредагував. Заява про друк є лише Python 2, як і синтаксис backtick для repr.
mbomb007

1

C ++, 146 (73 + 73) 178 (89 + 89) символи без пробілів #

Оригінал включений <algorithm>без поважних причин. На жаль

//create a test string
#include<string>
std::string a = "\?\?=include <cstdio>\
int x,y;\
int main()\?\?<\
    for(char c : a)\
            !isspace(c) ? (isalnum(c) ? y++ : x++) : 0;\
    printf(\"%d\?\?/t%c\?\?/t%d\?\?/t%c\?\?/t%d\?\?/n\",y,'+',x,'=',(x+y));\
\?\?>";

//Code itself starts here
??=include <cstdio>
int x,y;
int main()??<
    for(char c : a)
        !isspace(c) ? (isalnum(c) ? y++ : x++) : 0;
    printf("%d??/t%c??/t%d??/t%c??/t%d??/n",y,'+',x,'=',(x+y));
??>

Я рахую лише символи в рядках після //Code itself starts here. Зокрема, це означає не рахувати #include <string>. Я також вважаю триграфи як три символи кожен, що, мабуть, є дискусійним. Зауважте, що при тестуванні програми на власному вихідному коді необхідна певна обережність, щоб не допустити заміни триграфа в рядковому літералі.

Тут є деякі своєрідні дизайнерські рішення - у більшості виробничих кодів ви не зустрінете триграфі й циклі, що базуються на діапазоні, в одній і тій же функції - але я думаю, що все це в межах "виправданого".


1

пітон 52 +52 = 104

Цікавий виклик, тому що python уникає не буквено-цифрових символів.

def f(_):
    _=_.replace(" ","");l=len(_);a=sum([c.isalnum() for c in _][:l]);print("{0} + {1} = {2}".format(a,l-a,l))

Невелике виправдання для використання фрагмента: він прискорює його (можливо?)


Спробуйте використовувати Python 2, оскільки printне потрібні дужки та '%d + %d = %d' % (a,l-a,l)метод. Це повинно врятувати деяких персонажів.
mbomb007

1

Юлія, 64 роки

f(s)=(b=endof(s);a=sum([isalnum(c) for c in s]);"$(a) + $(b-a) = $(b)";)

Усі єдині непотрібні буквено-цифрові символи - останні ;та деякі з ()рядкових форматів. Це вийшло майже ідеально врівноваженим, і як потужність 2 без особливих хитрощів.

julia> f("http://stackexchange.com")
"20 + 4 = 24"
julia> nowhite(s)=join(split("s"," "))
julia> f(nowhite("f(s)=(b=endof(s);a=sum([isalnum(c) for c in s]);\"\$(a)+\$(b-a)=\$(b)\";)"))
"32 + 32 = 64"

1

perl, 64 символи без пробілів:

$/=$,;
$_=<>;
s 0\s00g;
$\=length;
print s 1[a-z0-9]11ig .
      " + " .
      s 2.22g .
      " = "

Трохи уточнено через perl -MO = Deparse та деякі коментарі:

$/ = $,;               # input record separator = a variable defaulting to undef
$_ = <ARGV>;           # slurp stdin
s/\s//g;               # strip whitespace
$\ = length $_;        # output record separator = total length of string sans whitespace
print s/[a-z0-9]//gi . ' + ' . s/.//g . ' = '; # count alphanumerics, then everything else

ORS, $ \ додається автоматично до кожного дзвінка для друку, ставлячи підсумковий підрахунок у кінці.


У моєму першому проході було 66 символів. Дякую Heiko Oberdiek за те, що він показав, що ви можете зняти $ / з меншою кількістю символів, встановивши його на $, =)
skibrianski

1

Пітон 2, 50 + 50 = 100

import re
def f(i):
    w = re.sub('\s', '', i)
    s = re.subn('[\W_]', '', w)
    a = len(s[0])
    print '%d + %d = %d' % (a, s[1], a+s[1])

Запустіть його тут: http://repl.it/8CH


0

Ребол (64 + 64 = 128)

f: func [x] [
    c: :charset
    a: c [#"a" - #"z"]
    s: c [#" " #"^/" #"^-"]
    n: complement union a s
    a+: n+: 0
    parse x [
        some [
            a (++ a+) |
            n (++ n+) |
            s
        ]
    ]
    print [a+ "+" n+ "=" a+ + n+]
]

Приклад використання (в консолі Rebol):

>> f "http://stackexchange.com"
20 + 4 = 24

NB. Програма ігнорує пробіли, вкладки та нові рядки з рахунків.


0

J - 46 + 46 = 92

Підраховує пробіли, тому ви не можете самостійно перевірити без змін. Здійснює введення на stdin. У вас поганий рот, слід промити його з милом.

;":&.>(+/;' + ';(#-+/);' = ';#)(e.~1!:1@1:)(,toupper)'golfscriptSUCKSabdehjkmnquvwxyz',,":"0 i.10

Використання:

   ;":&.>(+/;' + ';(#-+/);' = ';#)(e.~1!:1@1:)(,toupper)'golfscriptSUCKSabdehjkmnquvwxyz',,":"0 i.10
http://stackexchange.com
20 + 4 = 24

   NB. modification for self-test:    vvvvvv - remove spaces, the only whitespace
   ;":&.>(+/;' + ';(#-+/);' = ';#)(e.~' '-.~1!:1@1:)(,toupper)'golfscriptSUCKSabdehjkmnquvwxyz',,":"0 i.10
;":&.>(+/;' + ';(#-+/);' = ';#)(e.~1!:1@1:)(,toupper)'golfscriptSUCKSabdehjkmnquvwxyz',,":"0 i.10
46 + 46 = 92

0

Javascript - 76 (38 + 38)

_ = prompt()
o = _.match(/[a-z0-9]/gi).length
$ = _.length - o
alert(o + " + " + $ + " = " + (o + $))

Приклад введення: http://stackexchange.com
вихід:20 + 4 = 24

Біг на себе:

var a  = '_ = prompt()o = _.match(/[a-z0-9]/gi).length$ = _.length - oalert(o + " + " + $ + " = " + (o + $))'

var letters = a.match(/[a-z0-9]/g).length; 
var nons = a.match(/[^a-z0-9 ]/g).length; // excludes whitespace from count

console.log(nons + " = " + letters); // 38 = 38 :)

PS Для тих, хто займається (o + $)підтримкою буквено-цифрового балансу, це не так. Тому що після побачення o + " + "JS вирішив +би бути всім конкатенаторами рядків, а не числами. Таким чином, круглі дужки необхідні, або 20 + 4стали б 204замість 24: D

Щасливе кодування!


0

Clojure: (31 + 31 = 62) символи, що не містять пробілів

(def ff #(let [c count y (c %) x (c (re-seq #"\w" %))] (str x " + " (- y x) " = " y)))

Вихід:

alphabalance.core=> (ff "http://stackexchange.com")
"20 + 4 = 24"

0

CJam, 27 + 27 = 54

CJam на пару місяців новіший, ніж цей виклик, тому ця відповідь не відповідає зеленій галочці. Це була весела вправа все-таки, хоча!

ea0=eu{A,s'[,65>+#)g}%_:+1@f-:+ea0=,]"DODDaD"36f-3/]zo

Він приймає рядок введення як аргумент командного рядка, тому він не працюватиме в онлайн-інтерпретаторі, але ви можете протестувати його за допомогою інтерпретатора Java .

Пояснення

"Distinguish alphanumeric characters:";
ea0=eu{A,s'[,65>+#)g}%
ea0=                   "Get the first command-line argument.";
    eu                 "Convert it to upper case.";
      {             }% "Map this block onto each character.";
       A,s             "Get the string '0123456789'.";
          '[,          "Get a string with all characters from the null byte to Z.";
             65>       "Remove the first 65 characters, to leave A to Z.";
                +      "Add to digit.";
                 #     "Find character in that string. Returns -1 if not alphanumeric.":
                  )g   "Increment and get signum. Yields 1 for alphanumeric characters,
                        0 otherwise.";

"Now we've got an array of 0s and 1s. Let's do the counting:";
_:+1@f-:+ea0=,]
_               "Duplicate array.";
 :+             "Get the sum. This is the number of alphanumeric characters.";
   1@           "Push a 1 and pull up the other copy of the array.";
     f-         "Subtract each element from 1, this swaps 0s and 1s.";
       :+       "Get the sum. This is the number of symbol characters.";
         ea0=   "Get the first command-line argument again.";
             ,  "Get its length. This is the total number of characters.";
              ] "Collect everything in an array.";

"And now the formatting:";
"DODDaD"36f-3/]zo
"DODDaD"          "Push this string.";
        36f-      "Subtract 36 from each character. This yields ' +  = '.";
            3/    "Split into two halves of 3 characters each.";
              ]   "Wrap this and the previous array in another array.";
               z  "Zip. Transposes the array to interleave strings with numbers.";
                o "Output the resulting array without delimiters.";
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.