Saldo alfanumerik

15

Tulis program yang mendapat string sebagai inputnya, dan hitung jumlah karakter alfanumerik dan non-alfanumerik di dalamnya. Itu harus menampilkan hasilnya seperti ini:

input: http://stackexchange.com
keluaran:20 + 4 = 24

Tangkapannya adalah, kode sumber Anda harus memiliki jumlah karakter alfanumerik yang sama dengan yang non-alfanumerik. Komentar tidak diizinkan, spasi putih diabaikan. (Bahasa yang disebut Whitespace mungkin bersaing untuk mendapatkan suara, tetapi tidak akan dipilih sebagai pemenang, jelas)

Karakter dalam kode harus memiliki setidaknya beberapa pembenaran kecil, mereka tidak boleh sepenuhnya berlebihan. Misalnya, nama variabel yang lebih panjang diizinkan, i = (j*3)+4;alih-alih i = j*3+4;juga diizinkan. Namun, i = i + 1;;;;;;tidak.

Selain itu, aturan kode-golf standar berlaku.

vsz
sumber
Jika saya mendefinisikan baru, varian preprocessed dari Ook mana kata kunci yang O., O?dan O!kemudian setiap program yang saya tulis memenuhi pembatasan kelas karakter ... Tentu saja ada kemungkinan kehilangan pada bisnis panjang.
dmckee --- ex-moderator kitten
2
apakah semuanya akan ascii?
Jordon Biondo
@JordonBiondo: Saya sedang memikirkan apa pun yang Anda inginkan dari ANSI 8 bit penuh untuk unicode, tetapi jika kode Anda hanya mendukung 7 bit ASCII, saya akan menerimanya juga.
vsz
3
Apakah spasi putih di dalam string output dihitung menjadi non-alfanumerik? Atau diabaikan dengan semua spasi putih (non-string-literal) lainnya?
Kninnug
1
@ dmckee: Jika Anda akan mendefinisikan bahasa Anda sendiri, cukup tentukan varian bahasa pilihan Anda di mana program-program non-kosong bekerja seperti dalam bahasa dasar, tetapi program kosong diproses ke dalam kode yang melakukan persis seperti apa pertanyaan bertanya.
user2357112 mendukung Monica

Jawaban:

8

Perl, 32 + 32 = 64

String diharapkan di STDIN. Outputnya ditulis ke STDOUT. Ruang putih diabaikan. Interpretasi saya terhadap tugas ini adalah bahwa program harus dapat berjalan sendiri untuk mendapatkan skor.

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

Tidak dikoleksi dengan komentar

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

Saya menemukan beberapa variasi dengan jumlah byte yang sama, misalnya:

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

Contohnya

  • Contoh dari pertanyaan:

    echo 'http://stackexchange.com' | perl a.pl
    20 + 4 = 24
  • Berjalan dengan sendirinya ( a.pl):

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

    Ukuran file adalah 104 byte, sehingga 40 byte diabaikan sebagai ruang putih.

Perl, 29 + 29 = 58

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

String diharapkan pada STDIN dan terbatas pada baris pertama. Hasilnya dicetak ke STDOUT. Ruang putih diabaikan.

Tidak disatukan

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

Contohnya

File a.plberisi skrip Perl.

  • Contoh dari pertanyaan:

    echo 'http://stackexchange.com' | perl a.pl
    20 + 4 = 24
  • Berjalan dengan sendirinya:

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

    Ukuran file a.pladalah 65 byte, sehingga 7 byte diabaikan sebagai ruang putih.

Heiko Oberdiek
sumber
Sepertinya Anda mengasumsikan input hanya pada satu baris ... Saya tidak melihat apa-apa tentang itu di spec? Juga, apa justifikasi untuk flag / x di ganti pertama?
skibrianski
@skibrianski: (a) Pertanyaannya tidak terlalu jelas tentang spesifikasi "string". Sekarang saya telah menambahkan varian yang dapat membaca seluruh file. (B) Juga tidak jelas bagi saya, bagaimana ruang putih harus diperlakukan oleh skrip. Interpretasi saya adalah bahwa ruang putih diabaikan dalam tugas dan skor. (c) Bendera / x memungkinkan spasi putih dalam pola untuk meningkatkan keterbacaan. Jawaban yang diperbarui memanfaatkannya.
Heiko Oberdiek
Kembali a), penulis tidak mengatakan apa-apa tentang apa yang akan ada dalam string, jadi saya kira itu tidak bijaksana untuk membuat asumsi, yang bagi saya berarti baris baru harus diizinkan. Ulang b) setuju, tidak jelas. Re c) Benar, tetapi dalam jawaban Anda spasi putih tidak menambah keterbacaan untuk mata saya, itu hanya menambahkan karakter alfanumerik ... Mungkin saya terlalu keras pada titik ini, tetapi mengungkapkan kepada saya bahwa Anda hanya menggunakan / x di salah satu regex Anda, mungkin untuk menambahkan satu alfanumerik tambahan terakhir untuk mendapatkan jumlah yang selaras =) Masih saya suka jawaban Anda. Saya memasak sesuatu yang sangat mirip.
skibrianski
haha sekarang kita memiliki kode yang pada dasarnya identik =) pertunjukan yang baik =)
skibrianski
@skibrianski: :-) Terima kasih, Anda memberi saya alasan untuk memposting salah satu varian lain dengan sedikit perbedaan. Namun jumlah byte tetap.
Heiko Oberdiek
6

C - 96 (48 + 48) karakter

Ini agak mudah dibaca. Masih ada ruang untuk perbaikan.

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

Bash + coreutils, 72 (36 + 36) karakter non-spasi putih

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

Keluaran:

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

Jawaban sebelumnya:

Pure Bash, 92 (46 + 46) karakter non-spasi putih

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

Keluaran:

$ ./alnumbalance.sh http://stackexchange.com 
20 + 4 = 24
$ ./alnumbalance.sh "$ (cat alnumbalance.sh)"
46 + 46 = 92
$ 
Trauma Digital
sumber
Woohoo - bahkan mengalahkan skrip golf ! ;-)
Trauma Digital
Bagaimana dengan karakter kontrol? [: alnum:] bukan kebalikan dari [: punct:]. Coba misal, head -c256 / dev / urandom | tr -d [: alnum:] [: punct:]
skibrianski
@skibrianski poin bagus. Saya telah mengedit jawaban untuk memperhitungkan ini.
Digital Trauma
3

PowerShell (43 + 43 = 86)

Golf

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

Tidak bermain golf

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

Uji

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

Pengujian dengan kode itu sendiri untuk lulus kriteria

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

" telah lolos dengan `yang bukan bagian dari string.

mikrobia
sumber
2

GolfScript, 74 karakter (= 37 + 37)

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

Tes online untuk kode dengan kode sebagai input.

Howard
sumber
2

Ruby 38 + 38 = 76

Program ini menghitung trailing baris baru di input.

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

Hitungan karakter dilakukan oleh program itu sendiri: $ ruby alphabalance.rb alphabalance.rb:)

daniero
sumber
2

Powershell, 70 byte (= 35 + 35)

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

Skrip uji:

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

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

Keluaran:

20+4=24
35+35=70

Powershell, 70 byte (= 35 + 35), alternatif

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

Python 2 (60 + 60 = 120)

Yang sulit, mungkin ada ruang untuk perbaikan. Seperti halnya fungsi itu sendiri dapat digunakan untuk mengevaluasi keseimbangan alfnumeriknya sendiri.

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      

Uji:

>>> f("http://stackexchange.com")
20 + 4 = 24
Willem
sumber
Versi Python apa ini?
Gigaflop
@Gigaflop saya mengeditnya. Pernyataan cetak hanya untuk Python 2, seperti halnya sintaks backtick untuk repr.
mbomb007
1

C ++, 146 (73 + 73) 178 (89 + 89) karakter bukan spasi #

Asli termasuk <algorithm>tanpa alasan. Ups.

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

Saya hanya menghitung karakter setelahnya //Code itself starts here. Secara khusus, ini berarti tidak menghitung #include <string>. Saya juga menghitung trigraph masing-masing sebagai tiga karakter, yang mungkin bisa diperdebatkan. Perhatikan bahwa dalam menguji program dengan kode sumbernya sendiri, diperlukan kehati-hatian untuk mencegah penggantian trigraph dalam string literal.

Ada beberapa keputusan desain yang aneh di sini - dalam sebagian besar kode produksi Anda tidak akan menemukan trigraph dan range-for-loop berdasarkan fungsi yang sama - tapi saya pikir semuanya dalam batas-batas 'dapat dibenarkan'.

pengguna19057
sumber
1

python 52 +52 = 104

Challnge menarik karena python menghindari karakter non-alfanumerik.

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

Pembenaran kecil untuk menggunakan slice: mempercepatnya (mungkin?)

qwr
sumber
Coba gunakan Python 2, karena printtidak memerlukan tanda kurung, dan menggunakan '%d + %d = %d' % (a,l-a,l)metode. Itu harus menyimpan beberapa karakter.
mbomb007
1

Julia, 64

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

Semua satu-satunya karakter non alfanumerik yang tidak perlu adalah yang terakhir ;dan beberapa ()di dalam pemformatan string., Itu keluar hampir seimbang sempurna, dan sebagai kekuatan 2 tanpa banyak mengutak-atik.

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"
gggg
sumber
1

perl, 64 karakter non-spasi putih:

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

Klarifikasi sedikit melalui perl -MO = Deparse dan beberapa komentar:

$/ = $,;               # 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, $ \ ditambahkan secara otomatis di setiap panggilan untuk mencetak, dengan menempatkan jumlah total di akhir.

skibrianski
sumber
Memiliki 66 karakter pada pass pertama saya. Terima kasih kepada Heiko Oberdiek karena menunjukkan bahwa Anda dapat menghapus $ / dengan lebih sedikit karakter dengan menyetelnya ke $, =)
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])

Jalankan di sini: http://repl.it/8CH

mbomb007
sumber
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+]
]

Contoh penggunaan (dalam konsol Rebol):

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

NB. Program mengabaikan spasi, tab & baris baru dari hitungan.

draegtun
sumber
0

J - 46 + 46 = 92

Menghitung spasi putih, jadi Anda tidak dapat menguji sendiri tanpa modifikasi. Mengambil input pada stdin. Mulutnya jelek, harus dicuci bersih dengan sabun.

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

Pemakaian:

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

Javascript - 76 (38 + 38)

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

Contoh Input: http://stackexchange.com
Keluaran:20 + 4 = 24

Berjalan sendiri:

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 Bagi mereka yang peduli (o + $)untuk menjaga keseimbangan alfanumerik, tidak demikian. Karena setelah melihat o + " + "JS akan memutuskan semua +menjadi string concatenaters daripada number adders. Dengan demikian tanda kurung diperlukan, atau 20 + 4akan menjadi 204daripada 24: D

Selamat Coding!

Gaurang Tandon
sumber
0

Clojure: (31 + 31 = 62) karakter non-spasi putih

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

Keluaran:

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

CJam, 27 + 27 = 54

CJam beberapa bulan lebih baru dari tantangan ini, jadi jawaban ini tidak memenuhi syarat untuk tanda centang hijau. Bagaimanapun, itu adalah latihan yang menyenangkan!

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

Dibutuhkan string input sebagai argumen baris perintah, sehingga tidak akan berfungsi dalam penerjemah online, tetapi Anda dapat mengujinya dengan penerjemah Java .

Penjelasan

"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.";
Martin Ender
sumber