Na tipografia, um contador é a área de uma letra que é total ou parcialmente delimitada por uma forma de letra ou um símbolo. Um contador fechado é um contador totalmente fechado por uma forma de letra ou símbolo. Você deve escrever um programa que utiliza uma string como entrada e imprime o número total de contadores fechados no texto.
Sua entrada:
Pode ser uma entrada de linha de comando ou de STDIN, mas você deve especificar qual.
Consistirá inteiramente dos caracteres ASCII imprimíveis, significando todos os valores ASCII entre 32 e 126, inclusive. Isso inclui espaços. Mais Informações.
Agora, isso varia um pouco entre as fontes. Por exemplo, a fonte em que você está lendo isso considera 'g' como um contador fechado, enquanto a fonte do google possui 'g' com dois contadores fechados. Para que isso não ocorra, aqui está o número oficial de contadores fechados por personagem.
Todos os símbolos sem contadores fechados:
!"'()*+,-./12357:;<=>?CEFGHIJKLMNSTUVWXYZ[\]^_`cfhijklmnrstuvwxyz{|}~
Observe que isso inclui espaço.
Aqui estão todos os símbolos com um contador fechado:
#0469@ADOPQRabdegopq
E aqui estão todos os símbolos com 2 contadores fechados:
$%&8B
E por último mas não menos importante, aqui estão algumas amostras de entradas e saídas.
Programming Puzzles and Code-Golf
deve imprimir 13
4 8 15 16 23 42
deve imprimir 5
All your base are belong to us
deve imprimir 12
Standard loopholes apply
deve imprimir 12
Shortest answer in bytes is the winner!
deve imprimir 8
g
há dois balcões fechados. Você determinou os contadores com base em qualquer fonte específica?g
tenha 2. Um pouco confuso para ler, mas não acho que seja diferente por local.0
possui 2 contadores fechados em determinadas fontes, especialmente em muitas fontes monoespaçadas?Respostas:
Pitão, 31 bytes
Demonstração.
Observe que o código pode não ser exibido corretamente devido ao uso de caracteres não ASCII. O código correto está no link.
Fiz uma tabela de pesquisa da saída desejada para cada caractere de entrada, girei-a em 32 para fazer uso da indexação modular de Pyth, colei um 1 no início e o interpretei como um número base 3, fornecendo o número
2229617581140564569750295263480330834137283757
. Em seguida, converti esse número na base 256 e o converti em uma string, que é a string usada na resposta.fonte
Python 3, 63
Uma abordagem direta. Repete cada caractere com um contador fechado, somando o número de ocorrências, fazendo isso duas vezes para caracteres com dois contadores fechados. Seria o mesmo comprimento para escrever
Python 3 é necessário para evitar
raw_input
.fonte
CJam,
41393734 bytesGraças a @ jimmy23013 por jogar fora 3 bytes!
Experimente online.
Como funciona
fonte
"$%&8Badopq#0469@Rbeg"_A<eu+
.eu
eel
, mas nunca achei isso. Obrigado!sed, 51
Com a ajuda do golfe de @manatwork e @TobySpeight:
Entrada de STDIN. Com essa meta-pergunta em mente , a saída é unária:
fonte
Perl, 41
41
caracteres +1 para a-p
bandeira.Isso usa y /// para contar os caracteres.
fonte
APL GNU, 39 bytes
Experimente online no GNU APL.js .
Como funciona
fonte
JavaScript, 86
E / S via pop-up. Execute o trecho em qualquer
drecente navegador para teste.fonte
K,
54434237 bytesCorte 5 bytes graças a @JohnE!
Versão antiga:
Original:
fonte
#&
interior das parênteses poderia ser tão facilmente+/
, o que significa que você poderia ir mais longe+//"#0469@ADOPQRabdegopq$%&8B$%&8B"=\:
. Finalmente, não é necessário ter of:
dado que a função pode ser usada na forma tácita. Isso reduziria você a 38!+//(30#"$%&8B#0469@ADOPQRabdegopq")=\:
. Isso pode ser o melhor que podemos fazer.+//(30#"$%&8B#0469@ADOPQRabdegopq"=)'
C, 127 bytes
Bem direto. Versão não destruída:
Teste-o aqui
Se argumentos de função não forem permitidos, a
stdin
versão ocupará até 141 bytes:Observe que a versão acima pressupõe que a entrada tenha no máximo 98 caracteres.
Teste aqui
Versão dos argumentos da linha de comando (143 bytes):
Teste aqui
fonte
Python 2,
96907567 + 2 = 69 bytesNão consigo pensar em outra maneira de fazer isso ... é o que eu pensaria até ver a solução do xnor. Vou postar o que eu tinha de qualquer maneira.
Agradecimentos a FryAmTheEggman por salvar 6 bytes
Tudo bem, agora estou feliz com isso.
Obrigado ao xnor pelo truque de busca, economizando 4 bytes.
Adicionado dois bytes, pois a entrada precisa estar entre aspas.
fonte
Java, 162
Bem, se tiver que ser um programa completo ... É apenas uma linha que combina caracteres e os substitui por uma string mais longa. Em seguida, retorna a diferença de comprimento do original. Infelizmente, o java realmente não tem nada para contar apenas o número de correspondências.
Aqui está com quebras de linha:
fonte
Pitão - 35 bytes
Usa o método óbvio de primeiro + * 2 em segundo. Obrigado @FryTheEggman.
Experimente aqui online .
fonte
Javascript,
11495 bytesAgradeço a Ismael Miguel por me ajudar a jogar isso.
fonte
alert(prompt().replace(/[#046@ADOPQRabdegopq]/g,9).replace(/[$%&8B]/g,99).match(/9/g).length)
Ruby, 59 bytes
Entrada da linha de comando ou stdin. Até agora, o mais curto, usando uma linguagem não esotérica.
Atualização: chilemagic beat me
fonte
Retina , 44 bytes
Dá saída em unário.
Cada linha deve ir para seu próprio arquivo ou você pode usar o
-s
sinalizador Por exemplo:Os pares de linhas (pares substituto de padrão) executam as seguintes etapas de substituição:
1
's1
11
1
'sfonte
J, 43
Como uma função:
46 bytes (linha de comando)
Como um programa de linha de comando independente:
Salve a linha acima como
counter2.ijs
e chame na linha de comando:fonte
f=:your_function_code
.Julia,
7774 bytesIsso lê o texto de STDIN e imprime o resultado em STDOUT.
Ungolfed + explicação:
Exemplo:
fonte
rs , 56 bytes
Demonstração ao vivo.
fonte
GNU APL, 37 caracteres
construa um vetor de caractere que contenha caracteres de 2 contadores duas vezes (30⍴)
compare cada caractere de entrada com cada caractere do vetor (∘. =)
resumir partidas sorteadas (+ /,)
fonte
Javascript
159, 130 bytesnão minificado:
Com a ajuda do @ edc65:
fonte
~ -1 == 0
, você pode escrever em~x?
vez de-1 != x?
. Veja-me responder para um exemplo de uso.function c(b){return b.split('').reduce(function(t,a){return t+(~"$%&8B".indexOf(a)?2:~"#0469@ADOPQRabdegopq".indexOf(a)?1:0)},0)}
Não há necessidade de termap
em seguidareduce
Haskell, 117
c é uma função
c :: Int -> String -> Int
que pega um contador e uma string e percorre a string uma letra de cada vez, verificando se a letra atual é um membro da matriz de 1 ponto ou da matriz de 2 pontos e se chama para o restante da cadeia após incrementar o contador a quantidade apropriada.Chamada com contador = 0 em ghci:
fonte
C #, 157
Ungolfed:
Convertendo a cadeia de caracteres em uma matriz de caracteres e ver se cada caracter está em um dos contadores. Se estiver no segundo, apenas o incremento do contador novamente.
fonte
Erlang, 103 bytes
Este é um programa completo que é executado usando escript. A primeira linha do arquivo deve estar em branco (adicionando 1 byte).
Exemplo de execução:
fonte
C, 99 bytes
Explicação
Joguei ainda mais a resposta de Cool Guy ; demorou muito para ser um comentário. Em vez do
if
/else
, aproveitei a!
conversão de um ponteiro para bool. Eu também fizo
incluirt
para que eu pudesse adicionar "está dentroo
" e "está dentrot
" para o número total de contadores.Código expandido
A saída está em
num
, que deve ser limpa antes de cada chamada.Programa de teste e resultados
O código em si contém 37 contadores por sua própria métrica.
fonte