Contador

18

En tipografía, un contador es el área de una letra que está total o parcialmente encerrada por una forma de letra o un símbolo. Un contador cerrado es un contador que está completamente encerrado por una letra o símbolo. Debe escribir un programa toma una cadena como entrada e imprime el número total de contadores cerrados en el texto.

Tu aportación:

  • Puede ser una entrada de línea de comando, o de STDIN, pero debe especificar cuál.

  • Consistirá completamente en los caracteres ASCII imprimibles, lo que significa que todos los valores ASCII entre 32 y 126 inclusive. Esto incluye espacios. Más información.

Ahora, esto varía ligeramente entre las fuentes. Por ejemplo, la fuente en la que está leyendo esto considera que 'g' tiene un contador cerrado, mientras que la fuente de google tiene 'g' con dos contadores cerrados. Para que esto no sea un problema, aquí está el número oficial de contadores cerrados por personaje.

Todos los símbolos sin contadores cerrados:

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

Tenga en cuenta que esto incluye el espacio.

Aquí están todos los símbolos con un contador cerrado:

#0469@ADOPQRabdegopq

Y aquí están todos los símbolos con 2 contadores cerrados:

$%&8B

Y por último pero no menos importante, aquí hay algunas entradas y salidas de muestra.

Programming Puzzles and Code-Golf debería imprimir 13

4 8 15 16 23 42 debería imprimir 5

All your base are belong to us debería imprimir 12

Standard loopholes apply debería imprimir 12

Shortest answer in bytes is the winner! debería imprimir 8

DJMcMayhem
fuente
1
Dos respuestas han enviado funciones en lugar de programas completos. Si bien eso está permitido por defecto, su redacción sugiere lo contrario. ¿Podrías aclarar?
Dennis
¿Te importaría revelar qué actividad usaste para contar los contadores?
Martin Ender
3
Ninguna de las fuentes en las que estoy viendo la pregunta corresponde a los recuentos que ha proporcionado. Por ejemplo, en el navegador, el cero tiene una barra diagonal a través de él, dando dos contadores. La fuente en la aplicación de Android no, pero aquí gtiene dos contadores cerrados. ¿Determinó los contadores en función de alguna fuente en particular?
Martin Ender
1
@DJMcMayhem 'g' tiene 1; aunque donde aparece en el código, gtiene 2. Ligeramente confuso de leer, pero no creo que sea diferente por ubicación.
OJFord
1
¿No 0tiene 2 contadores cerrados en ciertas fuentes, especialmente muchas fuentes monoespaciales?
vsz

Respuestas:

10

Pyth, 31 bytes

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

Demostración.

Tenga en cuenta que el código puede no mostrarse correctamente debido al uso de caracteres no ASCII. El código correcto está en el enlace.

Hice una tabla de búsqueda de la salida deseada para cada carácter de entrada, la giré 32 para hacer uso de la indexación modular de Pyth, pegué un 1 al principio, y lo interpreté como un número base 3, dando el número 2229617581140564569750295263480330834137283757. Luego convertí este número a base 256 y lo convertí en una cadena, que es la cadena utilizada en la respuesta.

isaacg
fuente
29

Pitón 3, 63

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

Un enfoque directo. Itera sobre cada personaje con un contador cerrado, sumando el número de ocurrencias, haciéndolo dos veces para los personajes con dos contadores cerrados. Sería de la misma longitud escribir en su lugar

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

Python 3 es necesario para evitar raw_input.

xnor
fuente
12

CJam, 41 39 37 34 bytes

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

¡Gracias a @ jimmy23013 por jugar golf 3 bytes!

Pruébalo en línea.

Cómo funciona

"$%&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).
Dennis
fuente
2
"$%&8Badopq#0469@Rbeg"_A<eu+.
jimmy23013
@ jimmy23013: Intenté algunas variaciones de euy el, pero nunca encontré eso. ¡Gracias!
Dennis
8

sed, 51

Con la ayuda de golf de @manatwork y @TobySpeight:

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

Entrada de STDIN. Con esta metapregunta en mente , el resultado es unario:

$ 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
$ 
Trauma digital
fuente
7

Perl, 41

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

41caracteres +1 para la -pbandera.

Esto usa y /// para contar los caracteres.

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

GNU APL, 39 bytes

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

Pruébelo en línea en APL.js GNU .

Cómo funciona

                                      ⍞ 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.
Dennis
fuente
6

JavaScript, 86

E / S a través de una ventana emergente. Ejecute el fragmento en cualquier navegador reciente d para probar.

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

edc65
fuente
6

K, 54 43 42 37 bytes

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

¡Corte 5 bytes gracias a @JohnE!

Versión antigua:

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

Original:

f:+/{2-(5="$%&8B"?x;20="#0469@ADOPQRabdegopq"?x;0)?0}'
kirbyfan64sos
fuente
El #&interior de los parens podría ser tan fácil +/, lo que significa que podría ir más allá +//"#0469@ADOPQRabdegopq$%&8B$%&8B"=\:. Finalmente, no es necesario tener el f:ya que la función se puede usar en forma tácita. ¡Eso te llevaría a 38!
JohnE
Por desgracia, el truco algunas otras soluciones han empleado para compactar la tabla de consulta salga muertos, incluso con la solución de 38 bytes actual: +//(30#"$%&8B#0469@ADOPQRabdegopq")=\:. Esto puede ser lo mejor que podemos hacer.
JohnE
jaja, apenas +//(30#"$%&8B#0469@ADOPQRabdegopq"=)'
publiqué
5

C, 127 bytes

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

Muy claro. Versión sin golf:

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

Pruébalo aquí

Si los argumentos de la función no están permitidos, la stdinversión ocupa hasta 141 bytes:

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

Tenga en cuenta que la versión anterior supone que la entrada tiene una longitud máxima de 98 caracteres.

Pruébalo aquí

Versión de argumentos de línea de comandos (143 bytes):

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

Pruébalo aquí

Spikatrix
fuente
1
@DJMcMayhem C realmente no es tan malo. Intente jugar al golf en Fortran 77.;)
Alex A.
5

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

No se me ocurre otra forma de hacer esto ... es lo que habría pensado hasta que vi la solución de xnor. Publicaré lo que tenía de todos modos.

Gracias a FryAmTheEggman por guardar 6 bytes

Muy bien, ahora estoy feliz con esto.

Gracias a xnor por el truco de búsqueda, ahorrando 4 bytes.

Se agregaron dos bytes ya que la entrada debe estar entre comillas.

print sum('#0469@ADOPQRabdegopq$%&8B'.find(x)/20+1for x in input())
Kade
fuente
1
¡Me gusta el uso inteligente de los índices! Además, python 3 es un poco más corto porque usa input en lugar de raw_input.
DJMcMayhem
Oh ya veo. Lo siento, lo combiné con el comentario de @ DJMcMayhem Python 3.
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());}}

Bueno si tiene que ser un programa completo ... Es solo una línea que coincide con los caracteres y los reemplaza con una cadena más larga. Luego, devuelve la diferencia en longitud del original. Desafortunadamente, Java realmente no tiene nada para contar la cantidad de partidos.

Aquí está con saltos de línea:

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

Pyth - 35 bytes

Utiliza el método obvio de in first + * 2 in second. Gracias @FryTheEggman.

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

Pruébalo aquí en línea .

Maltysen
fuente
4

Javascript, 114 95 bytes

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

Gracias a Ismael Miguel por ayudarme a jugar golf.

SuperJedi224
fuente
2
93 bytes:alert(prompt().replace(/[#046@ADOPQRabdegopq]/g,9).replace(/[$%&8B]/g,99).match(/9/g).length)
Ismael Miguel
Perdón por contar mal. Sí, es 95.
Ismael Miguel
3

Ruby, 59 bytes

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

Entrada desde la línea de comando o stdin. Más corto hasta ahora utilizando un lenguaje no esotérico.

Actualización: chilemagic me ganó

David Bailey
fuente
3

Retina , 44 bytes

1

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

Da salida en unario.

Cada línea debe ir a su propio archivo o puede usar la -sbandera. P.ej:

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

Los pares de líneas (patrón - pares sustitutos) realizan los siguientes pasos de sustitución:

  • Retire 1's
  • Sustituir letras de 1 contador con 1
  • Sustituir letras de 2 contadores con 11
  • Eliminar todo menos el 1's
randomra
fuente
3

J, 43

Como una función:

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

46 bytes (línea de comando)

Como un programa de línea de comandos independiente:

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

Guarde la línea anterior como counter2.ijsy llame desde la línea de comando:

$ jconsole counter2.ijs 'Programming Puzzles and Code Golf'
13
hoosierEE
fuente
Copiar y pegar la entrada en el código no está permitido, pero una función que puede tomar la entrada como argumento está bien. Por ej f=:your_function_code.
randomra
2

Julia, 77 74 bytes

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

Esto lee el texto de STDIN e imprime el resultado en STDOUT.

Ungolfed + explicación:

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

Ejemplo:

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

rs , 56 bytes

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

Demo en vivo.

kirbyfan64sos
fuente
Solo para tu información: creé una página de stub esolangs para rs. Es posible que desee agregarle: esolangs.org/wiki/Rs
mbomb007
@ mbomb007 ¡GUAU! Eso me alegró el día. : D
kirbyfan64sos
Bueno, "rs" no aparece en Google ni nada, ya que son solo dos letras. De esta manera, la gente puede encontrarlo. :)
mbomb007
2

GNU APL, 37 caracteres

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

construya un vector de caracteres que contenga dos caracteres de dos contadores dos veces (30⍴)

compare cada carácter de entrada con cada carácter en el vector (∘. =)

resumir coincidencias desenredadas (+ /,)

Jürgen Sauermann
fuente
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})};

no minificado:

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

Con la ayuda 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)}
Thomas Junk
fuente
2
Como ~ -1 == 0, puedes escribir en ~x?lugar de -1 != x?. Verme respuesta para un ejemplo de uso.
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)}No es necesario tener mapentoncesreduce
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 es una función c :: Int -> String -> Int que toma un contador y una cadena y recorre la cadena letra por letra para verificar si la letra actual es miembro de la matriz de 1 punto o de la matriz de 2 puntos y se llama a sí misma para el resto de la cadena después de aumentar el contador la cantidad adecuada.

Llamada con contador = 0 en ghci:

ghci> c 0 "All your base are belong to us"
12
Craig Roy
fuente
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);}

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

Convirtiendo la cadena en una matriz de caracteres, luego viendo si cada carácter está en cualquiera de los contadores. Si está en el segundo, solo tengo que incrementar el contador nuevamente.

Rancho más fresco
fuente
1

Erlang, 103 bytes

Este es un programa completo que se ejecuta usando escript. La primera línea del archivo debe estar en blanco (agregando 1 byte).

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

Ejecución de muestra:

$ escript closed.erl 'Shortest answer in bytes is the winner!'
8$
Edwin Fine
fuente
Bienvenido a PPCG, c (L, "# 0469 @ ADOPQRabdegopq") + 2 * c (L, "$% & 8B") es más largo que c (L, "# 0469 @ ADOPQRabdegopq $% & 8B $% & 8B") por 5 bytes :).
Katenkyo
@Katyenko, gracias por la sugerencia. Lamentablemente, no funciona correctamente para ciertas entradas. "$% & 8B" cuenta para 5, pero debe ser 10. La función c / 2 funciona filtrando los caracteres de la cadena que no pertenecen a un conjunto de caracteres, como "$% & 8B". Comprueba la inclusión del conjunto eliminando el carácter que se probará del conjunto y luego compara el resultado con el conjunto original. Si no son iguales, entonces el personaje estaba en el conjunto y está incluido. Varias copias de caracteres en el conjunto no tienen ningún efecto.
Edwin Fine
Ho, ya veo, no sé erlang, estaba pensando que estabas usando una cadena para contar el contador: 3. De todos modos, no importa, y bien hecho :)
Katenkyo
0

C, 99 bytes

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

Explicación

Seguí jugando la respuesta de Cool Guy ; se hizo demasiado largo para ser un comentario. En lugar de if/ else, aproveché la !conversión de un puntero a bool. También hice oinclude tpara poder agregar "está adentro o" y "está adentro t" para el número total de contadores.

Código ampliado

#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 salida está en num, que debe borrarse antes de cada llamada.

Programa de prueba y resultados

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

El código en sí contiene 37 contadores por su propia métrica.

Toby Speight
fuente