Inspirado por isso desafio (obrigado @cairdcoinheringaahing pelo título!), Sua tarefa é pegar duas seqüências ASCII imprimíveis e multiplicá-las por elementos com as seguintes regras.
Como funciona?
Dadas duas seqüências de caracteres (por exemplo split
e isbn
), você primeiro truncará a mais longa, de forma que elas tenham o mesmo comprimento e, em seguida, determine seus códigos ASCII :
split -> spli -> [115, 112, 108, 105]
isbn -> isbn -> [105, 115, 98, 110]
O próximo passo será mapeá-los para o intervalo [0..94]
, subtraindo 32
cada código:
[115, 112, 108, 105] -> [83, 80, 76, 73]
[105, 115, 98, 110] -> [73, 83, 66, 78]
Agora você os multiplicará no módulo de elementos 95
(para permanecer no intervalo imprimível):
[83, 80, 76, 73] ⊗ [73, 83, 66, 78] -> [74, 85, 76, 89]
Adicione 32
para voltar ao intervalo [32..126]
:
[74, 85, 76, 89] -> [106, 117, 108, 121]
E a etapa final é mapeá-los de volta para caracteres ASCII:
[106, 117, 108, 121] -> "july"
Regras
- Você escreverá um programa / função que implementa as etapas descritas em duas seqüências e imprime ou retorna a sequência resultante
- O formato de entrada é flexível: você pode pegar duas strings, uma tupla de strings, uma lista de strings etc.
- A entrada pode consistir em uma ou duas cadeias vazias
- A entrada terá caracteres no intervalo imprimível (
[32..126]
) - A saída é impressa no console ou você retorna uma sequência
- É permitido que a saída tenha espaços em branco à direita
Casos de teste
"isbn", "split" -> "july"
"", "" -> ""
"", "I don't matter" -> ""
" ", "Me neither :(" -> " "
"but I do!", "!!!!!!!!!" -> "but I do!"
'quotes', '""""""' -> 'ck_iKg'
"wood", "hungry" -> "yarn"
"tray", "gzip" -> "jazz"
"industry", "bond" -> "drop"
"public", "toll" -> "fall"
"roll", "dublin" -> "ball"
"GX!", "GX!" -> "!!!"
"4 lll 4", "4 lll 4" -> "4 lll 4"
"M>>M", "M>>M" -> ">MM>"
Nota : As aspas são apenas para facilitar a leitura, no sexto caso de teste que usei em '
vez de "
.
abc, def -> [['a', 'b', 'c'], ['d', 'e', 'f']]
Respostas:
MATL , 12 bytes
Experimente online!
Explicação
fonte
Geléia ,
1512 bytesExperimente online!
-3 graças a Jonathan Allan .
fonte
ØṖ
, comz⁶O_32P€‘ịØṖ
- é melhor verificar se a aritmética funciona.Python 3 ,
807471 bytesObrigado a @shooqie por jogar fora 3 bytes!
Experimente online!
fonte
(s, t)
como uma tupla:lambda t:''.join(map(lambda x,y:chr((ord(x)-32)*(ord(y)-32)%95+32),*t))
Python 2 ,
7570 bytes-3 bytes graças à sugestão de Dennis da sugestão de shooqie. -2 bytes graças à sugestão de Zacharý.
Experimente online!
fonte
lambda*t:''.join(chr(((ord(i)-32)*(ord(j)-32))%95+32)for i,j in zip(*t))
((ord(i)-32)*(ord(j)-32))%95+32
=>(ord(i)-32)*(ord(j)-32)%95+32
...map
. Eu estava apenas um pouco atrasado.Haskell ,
6057 bytesExperimente online!
Primeira linha é uma função anônima que recebe dois argumentos.
Essa é uma implementação direta do algoritmo:
zipWith
pega as duas cadeias e aplica uma determinada função aos pares de caracteres. Ele lida com o truncamento e também funciona para cadeias vazias.fromEnum
etoEnum
são alternativas paraord
echr
alternar entre caracteres e seus valores ASCII que não precisam de uma importação longa.Edit: -3 bytes graças a Bruce Forte.
fonte
3
bytes, retirando-32
e salvando esses parênteses, veja aqui .C ++,
331291282270268 bytes, Versão 2 =178176150148 bytesVersão original :
-40 bytes graças a Bruce Forte
-39 bytes graças a Zacharý
Versão 2, inspirada nas respostas de outras pessoas
Se a primeira versão usa um lambda, é porque eu queria testar a função std :: async do C ++ 11 que acabei de aprender antes, então a guardei sem motivos ...
Versão mais legível:
fonte
#include <string>
=>#include<string>
e#include <algorithm>
=>#include<algorithm>
?string
e usá-la adequadamente.Dyalog APL,
3634332524 bytesExperimente online (TryAPL)!
Experimente online (TIO)!
Entrada é uma lista de cadeias e possui espaços em branco à direita.
Veja como funciona:
fonte
tryapl.org
, então aqui está um TIO para aqueles que querem experimentá-lo.FSharp 275 bytes
fonte
CJam , 23 bytes
Experimente online!
fonte
C # (.NET Core) ,
100 9695 bytesExperimente online!
-4 bytes graças a @ Zacharý
-1 byte movendo o incremento
Usa um lambda e abusa do fato de que os caracteres são basicamente ints.
fonte
(l[i]-32)*(n[i]-32)%95+32
?Console
e pode usar currying para salvar um byte. Compile para umAction<string, Action<string>>
likel=>n=>
e chame like("word")("string")
Mathematica, 114 bytes
entrada
fonte
Empilhados , 52 bytes
Experimente online!
Função que recebe dois argumentos da pilha.
Explicação
Vejamos a primeira parte, supondo que os dois principais itens sejam
'split'
e'isbn'
:Esta parte realiza o corte.
Então:
Então, a última parte:
fonte
R , 88 bytes
função anônima; recebe entrada como duas strings; O terceiro argumento é apenas para garantir que esta seja uma função de uma linha e salvar alguns bytes.
O link TIO abaixo retorna uma matriz com entradas nomeadas com a primeira entrada.
Experimente todos os casos de teste!
fonte
Perl 5 , 65 bytes
64 bytes de código +
-p
sinalizador.Experimente online!
fonte
D, 113 bytes
Esta é uma porta da solução C ++ da HatsuPointerKun , não se esqueça de fazer um voto positivo !
Experimente online!
fonte
05AB1E ,
1615 bytesExperimente online!
-1 para Emigna apontando
₃
empurrões95
.é outro.
fonte
₃
salva um byte. Pena que a entrada da string vazia. Caso contrárioø
, economizaria um pouco mais.Java 8,
1271159795 bytesExplicação:
Experimente aqui.
fonte
C #, 166 bytes
Tenho certeza de que há muito golfe a ser feito, mas não tenho tempo no momento.
Experimente online!
Versão completa / formatada:
fonte
(((c-32)*(t.Substring(0,l)[i]-32))%95)+32)
pode ser((c-32)*(t.Substring(0,l)[i]-32)%95+32)
(poderia ter asneira os parênteses lá ... está parecendo lisp!)Lisp comum, 99 bytes
Experimente online!
fonte
Japonês , 24 bytes
Retorna uma sequência com null-chars (
\u0000
) à direita quando a primeira entrada é maior que a segunda.Experimente online! com o
-Q
sinalizador para mostrar a saída formatada, incluindo os caracteres nulos.Execute todos os casos de teste usando meu WIP CodePen.
fonte
Python 2 ,
9573 bytesExperimente online!
fonte
(((ord(x[i])-32)*(ord(y[i])-32))%95)+32
=>(ord(x[i])-32)*(ord(y[i])-32)%95+32
Carvão , 30 bytes
Experimente online! Link é a versão detalhada do código. Na verdade, eu escrevi a calcualação como
(32 - ord(q)) * (32 - ord(h))
porque evita literais numéricos consecutivos, mas acho que poderia ter escrito(ord(q) - ord(" ")) * (ord(h) - ord(" "))
.fonte
Perl 5 , 95 bytes
Experimente online!
Explicação:
fonte
Pip , 19 bytes
Toma as seqüências de caracteres como argumentos de linha de comando. Experimente online!
Explicação
fonte
Fator , 45
É uma cotação (lambda),
call
com duas strings na pilha, deixa a nova string na pilha.Como uma palavra:
fonte
K (oK) , 26 bytes
Solução:
Experimente online!
Exemplo:
Explicação:
A avaliação é realizada da direita para a esquerda:
fonte
PHP, 112 bytes
fonte
for($i=0;$i<strlen($a=$argv[1])&&$i<strlen($b=$argv[2]);)echo chr((ord($a[$i])-32)*(ord($b[$i++])-32)%95+32);
Além disso, não tenho certeza se a substituição&&
por&
também pode ser possível no PHP, reduzindo-o em outro byte para 108 .JavaScript (ES6), 89 bytes
Javascript e a maldição dos nomes extensos de funções ...
Usando currying e o fato de
charCodeAt
retornarNaN
quando chamado com uma posição inválida. Pode haver nulos à direita na saída.Teste
fonte