Sayaç sayacı


18

Tipografide sayaç , bir harfin bir harf formu veya bir sembolle tamamen veya kısmen çevrelenmiş alanıdır. Kapalı sayaç, tamamen bir harf formu veya sembolüyle çevrelenmiş bir sayaçtır. Bir programın girdi olarak bir dize aldığını ve metindeki toplam kapalı sayaç sayısını yazdırdığını yazmanız gerekir.

Girişiniz:

  • Bir komut satırı girişi veya STDIN olabilir, ancak hangisini belirtmeniz gerekir.

  • Tamamen yazdırılabilir ASCII karakterlerinden oluşur, yani 32 ve 126 dahil tüm ASCII değerleri. Buna boşluklar da dahildir. Daha fazla bilgi.

Şimdi, bu yazı tipleri arasında biraz farklılık gösterir. Örneğin, bunu okuduğunuz yazı tipinde 'g' harfinin kapalı bir sayacı vardır, google yazı tipinde ise iki kapalı sayacı olan 'g' vardır. Bu bir sorun değil, burada karakter başına resmi kapalı sayaç sayısı.

Kapalı sayacı olmayan tüm semboller:

 !"'()*+,-./12357:;<=>?CEFGHIJKLMNSTUVWXYZ[\]^_`cfhijklmnrstuvwxyz{|}~

Bunun boşluk içerdiğini unutmayın.

İşte bir kapalı sayacı olan tüm simgeler:

#0469@ADOPQRabdegopq

Ve burada 2 kapalı sayacı olan tüm semboller:

$%&8B

Ve son olarak, en önemlisi, bazı örnek giriş ve çıkışları.

Programming Puzzles and Code-Golf yazdırmalı 13

4 8 15 16 23 42 yazdırmalı 5

All your base are belong to us yazdırmalı 12

Standard loopholes apply yazdırmalı 12

Shortest answer in bytes is the winner! yazdırmalı 8


1
İki cevap tam programlar yerine fonksiyonlar gönderdi. Varsayılan olarak buna izin verilirken, ifadeleriniz aksini önerir. Açıklığa kavuşturabilir misiniz?
Dennis

Hangi sayaçları sayacağınızı açıklar mısınız?
Martin Ender

3
Soruyu görüntülediğim yazı tiplerinden hiçbiri verdiğiniz sayılara karşılık gelmiyor. Örneğin tarayıcıda, sıfırın içinden iki sayaç vererek çapraz bir eğik çizgi vardır. Android uygulamasında yazı tipi yok, ancak burada giki kapalı sayaç var. Sayaçları belirli bir yazı tipine göre belirlediniz mi?
Martin Ender

1
@DJMcMayhem 'g' 1; kod listelenen olsa da, 2 gvardır. Biraz okumak için kafa karıştırıcı, ama yere göre farklı olduğunu sanmıyorum.
OJFord

1
0Belirli yazı tiplerinde, özellikle de tek aralıklı yazı tiplerinde 2 kapalı sayaç yok mu ?
vsz

Yanıtlar:


10

Pyth, 31 bayt

sm@tjC"cúÁ-ÈN%³rØ|­"3Cdz

Gösteri.

ASCII olmayan karakterlerin kullanılması nedeniyle kodun düzgün görüntülenmeyebileceğini unutmayın. Doğru kod bağlantıda.

Her bir giriş karakteri için istenen çıktının bir arama tablosunu yaptım, Pyth'in modüler indekslemesini kullanmak için 32'ye döndürdüm, başlangıçta 1'e yapıştım ve sayıyı vererek bir baz 3 numarası olarak yorumladım 2229617581140564569750295263480330834137283757. Daha sonra bu sayıyı taban 256'ya dönüştürdüm ve cevapta kullanılan dize olan bir dizeye dönüştürdüm.


29

Python 3, 63

print(sum(map(input().count,"#0469@ADOPQRabdegopq$%&8B$%&8B")))

Basit bir yaklaşım. Her bir karakteri kapalı bir sayaçla yineleyerek yineleme sayısını toplar ve iki kapalı sayacı olan karakterler için iki kez yapar. Bunun yerine yazmak aynı uzunlukta olurdu

"#0469@ADOPQRabdegopq"+"$%&8B"*2

Bundan kaçınmak için Python 3 gereklidir raw_input.


12

CJam, 41 39 37 34 bayt

"$%&8Badopq#0469@Rbeg"_A<eu+qfe=1b

3 bayt golf için @ jimmy23013 için teşekkürler!

Çevrimiçi deneyin.

Nasıl çalışır

"$%&8Badopq#0469@Rbeg"             e# Push that string.
                      _A<          e# Retrieve the first 10 characters.
                         eu+       e# Convert to uppercase and append.
                                   e# This pushes "$%&8Badopq#0469@Rbeg$%&8BADOPQ".
                            q      e# Read from STDIN.
                             fe=   e# Count the occurrences of each character. 
                                1b e# Base 1 conversion (sum).

2
"$%&8Badopq#0469@Rbeg"_A<eu+.
jimmy23013

@ jimmy23013: Ben birkaç varyasyonları çalıştı euve elama bunun bulmadım. Teşekkürler!
Dennis

8

sed, 51

@Manatwork ve @TobySpeight'tan golf yardımı ile:

s/[$%&8B]/oo/g
s/[^#0469@ADOPQRabdegopq]//g
s/./1/g

STDIN'den giriş. İle akılda Bu meta-soruya , çıktı tekli içindedir:

$ echo 'Programming Puzzles and Code-Golf
4 8 15 16 23 42
All your base are belong to us
Standard loopholes apply
Shortest answer in bytes is the winner!' | sed -f countercounter.sed
1111111111111
11111
111111111111
111111111111
11111111
$ 

7

Perl, 41

$_=y/#0469@ADOPQRabdegopq//+y/$%&8B//*2

41için karakterler +1 karakter -p.

Bu , karakterleri saymak için y /// kullanır .

echo 'Programming Puzzles and Code-Golf' | perl -pe'$_=y/#0469@ADOPQRabdegopq//+y/$%&8B//*2'

6

GNU APL, 39 bayt

+/⌈20÷⍨26-'$%&8B#0469@ADOPQRabdegopq'⍳⍞

GNU APL.js'de çevrimiçi deneyin .

Nasıl çalışır

                                      ⍞ Read input.
          '$%&8B#0469@ADOPQRabdegopq'⍳  Compute the indexes of the input characters
                                        in this string. Indexes are 1-based.
                                        26 == 'not found'
       26-                              Subtract each index from 26.
   20÷⍨                                 Divide those differences by 20.
  ⌈                                     Round up to the nearest integer.
+/                                      Add the results.

6

JavaScript, 86

Açılır pencere yoluyla G / Ç. Herhangi parçacığını çalıştırın d testine güncel bir tarayıcı.

for(c of prompt(t=0))c='$%&8B#0469@ADOPQRabdegopq'.indexOf(c),~c?t+=1+(c<5):0;alert(t)


6

K, 54 43 42 37 bayt

+//(30#"$%&8B#0469@ADOPQRabdegopq"=)'

@JohnE sayesinde 5 bayt kesin!

Eski versiyon:

f:+/(#&"#0469@ADOPQRabdegopq$%&8B$%&8B"=)'

Orijinal:

f:+/{2-(5="$%&8B"?x;20="#0469@ADOPQRabdegopq"?x;0)?0}'

#&Pars içeride aynı kolaylıkla olabilir +/Eğer daha ileri gidebiliriz hangi araçları +//"#0469@ADOPQRabdegopq$%&8B$%&8B"=\:. Son olarak, f:fonksiyonun örtük formda kullanılabileceğinden, sahip olmak gerekli değildir . Bu sizi 38'e indirir!
JohnE

Maalesef birkaç diğer çözümler arama tablosu sıkıştırmak için istihdam var hüner ölü bile geçerli 38 bayt çözümle gelirse: +//(30#"$%&8B#0469@ADOPQRabdegopq")=\:. Bu yapabileceğimiz en iyi şey olabilir.
JohnE

haha, bir karakteri kaydettiğimden daha kısa bir süre sonra +//(30#"$%&8B#0469@ADOPQRabdegopq"=)'
yayınladım

5

C, 127 bayt

n;f(char*i){char*o="#0469@ADOPQRabdegopq",*t="$%&8B";for(;*i;i++)if(strchr(o,*i))n++;else if(strchr(t,*i))n+=2;printf("%d",n);}

Oldukça açık. Ungolfed sürümü:

int num = 0;
void f(char* input)
{
    char *one="#0469@ADOPQRabdegopq";
    char *two="$%&8B";

    for(;*input;input++)
        if(strchr(one, *input))     //If current character is found in first array
            num ++;
        else if(strchr(two, *input))//If cuurent character is found in second array
            num += 2;

    printf("%d", num);
}

Burada test edin

İşlev bağımsız değişkenlerine izin verilmiyorsa, stdinsürüm 141 bayta kadar çıkar:

n;f(){char*o="#0469@ADOPQRabdegopq",*t="$%&8B",i[99],*p;gets(i);for(p=i;*p;p++)if(strchr(o,*p))n++;else if(strchr(t,*p))n+=2;printf("%d",n);}

Yukarıdaki sürümün girişin en az 98 karakter uzunluğunda olduğunu varsaydığını unutmayın.

Burada test edin

Komut satırı bağımsız değişkenleri sürümü (143 bayt):

n;main(c,v)char**v;{char*o="#0469@ADOPQRabdegopq",*t="$%&8B",*p=v[1];for(;*p;p++)if(strchr(o,*p))n++;else if(strchr(t,*p))n+=2;printf("%d",n);}

Burada test edin


1
@DJMcMayhem C gerçekten o kadar da kötü değil. Fortran 77'de golf oynamayı deneyin.;)
Alex

5

Python 2, 96 90 75 67 + 2 = 69 Bayt

Bunu yapmanın başka bir yolu düşünemiyorum ... xnor'ın çözümünü görene kadar düşünürdüm. Zaten sahip olduğum şeyi paylaşacağım.

6 bayt tasarruf için FryAmTheEggman'a teşekkürler

Tamam, şimdi bundan memnunum.

Bulma hilesi için xnor'a teşekkürler, 4 bayt tasarruf etti.

Girdilerin tırnak içine alınması gerektiğinden iki bayt eklendi.

print sum('#0469@ADOPQRabdegopq$%&8B'.find(x)/20+1for x in input())

1
Endekslerin akıllıca kullanılmasını seviyorum! Ayrıca, python 3, raw_input yerine girdi kullandığından biraz daha kısadır.
DJMcMayhem


Ah anlıyorum. Üzgünüz, @ DJMcMayhem's Python 3 yorumuyla birleştirdim.
manatwork

4

Java, 162

class C{public static void main(String[]a){System.out.print(-a[0].length()+a[0].replaceAll("[#0469@ADOPQRabdegopq]","..").replaceAll("[$%&8B]","...").length());}}

O Eh eğer sahip tam bir program olarak ... Bu sadece bir tek satırlık olduğunu maçlar karakterler ve daha uzun bir dize ile cümledeki onları. Ardından, orijinalden uzunluk farkını döndürür. Ne yazık ki, java'nın sadece maç sayısını hesaplayacak hiçbir şeyi yok.

İşte satır sonları ile:

class C{
    public static void main(String[]a){
        System.out.print(
                -a[0].length() +
                a[0].replaceAll("[#0469@ADOPQRabdegopq]","..")
                .replaceAll("[$%&8B]","...")
                .length()
                        );
    }
}


4

Javascript, 114 95 bayt

alert(prompt().replace(/[#046@ADOPQRabdegopq]/g,9).replace(/[$%&8B]/g,99).match‌​(/9/g).length)

Ismael Miguel'e bunu golf oynadığım için teşekkürler


2
93 bayt:alert(prompt().replace(/[#046@ADOPQRabdegopq]/g,9).replace(/[$%&8B]/g,99).match(/9/g).length)
Ismael Miguel

Kötü saydığım için üzgünüm. Evet, 95.
Ismael Miguel

3

Ruby, 59 bayt

a=gets;p a.count('#0469@ADOPQRabdegopq')+2*a.count('$%&8B')

Komut satırından veya stdin'den giriş. Ezoterik olmayan bir dil kullanarak şimdiye kadarki en kısa.

Güncelleme: chilemagic beni dövdü


3

Retina , 44 bayt

1

[#0469@ADOPQRabdegopq]
1
[$%&8B]
11
[^1]
<empty line>

Tekli olarak çıktı verir.

Her satır kendi dosyasına gitmeli veya -sbayrağını kullanabilirsiniz . Örneğin:

> echo "pp&cg"|retina -s counter
11111

Çizgi çiftleri (desen - ikame çiftleri) aşağıdaki ikame adımlarını gerçekleştirir:

  • Adlı 1kişiyi kaldır
  • 1-sayaç harflerini 1
  • 2-sayaç harflerini 11
  • Kaldır herşey ama 1'ler

3

J, 43

İşlev olarak:

   f=:[:+/[:,30$'$%&8B#0469@ADOPQRabdegopq'=/]
   f 'text goes here'
6

46 bayt (komut satırı)

Bağımsız bir komut satırı programı olarak:

echo+/,30$'$%&8B#0469@ADOPQRabdegopq'=/>{:ARGV

Yukarıdaki satırı farklı kaydedin ve counter2.ijskomut satırından arayın:

$ jconsole counter2.ijs 'Programming Puzzles and Code Golf'
13

Girdinin koda kopyalanmasına izin verilmiyor, ancak girdiyi bağımsız değişken olarak alabilen bir işlev tamam. Örn f=:your_function_code.
randomra

2

Julia, 77 74 bayt

t=readline();length(join(t∩"#0469@ADOPQRabdegopq")*join(t∩"\$%&8B")^2)

Bu, STDIN'den metin okur ve sonucu STDOUT'a yazdırır.

Ungolfed + açıklaması:

# Read text from STDIN
t = readline()

# Print (implied) to STDOUT the length of the intersection of t with the
# 1-closed counter list joined with the duplicated intersection of t with
# the 2-closed counter list
length(join(t ∩ "#0469@ADOPQRabdegopq") * join(t ∩ "\$%&8B")^2)

Misal:

julia> t=readline();length(join(t∩"#0469@ADOPQRabdegopq")*join(t∩"\$%&8B")^2)
Programming Puzzles and Code Golf
13


2

GNU APL, 37 karakter

+/,⍞∘.=30⍴'$%&8B#0469@ADOPQRabdegopq'

2 sayaçlı karakterleri iki kez içeren bir karakter vektörü oluşturun (30⍴)

her girdi karakterini vektördeki her karakterle karşılaştırın (∘. =)

ravelled maçları özetle (+ /,)


1

Javascript 159 , 130 Bayt

function c(b){return b.split("").map(function(a){return-1!="$%&8B".indexOf(a)?2:-1!="#0469@ADOPQRabdegopq".indexOf(a)?1:0}).reduce(function(a,b){return a+b})};

unminified:

function c(b) {
    return b.split("").map(function(a) {
        return -1 != "$%&8B".indexOf(a) ? 2 : -1 != "#0469@ADOPQRabdegopq".indexOf(a) ? 1 : 0
    }).reduce(function(a, b) {
        return a + b
    })
};

@ Edc65 yardımıyla:

function c(b){return b.split('').reduce(function(t,a){return t+(~"$%&8B".indexOf(a)?2:~"#0469@ADOPQRabdegopq".indexOf(a)?1:0)},0)}

2
Bunun yerine, ~ -1 == 0yazabilirsiniz . Kullanım örneği için bana cevap ver. ~x?-1 != x?
edc65

2
function c(b){return b.split('').reduce(function(t,a){return t+(~"$%&8B".indexOf(a)?2:~"#0469@ADOPQRabdegopq".indexOf(a)?1:0)},0)}Gerek yok mapo zamanreduce
edc65

1

Haskell, 117

a="#0469@ADOPQRabdegopq"
b="$%&8B"
c n[]=n
c n(x:s)
 |e a=f 1
 |e b=f 2
 |True=f 0
 where
 e y=x`elem`y
 f y=c(n+y)s

c bir fonksiyondur c :: Int -> String -> Int sayaç ve bir dize alan ve geçerli harfin 1 nokta dizisinin veya 2 nokta dizisinin bir üyesi olup olmadığını kontrol eden ve arttırmadan sonra dizenin geri kalanı için kendisini çağıran bir dizede bir harf geçen sayaç uygun miktarda.

Ghci'de sayaç = 0 olan çağrı:

ghci> c 0 "All your base are belong to us"
12

1

C #, 157

void Main(string s){int v=0;v=s.ToCharArray().Count(c=>{return "#0469@ADOPQRabdegopq".Contains(c)||"$%&8B".Contains(c)?++v is int:false;});Console.Write(v);}

Ungolfed:

void Main(string s)
{
    int v = 0;

    v = s.ToCharArray()
    .Count(c => 
    {
        return "#0469@ADOPQRabdegopq".Contains(c) || "$%&8B".Contains(c) ? ++v is int:false;
    });

    Console.Write(v);
}

Dizeyi bir char dizisine dönüştürme, ardından her bir karakterin herhangi bir sayaçta olup olmadığını görün. Eğer ikincisinde ise, sadece sayacı tekrar artırmasını istiyorum.


1

Erlang, 103 bayt

Bu escript kullanarak çalışan tam bir programdır. Dosyanın ilk satırı boş olmalıdır (1 bayt ekleyerek).

main([L])->io:write(c(L,"#0469@ADOPQRabdegopq")+2*c(L,"$%&8B")).
c(L,S)->length([X||X<-L,S--[X]/=S]).

Örnek çalışma:

$ escript closed.erl 'Shortest answer in bytes is the winner!'
8$

PPCG'ye hoş geldiniz, c (L, "# 0469 @ ADOPQRabdegopq") + 2 * c (L, "$% & 8B") c'den (L, "# 0469 @ ADOPQRabdegopq $% & 8B $% & 8B") 5'ten daha uzun bayt :).
Katenkyo

@ Katyenko, öneri için teşekkürler. Ne yazık ki, bazı girdiler için düzgün çalışmıyor. "$% & 8B" 5 için sayılır, ancak 10 olmalıdır. C / 2 işlevi, "$% & 8B" gibi bir karakter dizisine ait olmayan dizenin karakterlerini filtreleyerek çalışır. Test edilecek karakter setten silinip sonucu orijinal set ile karşılaştırarak set içerme durumunu kontrol eder. Eşit değillerse, karakter kümedeydi ve dahil edildi. Setteki karakterlerin birden fazla kopyasının herhangi bir etkisi yoktur.
Edwin Fine

Ho, anladım, erlang bilmiyorum, sayacı saymak için bir ip kullandığınızı düşünüyordum: 3. Her neyse, boşver ve aferin :)
Katenkyo

0

C, 99 bayt

n;f(char*i){for(char*o="#0469@ADOPQRabdegopq$%&8B",*t=o+20;*i;)n+=2-!strchr(o,*i)-!strchr(t,*i++);}

açıklama

Ayrıca Cool Guy'ın cevabını golf oynadım ; yorum yapmak çok uzun sürdü. Yerine if/ else, ı yararlandı !bool bir işaretçi dönüştürülmesi. Ben de odahil t"ekledi o" ve " ekleyebilir" dahil yaptıt toplam sayaç sayısı için .

Genişletilmiş kod

#include <string.h>
int num = 0;

void f(char* input)
{
    char *one = "#0469@ADOPQRabdegopq"  "$%&8B";
    char *two = strchr(one, '$');

    while (*input) {
        num += 2 - !strchr(one, *input) - !strchr(two, *input));
        ++input;
    }
}

Çıktı num her aramadan önce silinmesi gereken giriştedir.

Test programı ve sonuçları

#include <stdio.h>
int main() {
    const char* a[] = {
        "Programming Puzzles and Code-Golf",
        "4 8 15 16 23 42",
        "All your base are belong to us",
        "Standard loopholes apply",
        "Shortest answer in bytes is the winner!",
        NULL
    };
    for (const char** p = a;  *p;  ++p) {
        n=0;f(*p);
        printf("%3d: %s\n", n, *p);
    }
    return 0;
}
 13: Programming Puzzles and Code-Golf
  5: 4 8 15 16 23 42
 12: All your base are belong to us
 12: Standard loopholes apply
  8: Shortest answer in bytes is the winner!
 37: n;f(char*i){for(char*o="#0469@ADOPQRabdegopq$%&8B",*t=o+20;*i;)n+=2-!strchr(o,*i)-!strchr(t,*i++);}

Kodun kendisi, kendi metriğine göre 37 sayaç içerir.

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.