fundo
O maior divisor comum ( gcd para abreviar) é uma função matemática conveniente, pois possui muitas propriedades úteis. Uma delas é a identidade de Bézout : se d = gcd(a, b)
, então existem inteiros x
e y
tal d = x*a + y*b
. Nesse desafio, sua tarefa é visualizar essa propriedade com arte ASCII simples.
Entrada
Suas entradas são dois números inteiros positivos a
e b
, dados em qualquer formato razoável. Você também pode receber entradas unárias (repetições de um único caractere ASCII imprimível de sua escolha), mas deve ser consistente e usar o mesmo formato para ambas as entradas. As entradas podem estar em qualquer ordem e podem ser iguais.
Saída
Sua saída é uma sequência s
de comprimento lcm(a, b) + 1
( lcm significa o menor múltiplo comum). Os caracteres de s
representam números inteiros de 0
até lcm(a, b)
. O caractere s[i]
é minúsculo o
se i
for múltiplo de a
ou b
, e um período .
caso contrário. Observe que zero é um múltiplo de cada número. Agora, devido à identidade de Bézout, haverá pelo menos um par de caracteres o
na s
distância exata gcd(a, b)
. O par mais à esquerda deve ser substituído por O
s maiúsculo ; este é o resultado final.
Exemplo
Considere as entradas a = 4
e b = 6
. Então nós temos gcd(a, b) = 2
e lcm(a, b) = 12
, portanto, o comprimento de s
será 13
. Os múltiplos de a
e b
são destacados da seguinte forma:
0 1 2 3 4 5 6 7 8 9 10 11 12
o . . . o . o . o . . . o
Existem dois pares de o
s com a distância dois, mas substituiremos apenas os mais à esquerda por O
s, então a saída final é
o...O.O.o...o
Regras e pontuação
Você pode escrever um programa completo ou uma função. A menor contagem de bytes vence e as brechas padrão não são permitidas.
Casos de teste
1 1 -> OO
2 2 -> O.O
1 3 -> OOoo
4 1 -> OOooo
2 6 -> O.O.o.o
2 3 -> o.OOo.o
10 2 -> O.O.o.o.o.o
4 5 -> o...OO..o.o.o..oo...o
8 6 -> o.....O.O...o...o.o.....o
12 15 -> o...........O..O........o.....o.....o........o..o...........o
19 15 -> o..............o...o..........o.......o......o...........o..o..............OO.............o....o.........o........o.....o............o.o..............o.o............o.....o........o.........o....o.............oo..............o..o...........o......o.......o..........o...o..............o
fonte
.
,o
ouO
.) Ou precisa ser1
? Ou0
?Respostas:
Jolf, 52 bytes
Dividirei esse código em duas partes.
Experimente aqui!
fonte
Julia,
11111010710396 bytesEsta é uma função que aceita dois números inteiros e retorna uma string.
Ungolfed:
Guardou um byte graças a nimi!
fonte
Retina ,
112109999491 bytesAcho que não é muito competitivo, mas a teoria dos números na Retina é sempre bastante divertida. :)
Recebe a entrada como números unários usando
.
como dígito unário.Experimente online.
Explicação
Isso insere um
.
espaço na frente da entrada. Isso acabará se tornando o resultado.Isso antecede o LCM de
a
eb
para a sequência. Como já temos um.
lá, acabaremos comlcm(a,b)+1
. Isso é realizado anexando repetidamenteb
, desdea
que não divida esse novo prefixo. Capturamosa
em um grupo um e, em seguida, verificamos se conseguimos alcançar o início da string, correspondendo essa captura pelo menos uma vez.b
é então inserido na string através do raramente usado,$'
que insere tudo após a partida na substituição.Este combina caracteres em posições divididas por
a
oub
. Ele faz uso do fato de que o resultado é simétrico: já quelcm(a,b)
é dividido por ambosa
eb
vai para a esquerda ao subtrair instâncias dea
oub
produz o mesmo padrão que o direito de0
adicioná-las. O primeiro lookahead simplesmente capturaa
eb
. O segundo lookahead verifica se há um múltiplo de cada uma
oub
caracteres antes do primeiro espaço.Conforme declarado na Wikipedia, além da identidade de Bézout, também é verdade que
Isso implica que o GCD corresponderá ao menor intervalo entre dois
o
s na saída. Portanto, não precisamos nos preocupar em encontrar o GCD. Em vez disso, apenas procuramos a primeira instância do menor intervalo.o(\.*)o
corresponde a uma lacuna candidata e captura sua largura no grupo 1. Em seguida, tentamos alcançar o primeiro espaço alternando entre uma referência anterior ao grupo 1o
es (com.
s adicionais opcionais ). Se houver uma lacuna mais curta à direita, isso não corresponderá, porque não podemos superar essa lacuna com a referência anterior. Assim que todas as lacunas adicionais forem pelo menos tão amplas quanto a atual, isso corresponderá. Capturamos o final da string LCM no grupo 2 e combinamos o restante da string com.*
. Escrevemos de volta as maiúsculasO
s (com o intervalo entre elas) e o restante da sequência LCM, mas descarte tudo a partir do espaço, para removera
eb
do resultado final.fonte
(\.*)
=>(a*)
.
mais tarde, que custa quatro bytes (e se livrar das fugas, apenas 3)., 50 caracteres / 90 bytes
Try it here (Firefox only).
Deve haver uma maneira de jogar isso ainda mais!
Explicação
Este é um algoritmo bifásico básico. Na verdade, é bastante simples.
Fase 1
Primeiro, criamos um intervalo de 0 a LCM + 1. Em seguida, mapeamos sobre ele, verificando se uma das entradas é um fator do item atual no intervalo. Nesse caso, substituímos esse item por um
o
; caso contrário, substituí-lo por a.
. A união nos dá uma série de O's e pontos que podemos passar para a fase dois.Fase 2
Esta é apenas uma grande função de substituição. Um regex é criado como
o[dots]o
, onde a quantidade de pontos é determinada pelo GCD-1. Como esse regex não é global, ele corresponderá apenas à primeira ocorrência. Depois, a correspondência é substituídaO[dots]O
usando uma função toUpperCase.fonte
MATL , 72 bytes
Usa a versão 6.0.0 , que é anterior a esse desafio. O código é executado no Matlab e no Octave.
Exemplo
Explicação
Não tenho ideia de como isso funciona. Eu apenas digitei caracteres aleatoriamente. Eu acho que há alguma convolução envolvida.
Edit: Experimente online! O código no link foi ligeiramente modificado para estar em conformidade com as alterações no idioma (em 2 de junho de 2016).
fonte
Japonês , 83 bytes
Ainda não totalmente jogado de golfe ... E não quer ser jogado de golfe: /
fonte
r
no lugar de$.replace($
?Javascript,
170164161153 153145141136 bytesIsso é bastante lonnnggggg ....
Demonstração , variáveis definidas explicitamente porque o intérprete usa o modo estrito.
fonte
i%a<1||i%b<1?'o':'.'
pori%a&&i%b?'.':'o'
[...Array((d=a*b/(c=(g=(a,b)=>b?g(b,a%b):a)(a,b)))+1).keys()].map(i=>i%a&&i%b?'.':'o')
economiza dois bytes. (Eu também tentei indexação seqüência de uso para criar o e 'o', mas que na verdade custa dois bytes ''.)Python 2,
217200191 bytesIsso é um pouco franco, mas funciona. Todas as dicas de golfe são apreciados,
especialmente se você sabe como corrigir issoGot it!s[i] = s[v] = "o"
problema que encontramos, onde que iria substituir "O" sUngolfed:
fonte