Palavras comuns ainda devem ser evitadas para serem usadas como senhas. Este desafio é sobre a codificação de um programa muito simples que munges uma determinada palavra-passe ( M odify U té N ot G uessed E asily).
Entrada
Uma palavra, que é uma string escrita no alfabeto abcdefghijklmnopqrstuvwxyz
. Não importa se as letras são minúsculas ou maiúsculas.
Munging
- Alterar qualquer sequência repetida de uma mesma letra para si mesma precedida pelo número de vezes que a letra foi repetida (
LLLL
com4L
) - Mude o primeiro
a
com@
- Mude o primeiro
b
com8
- Mude o primeiro
c
com(
- Mude o primeiro
d
com6
- Mude o primeiro
e
com3
- Mude o primeiro
f
com#
- Mude o primeiro
g
com9
- Mude o primeiro
h
com#
- Mude o primeiro
i
com1
- Mude o segundo
i
com!
- Mude o primeiro
k
com<
- Mude o primeiro
l
com1
- Mude o segundo
l
comi
- Mude o primeiro
o
com0
- Mude o primeiro
q
com9
- Mude o primeiro
s
com5
- Mude o segundo
s
com$
- Mude o primeiro
t
com+
- Mude o primeiro
v
com>
- Mude o segundo
v
com<
- Mude o primeiro
w
comuu
- Mude o segundo
w
com2u
- Mude o primeiro
x
com%
- Mude o primeiro
y
com?
A regra 1 deve ser aplicada o número necessário de vezes até que não seja possível aplicá-la mais. Depois disso, o restante das regras é aplicado.
Saída A palavra munged
Exemplos
codegolf
->(0639o1#
programming
->pr09r@2m1ng
puzzles
->pu2z135
passwords
->p@25uu0r6$
wwww
->4uu
aaaaaaaaaaa
->11a
lllolllolll
->3103io3l
jjjmjjjj
->3jm4j
Isso é código-golfe , então faça seu programa o mais curto possível!
Nada nesta postagem deve ser usado como idéias de senha ou como parte das práticas de senha.
Respostas:
Java 8,
237321319280247241240237 bytes+84 bytes porque as regras sofreram alterações. ( EDIT: Finalmente, de volta aos meus 237 bytes iniciais. ) É fácil substituir
WWWW
por222W
Java em Java, mas4W
não por ... Se apenas Java tivesse uma maneira de usar o grupo de captura regex para alguma coisa. Obter o comprimento"$1".length()
, substituir a correspondência em si"$1".replace(...)
, converter a correspondência em um número inteiro comnew Integer("$1")
ou usar algo semelhante a Retina (por exemplos.replaceAll("(?=(.)\\1)(\\1)+","$#2$1")
) ou JavaScript (por exemplos.replaceAll("(.)\\1+",m->m.length()+m.charAt(0))
) seria minha coisa número 1 que eu gostaria de ver em Java no futuro para beneficiar o codegolfing ..>.> Acho que é a décima vez que odeio que o Java não possa fazer nada com a correspondência do grupo de captura ..-78 bytes graças a @ OlivierGrégoire .
E / S está em maiúsculas.
Explicação:
Experimente aqui.
fonte
JavaScript (ES6), 147 bytes
Casos de teste
Mostrar snippet de código
Explicação
Executa uma série de substituições na sequência de entrada
s
, na ordem especificada pelo desafio. Cada item da série é uma matriz ou sequência, com dois itens, que é então espalhada (...r
) e passada paras.replace()
.fonte
05AB1E , 69 bytes
-9 bytes graças a Emigna
Experimente online!
fonte
'w„uu„2u‚â
4uu
γvygD≠×yÙ}J
Perl 5 , 152 + 1 (
-p
) = 153 bytesExperimente online!
fonte
-p
é usado como argumento paraperl
na linha de comando que lê automaticamente as entradasSTDIN
eprint
os conteúdos$_
no final do script. O TIO permite essa opção e, uma vez queperl -pe<code>
é 1 byte a mais doperl -e<code>
que é contado como um byte adicional.~
intervalo não deveriaj~k
ser um!
? Atualmente, substituiu a segunda ocorrência dei
com a em~
vez de a!
.Provavelmente não é o mais jogado de golfe, mas funciona.
-6 bytes graças a ovs
-77 bytes graças a NieDzejkob e Jonathan French
Python 3 ,
329323 bytes246 bytesExperimente online!
fonte
.lower()
jjjmjjjj
deve sair,3jm4j
mas saídas3jm3jj
. Edit: 258 bytes com este problema corrigidoRetina ,
166124 bytesExperimente online! Explicação:
Substitua uma sequência de letras repetidas pelo comprimento e pela letra.
Combinar a primeira ocorrência das letras
a
paray
e marcá-los com um espaço reservado.Corrija a primeira ocorrência de
w
.Fixar a primeira ocorrência de todas as outras cartas de
a
paray
e excluir os espaços reservados.Marcar o (originalmente) segunda ocorrência das cartas
i
,l
,s
,v
, ouw
com um marcador de posição.Corrija a segunda ocorrência de
w
.Corrija a segunda ocorrência das outras quatro letras.
fonte
Haskell ,
221218213 bytesExperimente online!
Abusa
foldr
de executar a cadeia de caracteres através de uma sequência de transformações de cadeia de trás para a frente. A sequência "começa" com ar
qual a repetição conta a substituição usandospan
para quebrar a cauda da corda quando ela deixa de ser igual à cabeça. Se a primeira parte não estiver vazia, é uma repetição, por isso imprimimos o comprimento +1. Em seguida, adicionamos um argumentof
para cada substituição de caracteres na ordem (reversa). As substituições são codificadas como uma única sequência de caracteres, com o primeiro caractere sendo o caractere a ser substituído e o restante como a sequência (já que as substituições w são vários caracteres) que devem ser substituídas. Coloquei essas cadeias codificadas em uma grande cadeia separada por espaços, para quewords
possam ser divididas em uma lista para mim.EDIT: Obrigado @Laikoni por me salvar 5 bytes! Esse foi um uso inteligente do
$
qual não pensei. Eu também não conhecia esse<-
truque.fonte
(p,q)<-span(==a)b
vez delet(p,q)=span(==a)b
e emp>[]
vez dep/=[]
.m
pointfree:($(f<$>words"w2u ... y?")++[r]).foldr($)
Experimente online!Lua , 173 bytes
Experimente online!
Ungolfed e explicou:
fonte
C # (.NET Core),
317,289, 279 bytesExperimente Online!
Espero que seja bom receber uma matriz de caracteres como uma entrada e não uma string.
Ungolfed :
fonte
C ++,
571495478444 bytes-127 bytes graças a Zacharý
a
"/a@/b8/c(/d6/e3/f#/g9/h#/i1//i!/k</l1//li/o0/q9/s5//s$/t+/v>/wuu//w2u/x%/y?/"
cadeia é usada para transformar de um caractere para outro. 1/
significa que o primeiro "próximo caractere" deve ser substituído pelo seguinte/
, 2 significa que o segundo "próximo caractere" deve ser substituído pelo seguinte.Experimente online
fonte
R ,
224219 bytesExperimente online!
Desagradável, mas a parte principal é a substituição iterativa no
Reduce
.sub
altera apenas a primeira ocorrência da partida.Agradecemos a JayCe por apontar um bom golfe!
fonte
Perl 5 , 123 bytes
Código de 122 bytes + 1 para
-p
.Desenvolvido independentemente de @ Xcali 's resposta , mas usando um processo muito similar.
Experimente online!
fonte
Python 2 ,
220216194190188 bytesExperimente online!
Python 3 , 187 bytes
Experimente online!
fonte
Pip ,
103102 bytesExperimente online!
Explicação
O código executa três etapas de transformação:
* Precisamos testar se
a@?m@0
é nulo. Não basta testar se é verdade, pois 0 é um índice legítimo que é falsey. O Pip não tem uma maneira curta e interna de testar se um valor é nulo, mas testar seu comprimento funciona bem o suficiente neste caso: qualquer número terá comprimento pelo menos 1 (verdade) e nulo terá comprimento nulo (falsey).fonte