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


15

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

вход: http://stackexchange.com
выход:20 + 4 = 24

Уловка в том, что ваш исходный код должен иметь такое же количество буквенно-цифровых символов, что и не буквенно-цифровые символы. Комментарии не допускаются, пробелы игнорируются. (Язык под названием « Пробел» может конкурировать за голоса, но, очевидно, не будет выбран победителем)

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

Кроме того, применяются стандартные правила игры в гольф.


Если я определяю новый, препроцессированный вариант ООКИ , где ключевые слова O., O?и O!затем любая программа , которую я запись соответствует ограничению класса характера ... Конечно , это, вероятно, потеряет от длины бизнеса.
dmckee --- котенок экс-модератора

2
это все будет ascii?
Джордон Биондо

@JordonBiondo: Я думал обо всем, что вы хотите от полного 8-битного ANSI до юникода, но если ваш код поддерживает только 7-битный ASCII, я тоже приму это.
вс

3
Считается ли пробел внутри выходной строки в не алфавитно-цифровые? Или игнорируется со всеми другими (не строковыми литералами) пробелами?
Книнуг

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 байтов игнорируются как пробелы.

Perl, 29 + 29 = 58

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

Строка ожидается в STDIN и ограничена первой строкой. Результат выводится на STDOUT. Пустое пространство игнорируется.

Ungolfed

$_ = <>;
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". Теперь я добавил вариант, который может читать целые файлы. (б) Также мне не ясно, как сценарий должен обрабатывать пробелы. Моя интерпретация заключается в том, что пробел игнорируется как в задании, так и в счете. (c) Флаг / x позволяет пробелу в шаблоне повысить удобочитаемость. Обновленный ответ использует это.
Хейко Обердик

В связи с этим, автор ничего не говорит о том, что будет в строке, поэтому я думаю, что делать предположения неразумно, что для меня означает, что переводы строк должны быть разрешены. Ре б) согласился, не понятно. Re c) Правильно, но в вашем ответе пробел не добавляет читабельности моему глазу, он просто добавляет буквенно-цифровой символ ... Может быть, я слишком усерден в этом вопросе, но мне показалось, что вы используете только / x в одном из ваших регулярных выражений, предположительно, чтобы добавить еще одну последнюю буквенно-цифровую цифру, чтобы получить счетчики для выравнивания =) Тем не менее мне нравится ваш ответ. Я приготовил что-то похожее.
Скибрянски

хаха теперь у нас по сути идентичный код =) хорошее шоу =)
скибрянски

@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 "$ (cat 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 "$ (cat alnumbalance.sh)"
46 + 46 = 92
$ 


Как насчет управляющих символов? [: alnum:] не является обратным к [: punct:]. Попробуйте, например, head -c256 / dev / urandom | tr -d [: alnum:] [: punct:]
скибрянски

@skibrianski хороший момент. Я отредактировал ответ, чтобы принять это во внимание.
Цифровая травма

3

PowerShell (43 + 43 = 86)

Golfed

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

Un-golfed

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

Python 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

@Gigaflop Я редактировал это. Оператор print является только Python 2, как и синтаксис обратного ключа для repr.
mbomb007

1

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

Python 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

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

;":&.>(+/;' + ';(#-+/);' = ';#)(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.