Alfasayısal denge


15

Bir dizeyi girdi olarak alan ve içindeki alfasayısal ve alfasayısal olmayan karakter sayısını sayan bir program yazın. Sonuçlarını şu şekilde göstermelidir:

girdi: http://stackexchange.com
çıktı:20 + 4 = 24

Yakalama, kaynak kodunuz alfasayısal olmayan karakterlerle aynı sayıda alfasayısal karaktere sahip olmalıdır. Yorumlara izin verilmez, boşluk dikkate alınmaz. ( Whitespace adı verilen dil oy için yarışabilir, ancak kazanan olarak seçilmeyecektir)

Koddaki karakterler en azından bazı küçük gerekçelere sahip olmalı, tamamen gereksiz olmamalıdır . Örneğin, i = (j*3)+4;bunun yerine daha uzun değişken adlarına i = j*3+4;da izin verilir. Ancak, i = i + 1;;;;;;öyle değil.

Bunun yanında standart kod golf kuralları geçerlidir.


Ben anahtar kelimeler Ook yeni, Önişlenmiş varyantını tanımlarsanız O., O?ve O!daha sonra herhangi bir uzunlukta iş kaybetmek muhtemeldir ders Of programım yazma ... karakter sınıfı kısıtlama karşılamaktadır.
dmckee --- eski moderatör yavru kedi

2
hepsi ascii olacak mı?
Jordon Biondo

@JordonBiondo: Tam 8 bit ANSI'den unicode'a istediğiniz herhangi bir şey düşünüyordum, ancak kodunuz sadece 7 bit ASCII'yi destekliyorsa, ben de kabul edeceğim.
vsz

3
Çıktı dizesinin içindeki boşluk alfanümerik olmayan olarak sayılıyor mu? Yoksa diğer (string-literal olmayan) boşluklarla yok sayılır mı?
Kninnug

1
@dmckee: Kendi dilinizi tanımlayacaksanız, boş olmayan programların temel dilde olduğu gibi çalıştığı, ancak boş programın tam olarak soru sorar.
user2357112 Monica

Yanıtlar:


8

Perl, 32 + 32 = 64

Dizenin STDIN içinde olması bekleniyor. Çıktı STDOUT'a yazılır. Beyaz boşluk yok sayılır. Görev hakkındaki yorumum, programın puanı almak için kendi başına çalışabilmesi gerektiğidir.

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

Yorum yapılmamış

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

Aynı bayt sayıları ile birkaç varyasyon buldum, örneğin:

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

Örnekler

  • Sorudan örnek:

    echo 'http://stackexchange.com' | perl a.pl
    20 + 4 = 24
  • Kendi kendine çalışıyor ( a.pl):

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

    Dosya boyutu 104 bayttır, bu nedenle 40 bayt beyaz boşluk olarak yok sayılır.

Perl, 29 + 29 = 58

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

Dizenin STDIN'de olması beklenir ve ilk satırla sınırlıdır. Sonuç STDOUT'a yazdırılır. Beyaz boşluk yok sayılır.

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
      ' = '

Örnekler

Dosya a.plPerl komut dosyası içerir.

  • Sorudan örnek:

    echo 'http://stackexchange.com' | perl a.pl
    20 + 4 = 24
  • Kendi kendine koşmak:

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

    Dosya boyutu a.pl65 bayttır, bu nedenle 7 bayt beyaz boşluk olarak yok sayılır.


Görünüşe göre girdinin tek bir satırda olduğunu varsayıyorsunuz ... Spesifikasyonda bununla ilgili bir şey görmedim mi? Ayrıca, ilk değiştirmedeki / x bayrağının gerekçesi nedir?
skibrianski

@skibrianski: (a) Soru "string" in spesifikasyonu hakkında çok açık değil. Şimdi tüm dosyaları okuyabilen bir varyant ekledim. (b) Ayrıca bence beyaz alanın senaryo tarafından nasıl ele alınması gerektiği açık değildir. Benim yorumum, hem görevde hem de skorda beyaz boşluğun göz ardı edilmesidir. (c) / x bayrağı, modeldeki beyaz boşluğun okunabilirliği artırmasına izin verir. Güncellenmiş cevap bundan faydalanır.
Heiko Oberdiek

Re a), yazar dizede ne olacağı hakkında hiçbir şey söylemez, bu yüzden varsayımlarda bulunmak mantıksız olurdu, ki bu bana yeni satırlara izin verilmesi gerektiği anlamına geliyor. Yeniden b) kabul etti, net değil. Re c) Doğru, ama cevabınızdaki boşluk gözüme okunabilirlik katmıyor, sadece alfasayısal bir karakter ekliyor ... Belki bu noktada çok zorlanıyorum, ama sadece / x Sizin regexes birinde, muhtemelen sayıları hizalamak için son bir alfasayısal son eklemek için ekleyin =) Yine de cevabınızı seviyorum. Benzer bir şey pişirdim.
skibrianski

haha şimdi özdeş kod var =) iyi göstermek =)
skibrianski

@skibrianski: :-) Teşekkürler, bana diğer varyantlardan birini biraz daha farklı bir şekilde göndermem için bir sebep veriyorsunuz. Ancak bayt sayısı kalır.
Heiko Oberdiek

6

C - 96 (48 + 48) karakter

Biraz okunabilir. Yine de iyileştirme için yer var.

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

5

Bash + coreutils, 72 (36 + 36) boşluk olmayan karakter

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

Çıktı:

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

Önceki cevap:

Saf Bash, 92 (46 + 46) boşluk olmayan karakter

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

Çıktı:

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

Woohoo - golfscript'i bile geçiyor ! ;-)
Dijital Travma

Kontrol karakterleri ne olacak? [: alnum:], [: punct:] ifadesinin tersi değildir. Örneğin kafa -c256 / dev / urandom'u deneyin | tr -d [: alnum:] [: punct:]
skibrianski

@skibrianski iyi bir nokta. Bunu dikkate almak için cevabı düzenledim.
Dijital Travma

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

Ölçek

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

Ölçütleri geçmek için kodun kendisiyle test etme

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

" dizenin bir parçası olmayan `ile kaçtı.


2

GolfScript, 74 karakter (= 37 + 37)

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

Giriş kodu olarak kod için çevrimiçi test .


2

Yakut 38 + 38 = 76

Bu program girişteki son satırsonunu sayar.

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

Karakter sayısı programın kendisi tarafından yapılır: $ ruby alphabalance.rb alphabalance.rb:)


2

Powershell, 70 bayt (= 35 + 35)

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

Test komut dosyası:

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

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

Çıktı:

20+4=24
35+35=70

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

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

2

Python 2 (60 + 60 = 120)

Zor bir, muhtemelen iyileştirilmesi için yer var. Aslında fonksiyonun kendisi kendi alfanümerik dengesini değerlendirmek için kullanılabilir.

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      

Ölçek:

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

Bu hangi Python sürümü?
Gigaflop

@ Gigaflop Düzenledim. Print deyimi, backtick sözdizimi gibi yalnızca Python 2'dir repr.
mbomb007

1

C ++, 146 (73 + 73) 178 (89 + 89) boşluk olmayan karakterler #

Orijinal <algorithm>iyi bir sebep yok. Hata.

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

Yalnızca satırlardaki karakterleri sayıyorum //Code itself starts here. Özellikle, bu sayılmamak anlamına gelir #include <string>. Ayrıca trigrafları her biri üç karakter olarak sayıyorum, belki de tartışmalı. Programı kendi kaynak kodunda test ederken, dizgi değişmezi içinde trigraf değiştirmeyi önlemek için biraz dikkat edilmesi gerektiğini unutmayın.

Burada bazı tuhaf tasarım kararları var - çoğu üretim kodunda aynı fonksiyonda trigraflar ve aralık tabanlı döngülerle karşılaşmayacaksınız - ama bence hepsi 'haklı' sınırları içinde.


1

python 52 +52 = 104

İlginç bir meydan okuma çünkü python alfasayısal olmayan karakterlerden kaçınır.

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

Dilim kullanımı için küçük gerekçe: hızlandırır (belki?)


printParantez gerektirmediği için ve Python 2'yi kullanmayı deneyin '%d + %d = %d' % (a,l-a,l). Bu bazı karakterleri kaydetmelidir.
mbomb007

1

Julia, 64

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

Tüm gereksiz alfasayısal olmayan karakterler sondur ve dize biçimlendirmedeki ;bazılarıdır ().

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 boşluk olmayan karakter:

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

Perl -MO = Deparse ve bazı yorumlar aracılığıyla hafifçe netleştirildi:

$/ = $,;               # 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, $ \ her yazdırma çağrısına otomatik olarak eklenir ve toplam sayının sonuna eklenir.


İlk geçişimde 66 karakter vardı. Heiko
Oberdiek'e

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])

Burada çalıştırın: http://repl.it/8CH


0

Asi (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+]
]

Kullanım örneği (Rebol konsolunda):

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

NB. Program sayılardan boşlukları, sekmeleri ve yeni satırları yok sayar.


0

J - 46 + 46 = 92

Boşluğu sayar, böylece değişiklik yapmadan kendi kendini test edemezsiniz. Stdin üzerine girdi alır. Kötü bir ağzı var, sabunla yıkamalı.

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

Kullanımı:

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

Örnek Giriş: http://stackexchange.com
Çıkış:20 + 4 = 24

Kendi kendine koşmak:

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

Not: (o + $)Alfasayısal dengeyi korumak için yapılması gerekenler için durum böyle değildir. Çünkü o + " + "JS gördükten sonra +, sayı toplayıcılar yerine dize birleştiricileri olmaya karar verirdi . Böylece parantez gerekli olan veya 20 + 4olacak 204yerine 24: D

Mutlu Kodlama!


0

Clojure: (31 + 31 = 62) boşluk olmayan karakterler

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

Çıktı:

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

0

CJam, 27 + 27 = 54

CJam bu meydan okumadan birkaç ay daha yeni, bu nedenle bu yanıt yeşil onay işareti için uygun değil. Yine de eğlenceli bir egzersiz oldu!

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

Giriş dizesini komut satırı bağımsız değişkeni olarak alır, böylece çevrimiçi yorumlayıcıda çalışmaz, ancak Java yorumlayıcısıyla test edebilirsiniz .

açıklama

"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.";
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.