Motivação
Em deste desafio a sua tarefa era multiplicar duas cordas, isso naturalmente introduz uma maneira de tirar a raiz quadrada de um string.
Como funciona?
Dada uma sequência (por exemplo pub
), a primeira coisa que você precisa fazer é determinar o código ASCII para cada caractere:
"pub" -> [112, 117, 98]
Em seguida, você mapeia esses códigos para o intervalo [0..94]
subtraindo 32
cada valor:
[112, 117, 98] -> [80, 85, 66]
Agora você precisa encontrar para cada valor seu módulo raiz 95
(por exemplo 40*40 % 95 = 80
, você também pode escolher 55
):
[80, 85, 66] -> [40, 35, 16]
E finalmente, você o mapeará de volta para o intervalo [32..126]
e o converterá em uma sequência de caracteres:
[40, 35, 16] -> [72, 67, 48] -> "HC0"
De fato, "HC0" ⊗ "HC0" = "pub"
como você pode verificar com uma solução do outro desafio aqui .
Os familiarizados com a aritmética modular provavelmente notaram que o módulo da raiz quadrada 95
nem sempre existe, por exemplo, não existe raiz para isso 2
. Nesse caso, a raiz quadrada de uma string não é definida e seu programa / função pode falhar, executar um loop indefinidamente etc.
Para sua conveniência, aqui está a lista de caracteres que têm uma raiz quadrada (a primeira é um espaço):
!$%&)+03489:>CDGLMQVW]`bjlpqu
Regras
- Você escreverá um programa / função que usa uma string (ou lista de caracteres) como argumento e retorna qualquer raiz quadrada, se existir
- Você pode supor que a entrada sempre tenha uma raiz quadrada
- A entrada pode consistir em uma sequência vazia
- A entrada estará no intervalo imprimível (
[32..126]
) - A saída é impressa no console ou você retorna uma sequência se a raiz quadrada existir
- Caso a raiz quadrada não exista, o comportamento do seu programa / função é deixado indefinido
- Se você optar por imprimir a raiz no console, as novas linhas ou espaços em branco serão excelentes
Casos de teste
Observe que essas não são necessariamente as únicas soluções:
'' -> ''
'pub' -> 'HC0'
'pull!' -> 'HC33!'
'M>>M' -> '>MM>'
'49' -> '4%'
'64' -> undefined
'Hello, World!' -> undefined
0-94
(esse é o intervalo imprimível), isso é um erro de digitação - desculpe por isso.Respostas:
sh + coreutils, 58 bytes
Experimente online!
A raiz quadrada modular normalmente não é única; temos 2 ou 4 opções para cada personagem, exceto
. Nós não precisamos de traduzir
,
!
,4
,l
uma vez que cada já é uma raiz quadrada de si. Para os caracteres restantes, escolhemos imagens que não precisam ser escapadas para o shell outr
.fonte
Python 3,
5756 bytestranslate
usa um mapeamento de "Ordinais Unicode para Ordinais Unicode". Assim, não precisamos dechr
/ord
conversões. Nota: não falha quando o caractere não tem raiz.Guardado 1 byte graças a @ jonathan-allan
O valor do mapeamento é a maior raiz no intervalo de 0 a 94 da chave. Para ter o mínimo de raiz (como nos exemplos), use:
(61 bytes)
fonte
32
efor
.Python 2 , 80 bytes
Experimente online!
Lança IndexError se não houver raiz.
fonte
Japonês ,
1615 bytesExperimente online!
Salve um byte olhando a resposta 05AB1E (usando
L
= 100 em vez de95
). Agora Japt é o mais curto, uma ocorrência bastante rara :-DExplicação
fonte
Mathematica, 94 bytes
Experimente online!
fonte
Geléia ,
181716 bytesExperimente online! (vem com rodapé da suíte de teste)
Economizou 2 bytes fazendo uma reescrita completa.
Também a primeira vez que encontrei utilidade para}
.Explicação
O código primeiro calcula todos os caracteres quadrados e depois os mapeia para suas respectivas raízes quadradas.
fonte
95Ḷ²%95+32iЀO+31Ọ
é basicamente o que a minha resposta Japt faz, embora a sua solução é de dois bytes mais curto ...JavaScript, 82 bytes
Colaborou com @ETHproductions
Entrada e saída estão na forma de uma matriz de caracteres.
Snippet de teste
Mostrar snippet de código
fonte
05AB1E , 17 bytes
O algoritmo é muito parecido com a resposta Jelly e Japt (tinha outra coisa antes, mas isso só me levou a 19 bytes)
Explicação
Experimente online!
fonte
Mathematica, 60 bytes
Função anônima. Pega uma string como entrada e retorna uma string como saída. Erros na entrada inválida.
fonte
Perl 6 , 53 bytes
Experimente online!
fonte
Mathematica 82 Bytes
Usando a capacidade do Solve para fazer aritmética modular.
fonte