No 4chan, um jogo popular é o get. Cada postagem no site recebe um ID de postagem sequencial. Como você não pode influenciá-los ou determiná-los, as pessoas tentam adivinhar (pelo menos uma parte) seu próprio número de postagem, geralmente os primeiros dígitos. Outra versão do jogo é chamada dubs, e seu objetivo é obter dígitos repetidos no final do número (por exemplo, 1234555).
Sua tarefa, se você deseja aceitá-la, é escrever um programa que use uma identificação de postagem como entrada (número inteiro padrão, você pode assumir abaixo de 2 ^ 32) e retornar quantos dígitos repetidos existem no final.
Regras
- As brechas padrão não são permitidas .
- O programa pode ser uma função, programa completo, comando REPL, o que realmente funciona, desde que nenhum código / argumento externo não contado seja necessário para executá-lo.
- A entrada pode vir de STDIN, argumentos de função, argumento de linha de comando, arquivo, o que for mais conveniente para você.
Casos de teste
Input: 14892093
Output: 1
Input: 12344444
Output: 5
Input: 112311
Output: 2
Input: 888888
Output: 6
Input: 135866667 //Post number I got on /pol/ few days ago, rip
Output: 1
code-golf
number
number-theory
counting
sagiksp
fonte
fonte
Respostas:
Mathematica, 29 bytes
Que tal uma solução aritmética?
Estou muito satisfeito ao ver que isso supera a abordagem direta do Mathematica.
Explicação
O próprio código calcula 9 * n + n% 10 e, em seguida, encontra a maior potência de 10 que divide a entrada, ou seja, conta os zeros à direita. Precisamos mostrar se n termina em k dígitos repetidos, que 9 * n + n% 10 tem k zeros à direita.
Os dígitos repetitivos são expressos matematicamente mais facilmente dividindo um número como 99999 (que é 10 5 -1 ) por 9 e multiplicando pelo dígito repetido. Portanto, podemos escrever n = m * 10 k + d * (10 k -1) / 9 , onde m ≢ d (mod 10) , para garantir que n não termine em mais de k dígitos repetidos. Observe que d = n% 10 .
Vamos inserir isso em nossa fórmula 9 * n + n% 10 . Temos 9 * m * 10 k + d * (10 k -1) + d . O d no final é cancelado, então ficamos com: 9 * m * 10 k + d * 10 k = (9 * m + d) * 10 k . Mas 9 ≡ -1 (mod 10) , então 9 * m + d ≡ d - m (mod 10) . Mas afirmamos que m ≢ d (mod 10) e, portanto, d - m ≢ 0 (mod 10) .
Em outras palavras, mostramos que 9 * m + d não é divisível por 10 e, portanto, a maior potência de 10 que divide 9 * n + n% 10 = (9 * m + d) * 10 k é k , o número de dígitos repetidos à direita.
Como um bônus, esta solução imprime o resultado correto,,
∞
para entrada0
.fonte
Retina , 9 bytes
Experimente online!
Conta o número de correspondências sobrepostas,
(.)\1*$
que é uma regex que corresponde a um sufixo de caracteres idênticos.fonte
(.)(?=\1*$)
.(?=(.)\1*$)
(basicamente a mesma que a sua).Braquilog , 4 bytes
Experimente online!
Explicação
Se
ḅ
trabalhasse diretamente em números inteiros (e não sei por que não o implementei), isso seria apenas 3 bytes, poisẹ
não seria necessário.fonte
Python 2 ,
4741 bytesExperimente online!
36 bytes - Para uma entrada mais flexível
Experimente online!
fonte
dir(object)
é nosso amigo c:Javascript (ES6),
55523230 bytesUsando uma regex para corresponder ao último grupo do último dígito
Nota: Primeira publicação. Não hesite em fazer comentários.
fonte
/(.)\1*$/
f=
.C,
62564847 bytesGuardou um byte graças a @Steadybox!
Experimente online!
fonte
PHP,
474540 bytesCorrer com
echo <n> | php -nR '<code>
parece que um loop ainda é menor que minha primeira resposta. basta contar os caracteres iguais ao último. Isso usa deslocamentos negativos de string do PHP 7.1 .
-5 bytes por Titus. Obrigado !
Resposta antiga:
remove da direita todos os caracteres correspondentes ao caracter mais à direita e calcula a diferença no comprimento.
fonte
-R
e$argn
poderia economizar 5 bytes.05AB1E , 4 bytes
Experimente online! ou como um conjunto de testes
Explicação
fonte
CJam , 7 bytes
Experimente online!
Explicação
fonte
Geléia , 5 bytes
Experimente online!
Explicação
fonte
Perl 5 , 22 bytes
21 bytes de código +
-p
sinalizador.Experimente online!
/(.)\1*$/
obtém os últimos números idênticos e$_=length$&
atribui seu comprimento a$_
, que é implicitamente impresso graças ao-p
sinalizador.fonte
C (gcc) ,
3229 bytesEsta é uma porta da minha resposta Python .
Isso funciona com o gcc, mas a falta de uma
return
declaração é um comportamento indefinido.Experimente online!
fonte
return
que a instrução faz é armazenar o valor de retorno no EAX. Com o gcc, atribuí-lo a uma variável faz a mesma coisa. Quanto à aritmética do ponteiro, quando você adiciona 1 a um ponteiro int, ele passa para o próximo int, não para o próximo byte.Python 2, 51 bytes
Leva inteiro como entrada. Experimente online
48 bytes para string como entrada. Experimente online
fonte
C # ,
6362 bytesGolfe
Ungolfed
Ungolfed legible
Código completo
Lançamentos
- 1 byte
- Graças ao comentário de Kevin .63 bytes
- Solução inicial.Notas
Nada para adicionar
fonte
i=>{int a=i.Length-1,b=a;while(a-->0&&i[a]==i[b]);return b-a;}
Python 2 ,
3832 bytesObrigado a @xnor por salvar 6 bytes!
Experimente online!
fonte
MATL ,
65 bytes1 byte salvo graças a @Luis
Experimente no MATL Online
Explicação
fonte
&
fiz isso paraY'
:-D Por que não pegar a entrada como uma string entre aspas e livrar-mej
?Cubix,
2419 bytesNota
Experimente aqui
Explicação
Primeiro, vamos expandir o cubo
As etapas da execução podem ser divididas em três fases:
Fase 1: Entrada
Os dois primeiros caracteres que são executados são
A
eB
.A
lê todas as entradas e as envia como códigos de caracteres para a pilha. Observe que isso é feito ao contrário, o primeiro caractere termina no topo da pilha, o último caractere quase na parte inferior. Na parte inferior, é colocado-1
(EOF
), que será usado como um contador para a quantidade de caracteres consecutivos no final da string. Como precisamos que o topo da pilha contenha os dois últimos caracteres, invertemos a pilha antes de inserir o loop. Observe que a parte superior da pilha agora se parece com:..., C[n-1], C[n], -1
.O lugar do IP no cubo é onde
E
está e está apontando para a direita. Todas as instruções que ainda não foram executadas foram substituídas por no-ops (pontos finais).Fase 2: Comparação de caracteres
A pilha é
..., C[a-1], C[a], counter
ondecounter
está o contador para incrementar quando os dois caracteres para verificar (C[a]
eC[a-1]
) são iguais. O IP primeiro entra nesse loop noS
personagem, movendo-se para a direita. OE
caractere é a posição em que o IP terminará (apontando para a direita) quandoC[a]
eC[a-1]
não terá o mesmo valor, o que significa que subtrairC[a]
deC[a-1]
não produz0
, nesse caso a instrução a seguir!
será ignorada (que é aw
).Aqui estão as instruções que são executadas durante um loop completo:
E então ele volta.
Fase 3: resultado da impressão
Desde que deixou o circuito cedo, os olhares pilha assim:
counter, ..., C[a-1]-C[a]
. É fácil imprimir o contador, mas precisamos incrementá-lo uma vez porque não o fizemos na última iteração do loop e mais uma vez porque começamos a contar em-1
vez de0
. O caminho no cubo se parece com isso, começando emS
, apontando para a direita. As duas operações não executadas pelo IP são substituídas por setas que apontam na direção do IP.As instruções são executadas na seguinte ordem. Observe que as
B)
instruções no final alteram a pilha, mas não afetam o programa, pois estamos prestes a finalizá-la e não usamos mais a pilha.Alea iacta est.
fonte
Lote, 91 bytes
Os
-
impede que o teste seja executado fora do início da string.fonte
JavaScript (ES6), 34 bytes
Não é mais curto que a solução regex.
Função recursiva que avalia os dígitos da direita para a esquerda, parando quando um dígito diferente é encontrado. O resultado é o número de iterações.
p
estáundefined
na primeira iteração, o que significan%10-p
retornosNaN
(falsy). Depois disso,p
igual ao dígito anterior comn%10
. Quando o dígito atual (n%10
) e o anterior (p
) são diferentes, o loop termina.fonte
Röda , 12 bytes
Experimente online!
Esta é uma função anônima que espera que cada caractere da string de entrada seja enviado ao fluxo (acho que isso é válido no espírito de uma meta questão recente ).
Ele usa dois builtins:
count
etail
:count
lê valores do fluxo e envia o número de elementos consecutivos ao fluxo.tail
retorna o último valor no fluxo.fonte
T-SQL,
238214 bytesOu:
fonte
Java 7, 78 bytes
Experimente aqui.
Eu tentei algumas coisas usando recursão ou loop, mas ambas terminaram acima de 100 bytes.
fonte
Powershell, 41 bytes
loop direto para trás até que um caractere não corresponda ao último caractere da string, retorne o índice desse caractere -1.
-3 graças a @AdmBorkBork - usando um loop for em vez de um tempo.
fonte
Mathematica,
3330 bytesObrigado a Greg Martin por salvar 3 bytes.
Recebe a entrada como uma sequência.
Obtém os dígitos decimais (na forma de caracteres), os divide em execuções de elementos idênticos, obtém a última execução e calcula o comprimento com o truque padrão de obter a soma do vetor
1^list
.fonte
Characters
em vez deIntegerDigits
?Utilitários Bash + Unix, 34 bytes
Experimente online!
fonte
JavaScript (ES6),
39383727 bytesTalvez não seja menor que a solução baseada em regex, mas não resisti em escrever uma solução totalmente baseada em aritmética. A técnica é pegar
n % 100 % 11
e dividir repetidamente por 10 até que o resultado seja diferente de zero e conte as iterações. Isso funciona porque se os dois últimos dígitos forem iguais,n % 100 % 11
será0
.fonte
f=(n,p)=>n%10-p?0:1+f(n/10|0,n%10)
Haskell , 33 bytes
Experimente online!
Pega a entrada da string. Corta repetidamente o primeiro caractere e adiciona 1 se todos os caracteres no sufixo forem iguais ao primeiro.
fonte
R, 35 bytes
Breve explicação
fonte
Befunge-98 , 19 bytes
Experimente online!
Isso poderia ser mais curto se eu conseguisse usar apenas a pilha.
Como funciona:
fonte
Python 3 -
50.44 bytesPrograma completo (no Python 3,
input()
retorna uma string, independentemente da entrada):fonte