Cân bằng chữ và số


15

Viết chương trình lấy một chuỗi làm đầu vào của nó và đếm số ký tự chữ và số không phải là chữ và số trong đó. Nó phải hiển thị kết quả của nó như thế này:

đầu vào: http://stackexchange.com
đầu ra:20 + 4 = 24

Điều thú vị là, mã nguồn của bạn phải có cùng số lượng ký tự chữ và số như các ký tự không chữ và số. Bình luận không được phép, khoảng trắng bị bỏ qua. (Ngôn ngữ được gọi là Rõ ràng, Khoảng trắng có thể cạnh tranh để bỏ phiếu, nhưng rõ ràng sẽ không được chọn là người chiến thắng)

Các ký tự trong mã phải có ít nhất một số biện minh nhỏ, chúng không nên hoàn toàn thừa. Ví dụ, tên biến dài hơn được cho phép, i = (j*3)+4;thay vìi = j*3+4; cũng được cho phép. Tuy nhiên, i = i + 1;;;;;;không phải.

Bên cạnh đó, áp dụng quy tắc golf tiêu chuẩn.


Nếu tôi xác định một mới, xử lý trước biến thể của Ook nơi từ khóa O., O?O!rồi bất kỳ chương trình tôi viết đáp ứng các hạn chế lớp nhân vật ... Tất nhiên nó có khả năng mất vào việc kinh doanh dài.
dmckee

2
tất cả sẽ là ascii?
Jordon Biondo

@JordonBiondo: Tôi đã nghĩ về bất cứ điều gì bạn muốn từ ANSI 8 bit đầy đủ đến unicode, nhưng nếu mã của bạn chỉ hỗ trợ ASCII 7 bit, tôi cũng sẽ chấp nhận nó.
vsz

3
Là khoảng trắng bên trong chuỗi đầu ra được tính vào số không phải là chữ số? Hoặc bỏ qua với tất cả các khoảng trắng (không phải chuỗi ký tự) khác?
Kninnug

1
@dmckee: Nếu bạn định định ngôn ngữ của riêng mình, chỉ cần xác định một biến thể của ngôn ngữ bạn chọn trong đó các chương trình không trống hoạt động giống như trong ngôn ngữ cơ sở, nhưng chương trình trống được xử lý trước thành mã có chính xác những gì câu hỏi yêu cầu.
user2357112 hỗ trợ Monica

Câu trả lời:


8

Perl, 32 + 32 = 64

Chuỗi dự kiến ​​trong STDIN. Đầu ra được ghi vào STDOUT. Không gian màu trắng bị bỏ qua. Giải thích của tôi về nhiệm vụ là chương trình sẽ có thể tự chạy để lấy điểm.

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

Phản đối với ý kiến

$/ = $,; # 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.
      ' = '

Tôi đã tìm thấy một số biến thể có cùng số byte, ví dụ:

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

Ví dụ

  • Ví dụ từ câu hỏi:

    echo 'http://stackexchange.com' | perl a.pl
    20 + 4 = 24
  • Chạy trên chính nó ( a.pl):

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

    Kích thước tệp là 104 byte, do đó 40 byte bị bỏ qua dưới dạng khoảng trắng.

Perl, 29 + 29 = 58

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

Chuỗi dự kiến ​​tại STDIN và nó được giới hạn ở dòng đầu tiên. Kết quả được in thành STDOUT. Không gian màu trắng bị bỏ qua.

Ung dung

$_ = <>;
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
      ' = '

Ví dụ

Tệp a.plchứa tập lệnh Perl.

  • Ví dụ từ câu hỏi:

    echo 'http://stackexchange.com' | perl a.pl
    20 + 4 = 24
  • Chạy trên chính nó:

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

    Kích thước tệp a.pllà 65 byte, do đó 7 byte bị bỏ qua dưới dạng khoảng trắng.


Có vẻ như bạn đang cho rằng đầu vào chỉ nằm trên một dòng ... Tôi không thấy gì về thông số đó trong thông số kỹ thuật? Ngoài ra, sự biện minh cho cờ / x trong lần thay thế đầu tiên là gì?
skibrianski

@skibrianski: (a) Câu hỏi không quá rõ ràng về đặc điểm kỹ thuật của "chuỗi". Bây giờ tôi đã thêm một biến thể có thể đọc toàn bộ tập tin. (b) Ngoài ra, đối với tôi không rõ ràng về cách xử lý khoảng trắng. Giải thích của tôi là khoảng trắng bị bỏ qua trong cả nhiệm vụ và điểm số. (c) Cờ / x cho phép khoảng trắng trong mẫu để tăng khả năng đọc. Câu trả lời cập nhật sử dụng nó.
Heiko Oberdiek

Re), tác giả không nói bất cứ điều gì về chuỗi sẽ có trong chuỗi, vì vậy tôi đoán rằng sẽ không khôn ngoan khi đưa ra các giả định, điều đó với tôi có nghĩa là các dòng mới phải được cho phép. Re b) đồng ý, nó không rõ ràng. Re c) Đúng, nhưng trong khoảng trắng câu trả lời của bạn không thêm khả năng đọc vào mắt tôi, nó chỉ thêm một ký tự chữ và số ... Có thể tôi quá khó về điểm này, nhưng nó tiết lộ với tôi rằng bạn chỉ sử dụng / x trong một trong các biểu thức chính của bạn, có lẽ để thêm một chữ số cuối cùng đó để có được số lượng để căn chỉnh =) Tôi vẫn thích câu trả lời của bạn. Tôi đã nấu một cái gì đó khá giống nhau.
skibrianski

haha bây giờ chúng ta có mã cơ bản giống hệt nhau =) chương trình tốt =)
skibrianski

@skibrianski: :-) Cảm ơn, bạn cho tôi một lý do để đăng một trong những biến thể khác với một chút khác biệt. Tuy nhiên, số byte vẫn còn.
Heiko Oberdiek

6

C - 96 (48 + 48) ký tự

Nó hơi dễ đọc. Có chỗ để cải thiện, mặc dù.

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

5

Bash + coreutils, 72 (36 + 36) ký tự không khoảng trắng

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

Đầu ra:

$ ./alnumbalance.sh http://stackexchange.com 
20 + 4 = 24
$ ./alnumbalance.sh "$ (mèo alnumbalance.sh)"
36 + 36 = 72
$ 

Câu trả lời trước:

Pure Bash, 92 (46 + 46) ký tự không khoảng trắng

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

Đầu ra:

$ ./alnumbalance.sh http://stackexchange.com 
20 + 4 = 24
$ ./alnumbalance.sh "$ (mèo alnumbalance.sh)"
46 + 46 = 92
$ 

Woohoo - nó thậm chí còn đánh bại cả golf ! ;-)
Chấn thương kỹ thuật số

Còn nhân vật điều khiển thì sao? [: alnum:] không phải là nghịch đảo của [: punc:]. Thử ví dụ: đầu -c256 / dev / urandom | tr -d [: alnum:] [: punc:]
skibrianski 15/03 '

@skibrianski điểm tốt. Tôi đã chỉnh sửa câu trả lời để tính đến điều này.
Chấn thương kỹ thuật số

3

PowerShell (43 + 43 = 86)

Chơi gô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)"}

Không chơi gô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)"
}

Kiểm tra

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

Thử nghiệm với chính mã để vượt qua các tiêu chí

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

" đã được thoát với `mà không phải là một phần của chuỗi.



2

Hồng ngọc 38 + 38 = 76

Chương trình này tính dòng mới trong đầu vào.

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

Số lượng ký tự được thực hiện bởi chính chương trình: $ ruby alphabalance.rb alphabalance.rb:)


2

Powershell, 70 byte (= 35 + 35)

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

Kịch bản thử nghiệm:

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

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

Đầu ra:

20+4=24
35+35=70

Powershell, 70 byte (= 35 + 35), thay thế

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

2

Con trăn 2 (60 + 60 = 120)

Khó khăn một, có lẽ có chỗ để cải thiện. Giống như thực tế, chính hàm này có thể được sử dụng để đánh giá sự cân bằng chữ và số của chính nó.

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      

Kiểm tra:

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

Phiên bản Python này là gì?
Gigaflop

@Gigaflop Tôi đã chỉnh sửa nó. Câu lệnh in chỉ là Python 2, như là cú pháp backtick cho repr.
mbomb007

1

C ++, 146 (73 + 73) 178 (89 + 89) ký tự không khoảng trắng #

Bao gồm bản gốc <algorithm>không có lý do chính đáng. Giáo sư.

//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));
??>

Tôi chỉ đếm các ký tự trong các dòng sau //Code itself starts here. Đặc biệt, điều này có nghĩa là không tính#include <string> . Tôi cũng đang đếm ba chữ cái là ba ký tự, có lẽ là điều gây tranh cãi. Lưu ý rằng trong quá trình kiểm tra chương trình trên mã nguồn riêng của mình, cần phải có sự cẩn thận để ngăn chặn sự thay thế của bộ ba trong chuỗi ký tự.

Có một số quyết định thiết kế đặc biệt ở đây - trong hầu hết các mã sản xuất, bạn sẽ không gặp phải các vòng lặp và các vòng lặp dựa trên phạm vi trong cùng một chức năng - nhưng tôi nghĩ tất cả nằm trong giới hạn của 'chính đáng'.


1

trăn 52 +52 = 104

Challnge thú vị vì python tránh các ký tự không chữ và số.

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

Biện minh nhỏ cho việc sử dụng lát: nó tăng tốc (có thể?)


Hãy thử sử dụng Python 2, vì printkhông yêu cầu dấu ngoặc đơn và sử dụng '%d + %d = %d' % (a,l-a,l)phương thức. Điều đó sẽ lưu một số nhân vật.
mbomb007

1

Julia, 64

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

Tất cả các ký tự không phải là chữ và số không cần thiết là cuối cùng ;và một số ()trong định dạng chuỗi., Nó xuất hiện gần như hoàn toàn cân bằng, và như là một sức mạnh của 2 mà không có nhiều khó khăn.

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 ký tự không khoảng trắng:

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

Làm rõ một chút qua perl -MO = Depough và một số bình luận:

$/ = $,;               # 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, $ \ được thêm tự động vào mỗi cuộc gọi để in, đặt tổng số ở cuối.


Có 66 ký tự trên đường chuyền đầu tiên của tôi. Cảm ơn Heiko Oberdiek vì đã cho thấy rằng bạn có thể hủy đặt $ / với số ký tự ít hơn bằng cách đặt nó thành $, =)
skibrianski 15/03/2016

1

Con trăn 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])

Chạy nó ở đây: http://repl.it/8CH


0

Nổi loạn (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+]
]

Ví dụ sử dụng (trong bảng điều khiển Rebol):

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

Lưu ý Chương trình bỏ qua khoảng trắng, tab và dòng mới từ số đếm.


0

J - 46 + 46 = 92

Đếm khoảng trắng, vì vậy bạn không thể tự kiểm tra mà không sửa đổi. Đưa đầu vào vào stdin. Có một cái miệng xấu, nên đi rửa bằng xà phòng.

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

Sử dụng:

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

Đầu vào mẫu: http://stackexchange.com
Đầu ra:20 + 4 = 24

Tự chạy

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 Đối với những người liên quan đến (o + $)việc thực hiện để duy trì cân bằng chữ và số, thì không phải vậy. Bởi vì sau khi thấy o + " + "JS sẽ quyết định tất cả +là bộ nối chuỗi chứ không phải là bộ cộng số. Do đó, dấu ngoặc đơn là cần thiết hoặc 20 + 4sẽ trở thành 204thay vì 24: D

Chúc mừng mã hóa!


0

Clojure: (31 + 31 = 62) ký tự không phải khoảng trắng

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

Đầu ra:

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

0

CJam, 27 + 27 = 54

CJam mới hơn một vài tháng so với thử thách này, vì vậy câu trả lời này không đủ điều kiện cho dấu kiểm màu xanh lá cây. Dù sao đó cũng là một bài tập thú vị!

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

Nó lấy chuỗi đầu vào làm đối số dòng lệnh, vì vậy nó sẽ không hoạt động trong trình thông dịch trực tuyến, nhưng bạn có thể kiểm tra nó bằng trình thông dịch Java .

Giải trình

"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.";
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.