Counter counter


18

Dalam tipografi, penghitung adalah area surat yang seluruhnya atau sebagian tertutup oleh bentuk huruf atau simbol. Counter tertutup adalah counter yang seluruhnya tertutup oleh bentuk huruf atau simbol. Anda harus menulis sebuah program mengambil string sebagai input dan mencetak jumlah total penghitung yang ditutup dalam teks.

Masukan Anda:

  • Mungkin input baris perintah, atau dari STDIN, tetapi Anda harus menentukan yang mana.

  • Akan sepenuhnya terdiri dari karakter ASCII yang dapat dicetak, yang berarti semua nilai ASCII antara 32 dan 126 inklusif. Ini termasuk spasi. Informasi lebih lanjut

Sekarang, ini sedikit berbeda antar font. Misalnya, font yang Anda baca ini menganggap 'g' memiliki satu penghitung tertutup, sedangkan font google memiliki 'g' dengan dua penghitung tertutup. Agar ini bukan masalah, berikut adalah jumlah resmi penghitung tertutup per karakter.

Semua simbol tanpa penghitung tertutup:

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

Perhatikan bahwa ini termasuk ruang.

Berikut semua simbol dengan satu penghitung tertutup:

#0469@ADOPQRabdegopq

Dan di sini ada semua simbol dengan 2 penghitung tertutup:

$%&8B

Dan yang tak kalah pentingnya, berikut adalah beberapa contoh input dan output.

Programming Puzzles and Code-Golf harus dicetak 13

4 8 15 16 23 42 harus dicetak 5

All your base are belong to us harus dicetak 12

Standard loopholes apply harus dicetak 12

Shortest answer in bytes is the winner! harus dicetak 8


1
Dua jawaban telah mengirimkan fungsi alih-alih program lengkap. Meskipun itu diizinkan secara default, kata-kata Anda menyarankan sebaliknya. Bisakah Anda mengklarifikasi?
Dennis

Maukah Anda mengungkapkan mana yang Anda gunakan untuk menghitung counter?
Martin Ender

3
Tak satu pun dari font yang saya lihat pertanyaan sesuai dengan jumlah yang Anda berikan. Misalnya di browser, nol memiliki garis miring diagonal, memberikan dua counter. Fon di aplikasi android tidak, tetapi di sini gmemiliki dua penghitung tertutup. Apakah Anda menentukan penghitung berdasarkan font tertentu?
Martin Ender

1
@DJMcMayhem 'g' memiliki 1; meskipun di mana tercantum dalam kode, gmemiliki 2. Sedikit membingungkan untuk dibaca, tapi saya tidak berpikir itu berbeda dengan lokasi.
OJFord

1
Tidak 0memiliki 2 penghitung tertutup dalam font tertentu, terutama banyak font monospace?
vsz

Jawaban:


10

Pyth, 31 byte

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

Demonstrasi.

Perhatikan bahwa kode mungkin tidak ditampilkan dengan benar karena penggunaan karakter non-ASCII. Kode yang benar ada di tautan.

Saya membuat tabel pencarian dari output yang diinginkan untuk setiap karakter input, memutarnya dengan 32 untuk menggunakan pengindeksan modular Pyth, terjebak 1 di awal, dan menafsirkannya sebagai basis 3 nomor, memberikan nomor 2229617581140564569750295263480330834137283757. Saya kemudian mengonversi angka ini ke basis 256 dan mengonversinya menjadi string, yang merupakan string yang digunakan dalam jawabannya.


29

Python 3, 63

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

Pendekatan langsung. Iterasi setiap karakter dengan penghitung tertutup, jumlahkan jumlah kemunculannya, lakukan dua kali untuk karakter dengan dua penghitung tertutup. Itu akan menjadi panjang yang sama untuk menulis

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

Python 3 diperlukan untuk menghindari raw_input.


12

CJam, 41 39 37 34 byte

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

Terima kasih kepada @ jimmy23013 untuk bermain golf 3 byte!

Cobalah online.

Bagaimana itu bekerja

"$%&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: Saya telah mencoba beberapa variasi eudan el, tetapi saya tidak pernah menemukan itu. Terima kasih!
Dennis

8

sed, 51

Dengan bantuan golf dari @manatwork dan @TobySpeight:

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

Masukan dari STDIN. Dengan mengingat meta-pertanyaan ini , hasilnya tidak sama:

$ 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

41karakter +1 untuk -pbendera.

Ini menggunakan y /// untuk menghitung karakter.

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

6

GNU APL, 39 byte

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

Cobalah secara online di GNU APL.js .

Bagaimana itu bekerja

                                      ⍞ 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

I / O melalui sembulan. Jalankan cuplikan di d browser terbaru apa saja untuk menguji.

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 byte

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

Potong 5 byte berkat @JohnE!

Versi yang lebih lama:

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

Asli:

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

Bagian #&dalamnya bisa dengan mudah +/, yang berarti Anda bisa melangkah lebih jauh +//"#0469@ADOPQRabdegopq$%&8B$%&8B"=\:. Akhirnya, tidak perlu memiliki f:karena fungsi dapat digunakan dalam bentuk diam-diam. Itu akan membawa Anda ke 38!
JohnE

Sayangnya trik beberapa solusi lain telah digunakan untuk kompak tabel keluar mati bahkan dengan solusi 38 byte saat ini: +//(30#"$%&8B#0469@ADOPQRabdegopq")=\:. Ini mungkin yang terbaik yang bisa kita lakukan.
JohnE

haha, tidak lama saya memposting itu daripada saya menyelamatkan karakter:+//(30#"$%&8B#0469@ADOPQRabdegopq"=)'
JohnE

5

C, 127 byte

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

Cukup mudah. Versi tidak disatukan:

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

Uji di sini

Jika argumen fungsi tidak diizinkan, maka stdinversi tersebut membutuhkan hingga 141 byte:

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

Perhatikan bahwa versi di atas mengasumsikan bahwa input paling panjang 98 karakter.

Uji di sini

Versi argumen baris perintah (143 byte):

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

Uji di sini


1
@DJMcMayhem C benar-benar tidak seburuk itu. Cobalah bermain golf di Fortran 77.;)
Alex A.

5

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

Tidak dapat memikirkan cara lain untuk melakukan ini ... adalah apa yang akan saya pikirkan sampai saya melihat solusi xnor. Saya akan memposting apa yang saya miliki.

Terima kasih kepada FryAmTheEggman karena telah menghemat 6 byte

Baiklah, sekarang saya senang dengan ini.

Terima kasih kepada xnor untuk trik menemukan, menghemat 4 byte.

Menambahkan dua byte karena input harus dilampirkan dalam tanda kutip.

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

1
Saya suka penggunaan indeks yang cerdas! Juga, python 3 sedikit lebih pendek karena menggunakan input daripada raw_input.
DJMcMayhem


Oh begitu. Maaf, saya mengombinasikannya dengan komentar @ DJMcMayhem's Python 3.
manatwork

4

Jawa, 162

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

Nah kalau sudah menjadi program penuh ... Ini hanya satu-kapal yang pertandingan karakter dan menggantikan mereka dengan string lagi. Kemudian, kembalikan perbedaan panjang dari yang asli. Sayangnya, java tidak benar-benar memiliki apa-apa untuk hanya menghitung jumlah pertandingan.

Ini dia dengan jeda baris:

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

4

Pyth - 35 byte

Menggunakan metode yang jelas dalam + pertama * 2 dalam detik. Terima kasih @FryTheEggman.

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

Coba di sini online .


4

Javascript, 114 95 byte

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

Terima kasih kepada Ismael Miguel karena membantu saya bermain golf ini.


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

Maaf karena menghitung dengan buruk. Ya, ini 95.
Ismael Miguel

3

Ruby, 59 byte

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

Masukan dari baris perintah atau stdin. Terpendek sejauh ini menggunakan bahasa non-esoterik.

Perbarui: chilemagic mengalahkan saya


3

Retina , 44 byte

1

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

Memberikan output secara unary.

Setiap baris harus menuju ke file sendiri atau Anda dapat menggunakan -sbendera. Misalnya:

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

Pasangan garis (pola - pasangan pengganti) melakukan langkah-langkah substitusi berikut:

  • Hapus 1's
  • Mengganti 1-counter surat dengan 1
  • Mengganti 2-counter surat dengan 11
  • Hapus segala sesuatu tetapi 1's

3

J, 43

Sebagai fungsi:

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

46 byte (baris perintah)

Sebagai program baris perintah mandiri:

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

Simpan baris di atas sebagai counter2.ijsdan panggil dari baris perintah:

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

Menyalin-menempelkan input ke dalam kode tidak diizinkan tetapi fungsi yang dapat mengambil input sebagai argumen tidak masalah. Misalnya f=:your_function_code.
randomra

2

Julia, 77 74 byte

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

Ini membaca teks dari STDIN dan mencetak hasilnya ke STDOUT.

Penjelasan + tidak dikumpulkan:

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

Contoh:

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'

membangun vektor karakter yang berisi karakter 2-counter dua kali (30⍴)

bandingkan setiap karakter input dengan setiap karakter dalam vektor (∘. =)

jumlah pertandingan yang terurai (+ /,)


1

Javascript 159 , 130 Bytes

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

tidak dijinakkan:

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

Dengan bantuan @ edc65:

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

2
Sebagai ~ -1 == 0, Anda dapat menulis ~x?alih-alih -1 != x?. Lihat saya menjawab untuk contoh penggunaan.
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)}Tidak perlu memiliki mapkemudianreduce
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 adalah fungsi c :: Int -> String -> Intyang mengambil penghitung dan string dan melewati string satu huruf pada suatu waktu memeriksa apakah huruf saat ini adalah anggota dari array 1 point atau array 2 point dan memanggil dirinya sendiri untuk sisa string setelah penambahan menghitung jumlah yang sesuai.

Panggilan dengan penghitung = 0 dalam ghci:

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

Tidak Disatukan:

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

Mengubah string menjadi array char, lalu melihat apakah masing-masing char ada di counter. Jika ada di yang kedua, saya hanya perlu menambah counter lagi.


1

Erlang, 103 byte

Ini adalah program lengkap yang berjalan menggunakan eskrip. Baris pertama file harus kosong (menambahkan 1 byte).

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

Contoh dijalankan:

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

Selamat datang di PPCG, c (L, "# 0469 @ ADOPQRabdegopq") + 2 * c (L, "$% & 8B") lebih panjang dari c (L, "# 0469 @ ADOPQRabdegopq $% & 8B $% & 8B") oleh 5 byte :).
Katenkyo

@ Katyenko, terima kasih atas sarannya. Sayangnya itu tidak berfungsi dengan benar untuk input tertentu. "$% & 8B" berarti 5, tetapi harus 10. Fungsi c / 2 bekerja dengan memfilter karakter chars dari string yang bukan milik serangkaian chars, seperti "$% & 8B". Ia memeriksa penyertaan set dengan menghapus char untuk diuji dari set, kemudian membandingkan hasilnya dengan set asli. Jika mereka tidak sama, maka arang berada di set, dan itu termasuk. Beberapa salinan karakter di set tidak memiliki efek apa pun.
Edwin Fine

Ho, saya mengerti, saya tidak tahu erlang, berpikir Anda menggunakan string untuk menghitung penghitung: 3. Pokoknya, tidak masalah, dan dilakukan dengan baik :)
Katenkyo

0

C, 99 byte

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

Penjelasan

Saya lebih lanjut menerangkan jawaban dari Cool Guy ; terlalu lama untuk menjadi komentar. Alih-alih if/ else, saya mengambil keuntungan dari !mengkonversi pointer ke bool. Saya juga membuat oinclude tagar saya bisa menambahkan "is in o" dan "is int " untuk jumlah total penghitung.

Kode diperluas

#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;
    }
}

Output dalam num , yang harus dibersihkan sebelum setiap panggilan.

Program uji dan hasil

#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++);}

Kode itu sendiri berisi 37 penghitung dengan metriknya sendiri.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.