สมดุลของตัวอักษรและตัวเลข


15

เขียนโปรแกรมที่รับสตริงเป็นอินพุตและนับจำนวนตัวอักษรผสมตัวเลขและอักขระที่ไม่ใช่ตัวอักษรผสมตัวเลขในนั้น มันต้องแสดงผลลัพธ์แบบนี้:

อินพุต: http://stackexchange.com
เอาต์พุต:20 + 4 = 24

การจับคือซอร์สโค้ดของคุณจะต้องมีจำนวนตัวอักษรและตัวเลขเหมือนกับที่ไม่ใช่ตัวอักษรและตัวเลข ไม่อนุญาตให้แสดงความคิดเห็นช่องว่างถูกละเว้น (ภาษาที่เรียกว่าWhitespaceอาจแข่งขันเพื่อลงคะแนน แต่จะไม่ถูกเลือกให้เป็นผู้ชนะแน่นอน)

ตัวอักษรในรหัสที่ต้องมีอย่างน้อยบางเหตุผลเล็ก ๆ น้อย ๆ ที่พวกเขาไม่ควรจะสมบูรณ์ฟุ่มเฟือย ตัวอย่างเช่นอนุญาตให้ใช้ชื่อตัวแปรที่ยาวขึ้นi = (j*3)+4;แทนที่จะi = j*3+4;อนุญาตให้ใช้เช่นกัน อย่างไรก็ตามi = i + 1;;;;;;ไม่ใช่

นอกจากนี้จะใช้กฎมาตรฐานของการเล่นกอล์ฟ


ถ้าผมกำหนดใหม่ที่แตกต่าง preprocessed ของ ook ที่คำหลักที่มีO., O?และO!แล้วใด ๆโปรแกรมที่ผมเขียนตรงตามข้อ จำกัด ตัวอักษรชั้นเรียน ... แน่นอนก็มีโอกาสที่จะสูญเสียในธุรกิจความยาว
dmckee --- ผู้ดูแลอดีตลูกแมว

2
มันจะเป็น ascii ทั้งหมดหรือไม่
Jordon Biondo

@ JordonBiondo: ฉันกำลังคิดถึงสิ่งที่คุณต้องการตั้งแต่ 8 บิต ANSI เต็มเป็น unicode แต่ถ้ารหัสของคุณรองรับเพียง ASCII 7 บิตฉันก็จะยอมรับเช่นกัน
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 ไบต์จะถูกละเว้นเป็นพื้นที่สีขาว

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

@skibrianski: (a) คำถามไม่ชัดเจนเกินไปเกี่ยวกับข้อกำหนดของ "สตริง" ตอนนี้ฉันเพิ่มตัวแปรที่สามารถอ่านไฟล์ทั้งหมดได้แล้ว (b) นอกจากนี้ยังไม่ชัดเจนสำหรับฉันว่าสคริปต์ควรใช้พื้นที่สีขาวอย่างไร การตีความของฉันคือพื้นที่สีขาวถูกละเว้นทั้งในงานและในคะแนน (c) แฟล็ก / x อนุญาตให้ใช้พื้นที่สีขาวในรูปแบบเพื่อเพิ่มความสามารถในการอ่าน คำตอบที่อัพเดตใช้ประโยชน์จากมัน
Heiko Oberdiek

Re) ผู้เขียนไม่ได้พูดอะไรเกี่ยวกับสิ่งที่จะอยู่ในสตริงดังนั้นฉันเดาว่ามันไม่ฉลาดในการตั้งสมมติฐานซึ่งสำหรับฉันหมายถึงการขึ้นบรรทัดใหม่ต้องได้รับอนุญาต เรื่องข) เห็นด้วยไม่ชัดเจน Re c) ถูกต้อง แต่ในคำตอบของคุณช่องว่างไม่ได้เพิ่มความสามารถในการอ่านให้กับตาของฉันมันแค่เพิ่มตัวอักษรและตัวเลข ... บางทีฉันอาจจะหนักเกินไปในจุดนี้ แต่มันเปิดเผยกับฉันว่าคุณใช้ / x เท่านั้น ในหนึ่งใน regexes ของคุณน่าจะเพิ่มหนึ่งตัวอักษรและตัวเลขสุดท้ายที่จะได้รับการจัดตำแหน่ง =) ฉันยังคงชอบคำตอบของคุณ ฉันทำอาหารที่คล้ายกันสวยขึ้นมา
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
$ 

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

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

งูหลามรุ่นนี้คืออะไร?
Gigaflop

@Gigaflop ฉันแก้ไขมัน พิมพ์คำสั่งเป็นงูหลาม 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>โดยเฉพาะอย่างยิ่งที่นี้หมายถึงไม่นับฉันยังนับ trigraphs เป็นตัวละครสามตัวซึ่งอาจเป็นที่ถกเถียงกัน โปรดทราบว่าในการทดสอบโปรแกรมด้วยซอร์สโค้ดของตัวเองจำเป็นต้องมีการดูแลบางอย่างเพื่อป้องกันการแทนที่ trigraph ภายในสตริงตัวอักษร

มีการตัดสินใจออกแบบแปลก ๆ บางอย่างที่นี่ - ในรหัสการผลิตส่วนใหญ่คุณจะไม่พบกับตรีโกณมิติและขอบเขตตามสำหรับลูปในฟังก์ชั่นเดียวกัน - แต่ฉันคิดว่าทั้งหมดอยู่ในขอบเขตของ 'สมเหตุสมผล'


1

หลาม 52 +52 = 104

การท้าดวลที่น่าสนใจเพราะหลามหลีกเลี่ยงอักขระที่ไม่ใช่ตัวอักษรและตัวเลข

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)";)

อักขระที่ไม่ใช่ตัวอักษรและตัวเลขที่ไม่จำเป็นเท่านั้นล้วนเป็นตัวอักษรสุดท้าย;และบางตัว()ในการจัดรูปแบบสตริงมันมีความสมดุลเกือบสมบูรณ์แบบ

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 = ความหยาบและความคิดเห็น:

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


0

Rebol (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 :)

ป.ล. สำหรับผู้ที่เกี่ยวข้องกับ(o + $)การทำเพื่อรักษาสมดุลตัวอักษรและตัวเลขก็ไม่เป็นเช่นนั้น เพราะหลังจากเห็นo + " + "JS จะตัดสินใจว่าทุกคน+จะเป็นนักเชื่อมต่อสายอักขระแทนที่จะเป็นผู้เพิ่มหมายเลข ดังนั้นจึงจำเป็นต้องใส่วงเล็บหรือ20 + 4จะกลายเป็น204มากกว่า24 : D

Happy Coding!


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.