영숫자 균형


15

문자열을 입력으로 가져와 영숫자 및 영숫자가 아닌 문자 수를 계산하는 프로그램을 작성하십시오. 다음과 같이 결과를 표시해야합니다.

입력 : http://stackexchange.com
출력 :20 + 4 = 24

catch는 소스 코드가 영숫자가 아닌 문자와 같은 수의 영숫자를 가져야한다는 것입니다. 주석은 허용되지 않으며 공백은 무시됩니다. ( 공백 이라고하는 언어는 투표를 위해 경쟁 할 수 있지만 분명히 승자로 선정되지는 않습니다)

코드의 문자는 최소한 약간의 정당화를 가져야하며 완전히 불필요한 것은 아닙니다 . 예를 들어, 더 긴 변수 이름이 허용되는 i = (j*3)+4;대신 i = j*3+4;허용됩니다. 그러나 i = i + 1;;;;;;그렇지 않습니다.

이 외에도 표준 코드 골프 규칙이 적용됩니다.


나는 키워드는 OOK의 새로운 전처리 변형 정의하면 O., O?O!다음 어떤 이 길이 사업을 잃을 가능성이 높습니다 물론 프로그램 I 쓰기가 ... 문자 클래스 제한을 충족합니다.
dmckee --- 전 운영자 고양이 새끼

2
모두 아스키일까요?
Jordon Biondo

@ JordanBiondo : 전체 8 비트 ANSI에서 유니 코드에 이르기까지 원하는 것을 생각하고 있었지만 코드가 7 비트 ASCII 만 지원하면 받아 들일 것입니다.
vsz

3
출력 문자열 내부의 공백이 영숫자가 아닌 숫자로 계산됩니까? 또는 다른 모든 (문자열이 아닌) 공백으로 무시됩니까?
Kninnug

1
@ dmckee : 자신의 언어를 정의하려는 경우 비어 있지 않은 프로그램이 기본 언어에서와 같이 작동하지만 선택한 프로그램의 변형을 정의하면 비어있는 프로그램이 질문합니다.
user2357112는 Monica

답변:


8

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

@skibrianski : (a) "string"의 사양에 대한 질문은 명확하지 않습니다. 이제 전체 파일을 읽을 수있는 변형을 추가했습니다. (b) 또한 스크립트가 공백을 어떻게 처리해야하는지 명확하지 않습니다. 내 해석은 작업과 점수 모두에서 공백이 무시된다는 것입니다. (c) / x 플래그는 패턴의 공백이 가독성을 높이도록합니다. 업데이트 된 답변이 그것을 사용합니다.
Heiko Oberdiek 2012 년

Re a), 저자는 문자열에 무엇이 있는지에 대해 아무 말도하지 않으므로 가정을하는 것이 현명하지 않다고 생각합니다. Re b) 동의했다. 확실하지 않다. Re c) 그렇습니다. 그러나 당신의 대답에서 공백은 눈에 가독성을 추가하지 않습니다, 그것은 단지 영숫자 문자를 추가합니다 ... 어쩌면 나는이 시점에서 너무 어려울 수 있습니다. 정규식 중 하나에서 아마도 숫자를 맞추기 위해 마지막 영숫자를 추가하는 것 같습니다 =) 여전히 나는 당신의 대답을 좋아합니다. 나는 꽤 비슷한 것을 요리했습니다.
skibrianski

하하 이제 우리는 본질적으로 동일한 코드를 가지고 있습니다 =) good show =)
skibrianski

@skibrianski : :-) 고마워, 당신은 조금 더 다른 차이점을 가진 다른 변종 중 하나를 게시 할 이유를 제공합니다. 그러나 바이트 수는 남아 있습니다.
Heiko Oberdiek

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

@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

GolfScript, 74 자 (= 37 + 37)

{+}:PLUS;.,.@10,''*26,{65PLUS.32|}%PLUS$-,\1$-' + 'PLUS\PLUS' = 'PLUS\PLUS

코드를 입력으로 사용하여 코드에 대한 온라인 테스트 .


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

@ Gigaflop 나는 그것을 편집했다. print 문은의 백틱 구문과 마찬가지로 Python 2 전용입니다 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>. 나는 또한 3 개의 그래프를 각각 3 자로 계산하는데, 아마도 논쟁의 여지가 있습니다. 자체 소스 코드에서 프로그램을 테스트 할 때 문자열 리터럴 내에서 3 자 그래프 대체를 방지하기 위해 일부주의가 필요합니다.

여기에는 몇 가지 독특한 디자인 결정이 있습니다. 대부분의 프로덕션 코드에서는 동일한 함수에서 3 점 및 범위 기반 루프가 발생하지 않지만 '정의 가능한'범위 내에서 모두 생각합니다.


1

파이썬 52 +52 = 104

파이썬은 영숫자가 아닌 문자를 피하기 때문에 재미있는 ll 지입니다.

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

슬라이스 사용에 대한 사소한 정당화 : 속도를 높입니다 (아마도?)


print괄호가 필요하지 않고 '%d + %d = %d' % (a,l-a,l)메소드를 사용하므로 Python 2를 사용해보십시오 . 일부 문자를 저장해야합니다.
mbomb007

1

줄리아, 64

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

영숫자가 아닌 문자는 모두 마지막 문자입니다 ;() 문자열 형식 와 일부 입니다.

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

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

자바 스크립트-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 :)

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