Counter counter


18

En typographie, un compteur est l'aire d'une lettre qui est entièrement ou partiellement entourée d'une forme de lettre ou d'un symbole. Un compteur fermé est un compteur entièrement entouré d'une lettre ou d'un symbole. Vous devez écrire un programme prend une chaîne en entrée et imprime le nombre total de compteurs fermés dans le texte.

Votre contribution:

  • Il peut s'agir d'une entrée de ligne de commande ou de STDIN, mais vous devez spécifier laquelle.

  • Comprendra entièrement les caractères ASCII imprimables, c'est-à-dire toutes les valeurs ASCII comprises entre 32 et 126 inclus. Cela inclut les espaces. Plus d'information.

Maintenant, cela varie légèrement entre les polices. Par exemple, la police dans laquelle vous lisez ceci considère que «g» a un compteur fermé, tandis que la police Google a «g» avec deux compteurs fermés. Pour que ce ne soit pas un problème, voici le nombre officiel de compteurs fermés par personnage.

Tous les symboles sans compteurs fermés:

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

Notez que cela inclut l'espace.

Voici tous les symboles avec un compteur fermé:

#0469@ADOPQRabdegopq

Et voici tous les symboles avec 2 compteurs fermés:

$%&8B

Enfin, voici quelques exemples d'entrées et de sorties.

Programming Puzzles and Code-Golf devrait imprimer 13

4 8 15 16 23 42 devrait imprimer 5

All your base are belong to us devrait imprimer 12

Standard loopholes apply devrait imprimer 12

Shortest answer in bytes is the winner! devrait imprimer 8


1
Deux réponses ont soumis des fonctions au lieu de programmes complets. Bien que cela soit autorisé par défaut, votre formulation suggère le contraire. Pourriez-vous clarifier?
Dennis

Pourriez-vous divulguer la façon dont vous avez utilisé pour compter les compteurs?
Martin Ender

3
Aucune des polices dans lesquelles je vois la question ne correspond aux chiffres que vous avez donnés. Par exemple, dans le navigateur, le zéro est barré d'une diagonale, ce qui donne deux compteurs. La police dans l'application Android ne le fait pas, mais ici, elle ga deux compteurs fermés. Avez-vous déterminé les compteurs en fonction d'une police particulière?
Martin Ender

1
@DJMcMayhem 'g' a 1; bien qu'indiqué dans le code, ga 2. Légèrement déroutant à lire, mais je ne pense pas que ce soit différent selon l'emplacement.
OJFord

1
N'a pas 02 compteurs fermés dans certaines polices, en particulier de nombreuses polices monospace?
vsz

Réponses:


10

Pyth, 31 octets

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

Manifestation.

Notez que le code peut ne pas s'afficher correctement en raison de l'utilisation de caractères non ASCII. Le bon code se trouve sur le lien.

J'ai fait une table de recherche de la sortie souhaitée pour chaque caractère d'entrée, l'ai tournée de 32 pour utiliser l'indexation modulaire de Pyth, ai collé un 1 au début et l'ai interprété comme un nombre de base 3, donnant le nombre 2229617581140564569750295263480330834137283757. J'ai ensuite converti ce nombre en base 256 et l'ai converti en chaîne, qui est la chaîne utilisée dans la réponse.


29

Python 3, 63

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

Une approche simple. Itère sur chaque personnage avec un compteur fermé, sommant le nombre d'occurrences, le faisant deux fois pour les personnages avec deux compteurs fermés. Ce serait la même longueur pour écrire à la place

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

Python 3 est nécessaire pour éviter raw_input.


12

CJam, 41 39 37 34 octets

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

Merci à @ jimmy23013 pour avoir joué au golf sur 3 octets!

Essayez-le en ligne.

Comment ça fonctionne

"$%&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: J'avais essayé quelques variantes de euet el, mais je n'ai jamais trouvé ça. Merci!
Dennis

8

sed, 51

Avec l'aide au golf de @manatwork et @TobySpeight:

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

Entrée de STDIN. Avec cette méta-question à l'esprit , la sortie est unaire:

$ 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

41caractères +1 pour le -pdrapeau.

Cela utilise y /// pour compter les caractères.

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

6

GNU APL, 39 octets

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

Essayez en ligne dans GNU APL.js .

Comment ça fonctionne

                                      ⍞ 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

E / S via popup. Exécutez l'extrait dans tout d navigateur récent de test.

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 octets

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

Coupez 5 octets grâce à @JohnE!

Ancienne version:

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

Original:

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

L' #&intérieur des parens pourrait tout aussi bien être +/, ce qui signifie que vous pourriez aller plus loin +//"#0469@ADOPQRabdegopq$%&8B$%&8B"=\:. Enfin, il n'est pas nécessaire de l'avoir f:car la fonction peut être utilisée sous forme tacite. Cela vous ramènerait à 38!
JohnE

Malheureusement , l'astuce quelques autres solutions ont utilisé pour compacter la table de recherche sort mort même avec la solution de 38 octets en cours: +//(30#"$%&8B#0469@ADOPQRabdegopq")=\:. C'est peut-être le mieux que nous puissions faire.
JohnE

haha, à peine ai-je +//(30#"$%&8B#0469@ADOPQRabdegopq"=)'
posté

5

C, 127 octets

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

Assez simple. Version non golfée:

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

Testez-le ici

Si les arguments de fonction ne sont pas autorisés, la stdinversion prend jusqu'à 141 octets:

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

Notez que la version ci-dessus suppose que l'entrée comporte au maximum 98 caractères.

Testez-le ici

Version des arguments de ligne de commande (143 octets):

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

Testez-le ici


1
@DJMcMayhem C n'est vraiment pas si mal. Essayez de jouer au golf à Fortran 77.;)
Alex A.

5

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

Je ne peux pas penser à une autre façon de faire cela ... c'est ce que j'aurais pensé jusqu'à ce que je voie la solution de xnor. Je posterai de toute façon ce que j'avais.

Merci à FryAmTheEggman pour avoir économisé 6 octets

D'accord, maintenant j'en suis satisfait.

Merci à xnor pour la recherche, économisant 4 octets.

Ajout de deux octets car l'entrée doit être placée entre guillemets.

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

1
J'aime l'utilisation intelligente des index! De plus, python 3 est un peu plus court car il utilise l'entrée au lieu de raw_input.
DJMcMayhem


Oh je vois. Désolé, je l'ai combiné avec le commentaire Python 3 de @ DJMcMayhem.
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());}}

Eh bien , si elle a être un programme complet ... C'est juste une ligne qui correspond aux caractères et les remplace par une chaîne plus longue. Retourne ensuite la différence de longueur par rapport à l'original. Malheureusement, java n'a vraiment rien pour compter le nombre de correspondances.

Le voici avec des sauts de ligne:

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 octets

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

Merci à Ismael Miguel de m'avoir aidé à jouer au golf.


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

Désolé d'avoir mal compté. Oui, c'est 95.
Ismael Miguel

3

Rubis, 59 octets

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

Entrée depuis la ligne de commande ou stdin. Jusqu'à présent, le plus court utilise un langage non ésotérique.

Mise à jour: chilemagic m'a battu


3

Rétine , 44 octets

1

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

Donne la sortie en unaire.

Chaque ligne doit aller dans son propre fichier ou vous pouvez utiliser l' -sindicateur. Par exemple:

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

Les paires de lignes (motif - paires de substitution) effectuent les étapes de substitution suivantes:

  • Retirer 1 les
  • Remplacez 1 contre-lettre par 1
  • Remplacez 2 contre-lettres par 11
  • Retirez tout sauf les 1« s

3

J, 43

En tant que fonction:

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

46 octets (ligne de commande)

En tant que programme de ligne de commande autonome:

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

Enregistrez la ligne ci-dessus sous counter2.ijset appelez à partir de la ligne de commande:

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

Le copier-coller de l'entrée dans le code n'est pas autorisé mais une fonction qui peut prendre l'entrée en argument est correcte. Par exemple f=:your_function_code.
randomra

2

Julia, 77 74 octets

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

Cela lit le texte de STDIN et imprime le résultat dans STDOUT.

Non golfé + explication:

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

Exemple:

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

2

rs , 56 octets

_/
[#0469@ADOPQRabdegopq]/_
[$%&8B]/__
[^_]/
(_+)/(^^\1)

Démo en direct.


Juste un fyi: j'ai créé une page de stub esolangs pour rs. Vous voudrez peut-être y ajouter: esolangs.org/wiki/Rs
mbomb007

@ mbomb007 WOW !! Cela vient de faire ma journée. : D
kirbyfan64sos

Eh bien, "rs" n'apparaît pas dans Google ou quoi que ce soit puisqu'il ne s'agit que de deux lettres. De cette façon, les gens peuvent le trouver. :)
mbomb007

2

GNU APL, 37 caractères

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

construire un vecteur de caractères contenant deux fois 2 caractères (30⍴)

comparer chaque caractère d'entrée avec chaque caractère du vecteur (∘. =)

résumer les matchs ravelés (+ /,)


1

Javascript 159 , 130 octets

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

non minifié:

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

Avec l'aide de @ 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
Comme ~ -1 == 0, vous pouvez écrire à la ~x?place de -1 != x?. Voir ma réponse pour un exemple d'utilisation.
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)}Pas besoin d'avoir mapalorsreduce
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 est une fonction c :: Int -> String -> Int qui prend un compteur et une chaîne et parcourt la chaîne une lettre à la fois pour vérifier si la lettre actuelle est membre du tableau à 1 point ou du tableau à 2 points et s'appelle pour le reste de la chaîne après incrémentation le compteur le montant approprié.

Appel avec compteur = 0 en 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);}

Non golfé:

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

Convertir la chaîne en un tableau de caractères, puis voir si chaque caractère se trouve dans l'un ou l'autre des compteurs. Si c'est dans le second, je viens de l'incrémenter à nouveau.


1

Erlang, 103 octets

Il s'agit d'un programme complet qui s'exécute en utilisant escript. La première ligne du fichier doit être vide (en ajoutant 1 octet).

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

Exemple d'exécution:

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

Bienvenue sur PPCG, c (L, "# 0469 @ ADOPQRabdegopq") + 2 * c (L, "$% & 8B") est plus long que c (L, "# 0469 @ ADOPQRabdegopq $% & 8B $% & 8B") par 5 octets :).
Katenkyo

@Katyenko, merci pour la suggestion. Malheureusement, cela ne fonctionne pas correctement pour certaines entrées. "$% & 8B" compte pour 5, mais devrait être 10. La fonction c / 2 fonctionne en filtrant les caractères de la chaîne qui n'appartiennent pas à un ensemble de caractères, tels que "$% & 8B". Il vérifie l'inclusion de l'ensemble en supprimant le caractère à tester de l'ensemble, puis en comparant le résultat avec l'ensemble d'origine. S'ils ne sont pas égaux, le caractère était dans l'ensemble et il est inclus. Plusieurs copies de caractères dans l'ensemble n'ont aucun effet.
Edwin Fine

Ho, je vois, je ne sais pas erlang, pensais que tu utilisais une chaîne pour compter le compteur: 3. Quoi qu'il en soit, peu importe, et bien joué :)
Katenkyo

0

C, 99 octets

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

Explication

J'ai encore joué à la réponse de Cool Guy ; c'est devenu trop long pour être un commentaire. Au lieu de if/ else, j'ai profité de la !conversion d'un pointeur en bool. J'ai également fait oinclure tafin que je puisse ajouter "est dans o" et "est danst " pour le nombre total de compteurs.

Code développé

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

La sortie est en num , qui doit être effacée avant chaque appel.

Programme de test et résultats

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

Le code lui-même contient 37 compteurs par sa propre métrique.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.