Text to DNA golf
Desafio
Converter entrada em uma saída de DNA.
Algoritmo
- Converter texto em pontos de código ASCII (por exemplo,
codegolf
->[99, 111, 100, 101, 103, 111, 108, 102]
) - Coloque os códigos ASCII juntos (por exemplo
99111100101103111108102
) - Converter em binário (por exemplo
10100111111001101001011010001000011001101011011110000110010111111011000000110
) - Coloque
0
s no final para formar um número par de caracteres (por exemplo101001111110011010010110100010000110011010110111100001100101111110110000001100
) - Substitua
00
porA
,01
porC
,10
comG
e11
comT
(por exemploGGCTTGCGGCCGGAGACGCGGTCTGACGCCTTGTAAATA
) - Saída
Casos de teste
codegolf > GGCTTGCGGCCGGAGACGCGGTCTGACGCCTTGTAAATA
ppcg > GGCTAATTGTCGCACTT
} > TTGG (padding)
Especificações
- Isso é código-golfe
- Seu programa deve aceitar espaços na entrada.
- Seu programa deve funcionar
codegolf
.
code-golf
string
conversion
Ninguém está aqui
fonte
fonte
}
que eu acredito que se tornaTTGG
.99111100101103111108102
por exemplo, é maior que o uint-64, portanto, alguns idiomas podem ter dificuldades com conversões maiores.Respostas:
Geléia ,
1513 bytesExperimente online! ou verifique todos os casos de teste .
Como funciona
fonte
CJam,
2423 bytesAgradecemos a Dennis por economizar 1 byte de uma maneira realmente inteligente. :)
Teste aqui.
Explicação
Implementação muito direta da especificação. A única parte interessante é o preenchimento de um número par de zeros (que na verdade era idéia de Dennis). Em vez de tratar os dígitos de cada par na ordem usual, tornamos o segundo bit o mais significativo. Isso significa que terminar em um único bit é idêntico a acrescentar um zero a ele, o que significa que não precisamos acrescentar o zero.
fonte
Python 2,
109103 bytesTeste em Ideone .
fonte
Ruby, 59 bytes
Um programa completo. Corra com a
-p
bandeira.fonte
Python 3, 130 bytes.
Economizou 2 bytes graças a vaultah.
Economizou 6 bytes graças a Kevin Lau - não a Kenny.
Eu odeio o quão difícil é converter para binário em python.
Casos de teste:
fonte
''.join
'ACGT'[int(z+y,2)]
vez disso, use a conversão diretamente do binário em vez de usar sua string mais longa e a partir da base 10. Além disso, não tenha certeza de quanta diferença isso faria, mas observe o uso emre.sub
vez do seu truque de junção bagunçado?int
. Vou dar uma olhadare.sub
, obrigado pela sugestão.Ruby, 80 bytes
fonte
Mathematica, 108 bytes
Pega uma string como entrada e gera uma lista de bases.
fonte
Python 3, 126 bytes
fonte
Pitão, 25 bytes
Experimente aqui!
Explicação
Burrowing o truque de preenchimento da resposta Martins CJam .
fonte
05AB1E , 23 bytes
Código:
Usa a codificação CP-1252 . Experimente online! .
fonte
Java, 194 bytes
Ungolfed
Nota
int[]
porque esse é um byte salvochar[]
.Saída
fonte
MATL , 21 bytes
Experimente online!
Explicação
fonte
Pitão , 23 bytes
Experimente online!
Explicação
Tomando emprestado o truque da resposta de Dennis 'Jelly .
fonte
Groovy, 114 bytes
Explicação:
fonte
Julia 0.4, 77 bytes
Essa função anônima recebe uma matriz de caracteres como entrada e retorna uma string.
Experimente online!
fonte
Python 2.7, 135 bytes
Ungolfed:
Saída
fonte
g(...)
função lá duas vezes, então acredito que substituí-lo pelojoin
adicionaria 2 bytes?Javascript ES7,
105103 bytesA parte ES7 é a
for(c of s)
parte.Versão ES6,
107105 bytesCódigo ungolfed
Esta é a minha primeira tentativa de jogar golfe no PPCG, sinta-se à vontade para me corrigir se algo estiver errado.
Obrigado @AlexA pela pequena melhoria.
fonte
f=
, economizando 2 bytes. :)J, 52 bytes
Uso:
3 :'''ACGT''{~#._2,\#:".,&''x''":(,&:(":"0))/3&u:y' 'codegolf'
==>GGCTTGCGGCCGGAGACGCGGTCTGACGCCTTGTAAATA
fonte
Lisp comum (Lispworks), 415 bytes
ungolfed:
Uso:
fonte
Perl,
155148137 + 1 (-p
sinalizador) = 138 bytesTeste em Ideone .
fonte
Perl 6, 57 + 1 (
-p
sinalizador) = 58 bytesExplicação passo a passo:
-p
flag faz com que o intérprete Perl 6 execute o código linha por linha, coloque a linha atual$_
e, no final, coloque-o de volta$_
..ords
- Se não houver nada antes de um período, é chamado um método$_
.ords
O método retorna a lista de pontos de código em uma sequência.[~]
-[]
é um operador de redução, que armazena seu operador de redução entre parênteses. Nesse caso,~
é um operador de concatenação de cadeias. Por exemplo,[~] 1, 2, 3
é equivalente a1 ~ 2 ~ 3
.+
converte seu argumento em um número, necessário porque obase
método é definido apenas para números inteiros..base(2)
- converte um número inteiro em uma string na base 2$_=
- atribui o resultado a$_
.s:g/..?/{...}/
- esta é uma expressão regular que substitui qualquer:g
instância..?
( modo global) de regex (um ou dois caracteres). O segundo argumento é um padrão de substituição, que nesse caso no código (no Perl 6, colchetes nas strings e padrões de substituição são executados como código).$/
- uma variável de correspondência de regex.flip
- inverte uma string. Ele converte implicitamente$/
(um objeto de correspondência de regex) em uma string. Isso ocorre porque um único caractere1
deve ser expandido para10
, ao contrário de01
. Por causa dessa inversão, a ordem dos elementos na matriz tem G e C invertidos.:2(...)
- analisa uma string de base 2 em um número inteiro.<A G C T>
- matriz de quatro elementos....[...]
- operador de acesso ao array.O que isso significa? O programa obtém a lista de todos os pontos de código em uma string, concatena-os juntos, converte-os na base 2. Em seguida, substitui todas as instâncias de dois ou um caractere em uma das letras A, G, C, T, dependendo da representação invertida de um número em binário.
fonte
Hoon ,
148138 bytes"abc" é uma lista de átomos. Interpole-os em strings (
<a>
) enquanto dobra a lista, juntando-os em uma nova string. Analise o número com++dem
para retornar ao átomo.Multiplique o número por (comprimento bit a bit + 1)% 2 para preenchê-lo. Use
++rip
para desmontar cada par de dois bytes do átomo em uma lista, mapeie sobre a lista e use o número como índice na cadeia "ACGT".fonte