Relógio (transliterado) Cifra

12

Introdução:

Tenho muitas cifras diferentes armazenadas em um documento que compilei quando criança, escolhi algumas das que achei mais adequadas para desafios (não muito triviais e nem muito difíceis) e as transformei em desafios. A maioria deles ainda está na caixa de areia, e ainda não tenho certeza se vou postar todos, ou apenas alguns. Aqui está o terceiro e mais fácil (depois da Cifra para Computador e da Trifid que eu postei anteriormente).


Com uma cifra de relógio, usamos a seguinte imagem para codificar texto:

insira a descrição da imagem aqui
Assim, uma frase como this is a clock cipherse tornaria:

t  h i s     i s     a     c l  o  c k     c i p  h e r    (without additional spaces of course, but added as clarification)
19:7:8:18:00:8:18:00:AM:00:2:11:14:2:10:00:2:8:15:7:4:17

Desafio:

Dada uma string sentence_to_encipher, codifique-a como descrito acima.

Regras do desafio:

  • Você pode assumir sentence_to_encipherque conterá apenas letras e espaços.
  • Você pode usar letras minúsculas ou maiúsculas completas (indique qual delas você usou na sua resposta).
  • Você não tem permissão para adicionar zeros à esquerda para as letras de um dígito enciphered batravés j, mas dois zeros 00são obrigatórias para os espaços.
  • Você deve usar :como separador, e :não é permitido um início ou final adicional .
  • Você tem permissão para usar letras minúsculas ame pmnão maiúsculas AMe PM, desde que seja consistente.

Regras gerais:

  • Isso é , então a resposta mais curta em bytes vence.
    Não permita que idiomas com código de golfe o desencorajem a postar respostas com idiomas que não sejam codegolf. Tente encontrar uma resposta o mais curta possível para 'qualquer' linguagem de programação.
  • As regras padrão se aplicam à sua resposta com as regras de E / S padrão , para que você possa usar STDIN / STDOUT, funções / método com os parâmetros adequados e programas completos do tipo retorno. Sua chamada.
  • As brechas padrão são proibidas.
  • Se possível, adicione um link com um teste para o seu código (ou seja, TIO ).
  • Além disso, é altamente recomendável adicionar uma explicação para sua resposta.

Casos de teste:

Input:  "this is a clock cipher"
Output: "19:7:8:18:00:8:18:00:AM:00:2:11:14:2:10:00:2:8:15:7:4:17"

Input:  "test"
Output: "19:4:18:19"

Input:  "what time is it"
Output: "22:7:AM:19:00:19:8:12:4:00:8:18:00:8:19"

Input:  "acegikmoqsuwy bdfhjlnprtvxz"
Output: "AM:2:4:6:8:10:12:14:16:18:20:22:24:00:1:3:5:7:9:11:13:15:17:19:21:23:PM"

Input:  "easy peazy"
Output: "4:AM:18:24:00:15:4:AM:PM:24"
Kevin Cruijssen
fonte
Relacionado
Kevin Cruijssen
É permitido para a saída [7, ":", 8, ":", "00", ":", 1, ":", 14, ":", 1]para hi bob, ou tem um juntar o resultado? A propósito, cifra legal!
Mr. Xcoder
@ Mr.Xcoder Desculpe, pelo bem do tema cifrado, eu diria que ele deveria estar associado a uma única string (ou a coisa toda como uma lista de caracteres como ['7', ':', '8', ':', '0', '0', ':', '1', ':', '1', '4', ':', '1']).
Kevin Cruijssen

Respostas:

6

Python 2 , 74 72 bytes

lambda s:':'.join(['AM','PM','00',`ord(c)-97`]['az '.find(c)]for c in s)

Experimente online!

Recebe entrada como todas as minúsculas

TFeld
fonte
5

05AB1E , 22 21 bytes

„AM24L„PM00)˜Að«s‡':ý

Experimente online! ou como um conjunto de testes

Algumas soluções alternativas de 21 bytes:

':ýAð«24L„AMš„PMª00ª‡
00„AM24L„PM)˜AIk>è':ý
Emigna
fonte
Boa resposta, consegui obter 23 bytes através de várias abordagens (uma das quais era a minha resposta excluída no momento). Essa é uma maneira elegante de organizar sua pilha para salvar um byte!
Xcoder
1
Um byter alternativo de 22 caracteres que combina nossas respostas: Experimente on-line!
Mr. Xcoder
@ Mr.Xcoder: Minha primeira idéia realmente parecia assim, mas 2 bytes pior, porque eu não me lembrava que ªtinha mudado :)
Emigna
Eu encontrei um byter de 20 usando uma parte da abordagem do @ Mr.Xcoder , mas eu vou deixar você descobrir por si mesmo antes de revê-lo. :)
Kevin Cruijssen
1
@KevinCruijssen: Avisarei depois que eu tiver procurado um pouco mais;)
Emigna
4

Perl 6 , 47 bytes

*.ords>>.&{<<00 AM{1..24}PM>>[$_%32]}.join(":")

Experimente online!

Anônimo Qualquer que seja o lambda que pega uma sequência de ambos os casos e retorna a sequência criptografada.

Explicação:

*.ords>>.&{                         } # Map the ordinal values to
           <<              >>[$_%32]  # The index in the list
              00 AM{1..24}PM  # 00, AM, the numbers 1 to 24 and PM
                                     .join(":")   # And join with colons
Brincadeira
fonte
3

Pitão, 25 bytes

j\:m@+++"AM"S24"PM""00"xG

Experimente online aqui ou verifique todos os casos de teste de uma vez aqui .

j\:m@+++"AM"S24"PM""00"xGdQ   Implicit: Q=eval(input()), G=lowercase alphabet
                              Trailing dQ inferred
            S24               [1-24]
       +"AM"                  Prepend "AM"
      +        "PM"           Append "PM"
     +             "00"       Append "00" - this is the dictionary
   m                      Q   Map each element of Q, as d, using:
                       xGd      Get the index of d in G, -1 if not present (i.e. space)
    @                           Get the element from the dictionary at the above index
j\:                           Join the result on ":", implicit print
Sok
fonte
3

Java (JDK) , 95 bytes

s->{int a=0;for(var c:s)System.out.print((a++<1?"":":")+(c<33?"00":c<66?"AM":c>89?"PM":c-65));}

Experimente online!

Créditos

  • -1 byte graças a Kevin Cruijssen
Olivier Grégoire
fonte
Um golfe fácil: charpara var. :)
Kevin Cruijssen
Obrigado! Tão óbvio agora que você mostrá-lo para mim ...
Olivier Grégoire
3

C # (compilador interativo do Visual C #) , 70 bytes

s=>string.Join(":",s.Select(a=>a<33?"00":a<66?"AM":a>89?"PM":a%65+""))

Recebe a entrada como uma sequência de letras minúsculas. Primeiro, verifica se o caractere é um espaço e, se for, converte-o em 00. Em seguida, verifica se o caractere é um A e o converte em AM. Ele verifica novamente o Z e o converte em PMse estiver. Por fim, se o caractere passar em todas as verificações, ele será convertido em sua ordem alfabética-1.

-2 bytes graças a @dana

Experimente online!

// Input taking a string
s => 
// Join the following IEnumerable<char> with a ":" character
string.Join(":", 
// Map all the characters in the string
s.Select(a => 
// Is the char less than 33, aka a space?
a < 33 ? 
// If so, it's a "00"
"00" 
// Else, is this an 'A'?
: a < 66 ?
// If so, convert it to "AM"
"AM" : 
// If it's not 'A' or a space, could it be a 'Z'?
a > 89 ?
// If it is, turn the character into "PM"
"PM" : 
// If it fails all of the checks above, get the characters position in the alphabet and subtract one from that.
a % 65 + ""))
Modalidade de ignorância
fonte
2

Ruby , 49 bytes

->a{a.map{|c|["00",:AM,*1..24,:PM][c.ord%32]}*?:}

Experimente online!

Resposta Perl do porto de Jo King . Recebe a entrada como uma matriz de caracteres, retorna uma string com AM / PM em maiúsculas.

Kirill L.
fonte
2

Vermelho , 124 121 110 109 bytes

func[s][replace/all form collect[forall s[keep switch/default
c: -97 + s/1[0['AM]25['PM]-65["00"]][c]]]sp":"]

Experimente online!

Galen Ivanov
fonte
2

05AB1E , 20 bytes

':ýð00:A24L„AMš„PMª‡

Muito inspirado por @ Mr.Xcoder 22 Byter 's no comentário do 05AB1E resposta existente por @Emigna .

Aceita a entrada como uma lista de caracteres em minúsculas (seria 21 bytes com um avanço, Sse eu pegar a entrada como uma string).

Experimente online ou verifique todos os casos de teste .

Explicação:

':ý            '# Join the (implicit) input list of characters by ":"
                #  i.e. ["e","a","s","y"," ","p","e","a","z","y"] → "e:a:s:y: :p:e:a:z:y"
ð00:            # Replace all spaces " " with "00"
                #  i.e. "e:a:s:y: :p:e:a:z:y" → "e:a:s:y:00:p:e:a:z:y"
A               # Push the lowercase alphabet
 24L            # Push a list in the range [1,24]
    AMš        # Prepend "AM" at the start of this list
        PMª    # And append "PM" at the end of the list
               # Transliterate; mapping letters to the list-items at the same indices
                # (and output the result implicitly)
                #  i.e. "e:a:s:y:00:p:e:a:z:y" → "4:AM:18:24:00:15:4:AM:PM:24"
Kevin Cruijssen
fonte
1
Ah sim. Substituir o espaço separadamente economiza um byte. Eu deveria ter tentado isso. Nice :)
Emigna
1

Tcl , 100 bytes

proc C s {join [lmap c [split $s ""] {scan $c %c v
expr $v==65?"AM":$v==90?"PM":$v==32?00:$v-65}] :}

Experimente online!

sergiol
fonte
1

C # (compilador interativo do Visual C #) , 98 bytes

s=>string.Join(':',s.Select(c=>"az ".Contains(c)?new[]{"AM","PM","00"}["az ".IndexOf(c)]:c-97+""))

Recebe a entrada como uma matriz de caracteres (minúscula). Experimente online!

meu pronome é monicareinstate
fonte
82 bytes: s=>string.Join(':',s.Select(c=>new[]{c-97+"","AM","PM","00"}["az ".IndexOf(c)+1])).
dana
1

Carvão , 26 bytes

UB:Fθ«→≡ι ×0²a¦AM¦z¦PMI⌕βι

Experimente online! Link é a versão detalhada do código. Recebe entrada em letras minúsculas (pode ser trivialmente alterado para maiúsculas). Explicação:

UB:

Defina o caractere de plano de fundo para :. Isso preenche as lacunas entre os valores de saída criados pelo movimento certo.

Fθ«→

Passe por cada caractere, deixando um espaço a cada vez. (O primeiro movimento não tem efeito, pois a tela ainda está vazia neste momento.)

≡ι ×0²a¦AM¦z¦PM

Ative o caractere e, se for espaço, aou zemita o código apropriado. Eu uso em ×0²vez de 00aqui, pois o último custaria dois bytes em separadores adicionais.

I⌕βι

Caso contrário, imprima a posição indexada em 0 da letra no alfabeto em minúsculas como uma sequência.

Neil
fonte
0

Gelatina , 24 bytes

«"⁾PMµØAḊiȯ⁾00µe?€⁾AZj”:

Experimente online!

Erik, o Outgolfer
fonte