Clock (transliterate) Cipher

12

Pengantar:

Saya memiliki banyak cipher yang berbeda yang disimpan dalam dokumen yang pernah saya kompilasi sebagai seorang anak, saya memilih beberapa yang saya pikir paling cocok untuk tantangan (tidak terlalu sepele, dan tidak terlalu keras) dan mengubahnya menjadi tantangan. Sebagian besar dari mereka masih berada di kotak pasir, dan saya belum yakin apakah saya akan memposting semuanya, atau hanya beberapa. Ini yang ketiga dan termudah (setelah Computer Cipher dan Trifid Cipher yang saya posting sebelumnya).


Dengan Clock Cipher, kami menggunakan gambar berikut untuk menyandikan teks:

masukkan deskripsi gambar di sini
Jadi kalimat seperti this is a clock ciphermenjadi:

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

Tantangan:

Diberikan string sentence_to_encipher, enkripsinya seperti dijelaskan di atas.

Aturan tantangan:

  • Anda dapat mengasumsikan surat sentence_to_encipherwasiat tersebut hanya berisi huruf dan spasi.
  • Anda dapat menggunakan huruf besar atau huruf besar penuh (sebutkan mana yang Anda gunakan dalam jawaban).
  • Anda tidak diperbolehkan menambahkan nol di depan untuk huruf b- huruf terenkripsi tunggal j, tetapi dua nol 00wajib untuk spasi.
  • Anda harus menggunakan :sebagai pemisah, dan tambahan atau jejak tambahan :tidak diizinkan.
  • Anda diperbolehkan menggunakan huruf kecil amdan pmbukannya huruf besar AMdan PM, selama itu konsisten.

Aturan umum:

  • Ini adalah , jadi jawaban tersingkat dalam byte menang.
    Jangan biarkan bahasa kode-golf mencegah Anda memposting jawaban dengan bahasa non-codegolf. Cobalah untuk memberikan jawaban sesingkat mungkin untuk bahasa pemrograman 'apa pun'.
  • Aturan standar berlaku untuk jawaban Anda dengan aturan I / O default , sehingga Anda diizinkan untuk menggunakan STDIN / STDOUT, fungsi / metode dengan parameter yang tepat dan tipe pengembalian, program penuh. Panggilanmu.
  • Celah default tidak diperbolehkan.
  • Jika memungkinkan, silakan tambahkan tautan dengan tes untuk kode Anda (yaitu TIO ).
  • Juga, menambahkan penjelasan untuk jawaban Anda sangat dianjurkan.

Kasus uji:

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
sumber
Terkait
Kevin Cruijssen
Apakah diperbolehkan untuk output [7, ":", 8, ":", "00", ":", 1, ":", 14, ":", 1]untuk hi bob, atau harus satu bergabung hasilnya? Omong-omong, sandi rapi!
Tn. Xcoder
@ Mr.Xcoder Maaf, demi tema sandi saya akan mengatakan itu harus digabungkan ke string tunggal (atau semuanya sebagai daftar karakter seperti ['7', ':', '8', ':', '0', '0', ':', '1', ':', '1', '4', ':', '1']).
Kevin Cruijssen

Jawaban:

6

Python 2 , 74 72 byte

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

Cobalah online!

Mengambil input karena semua huruf kecil

TFeld
sumber
5

05AB1E , 22 21 byte

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

Cobalah online! atau sebagai Test Suite

Beberapa solusi 21 byte alternatif :

':ýAð«24L„AMš„PMª00ª‡
00„AM24L„PM)˜AIk>è':ý
Emigna
sumber
Jawaban yang bagus, saya berhasil mendapatkan 23 byte melalui beberapa pendekatan (salah satunya adalah jawaban saya yang saat ini dihapus). Itu cara yang rapi untuk mengatur tumpukan Anda untuk menghemat satu byte!
Tn. Xcoder
1
Byter 22 alternatif yang menggabungkan jawaban kami: Cobalah secara Online!
Tn. Xcoder
@ Mr.Xcoder: Ide pertama saya benar-benar terlihat seperti itu, tetapi 2 byte lebih buruk karena saya tidak ingat yang ªtelah berubah :)
Emigna
Saya telah menemukan 20 byter menggunakan sebagian dari pendekatan @ Mr.Xcoder , tapi saya akan membiarkan Anda mencari tahu sendiri sebelum saya mengungkapkannya. :)
Kevin Cruijssen
1
@KevinCruijssen: Saya akan memberi tahu Anda setelah saya mencari lagi;)
Emigna
4

Perl 6 , 47 byte

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

Cobalah online!

Anonim Apapun lambda yang mengambil string dari kedua case dan mengembalikan string yang dienkripsi.

Penjelasan:

*.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
Jo King
sumber
3

Pyth, 25 byte

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

Coba online di sini , atau verifikasi semua uji sekaligus di sini .

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
sumber
3

Java (JDK) , 95 byte

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

Cobalah online!

Kredit

  • -1 byte terima kasih kepada Kevin Cruijssen
Olivier Grégoire
sumber
Satu golf mudah: charuntuk var. :)
Kevin Cruijssen
Terima kasih! Sangat jelas sekarang bahwa Anda menunjukkannya kepada saya ...
Olivier Grégoire
3

C # (Visual C # Interactive Compiler) , 70 byte

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

Mengambil input sebagai string huruf kecil. Pertama memeriksa apakah char adalah spasi, dan jika itu, mengubahnya menjadi 00. Selanjutnya, ia memeriksa apakah char adalah A, dan mengubahnya menjadi AM. Ia memeriksa lagi untuk Z dan mengubahnya menjadi PMjika itu. Terakhir, jika char melewati semua cek, ia akan dikonversi ke urutan abjad-1.

-2 byte terima kasih kepada @dana

Cobalah 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 + ""))
Perwujudan Ketidaktahuan
sumber
2

Ruby , 49 byte

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

Cobalah online!

Port of Jo King's Perl menjawab . Mengambil input sebagai array karakter, mengembalikan string dengan AM / PM dalam huruf besar.

Kirill L.
sumber
2

Merah , 124 121 110 109 byte

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

Cobalah online!

Galen Ivanov
sumber
2

05AB1E , 20 byte

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

Sangat terinspirasi oleh 22-byter @ Mr.Xcoder dalam komentar dari jawaban 05AB1E yang ada oleh @Emigna .

Mengambil input sebagai daftar karakter huruf kecil (akan menjadi 21 byte dengan yang terdepan Sjika saya mengambil input sebagai string).

Cobalah secara online atau verifikasi semua kasus uji .

Penjelasan:

':ý            '# 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
sumber
1
Ah iya. Mengganti ruang secara terpisah menghemat satu byte. Aku seharusnya mencobanya. Bagus :)
Emigna
1

Tcl , 100 byte

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

Cobalah online!

sergiol
sumber
1

C # (Visual C # Interactive Compiler) , 98 byte

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

Mengambil input sebagai array karakter (huruf kecil). Cobalah online!

kata ganti saya adalah monicareinstate
sumber
82 byte: s=>string.Join(':',s.Select(c=>new[]{c-97+"","AM","PM","00"}["az ".IndexOf(c)+1])).
dana
1

Arang , 26 byte

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

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Mengambil input dalam huruf kecil (dapat dengan mudah diubah menjadi huruf besar). Penjelasan:

UB:

Setel karakter latar belakang ke :. Ini mengisi celah antara nilai-nilai output yang dibuat oleh gerakan yang benar.

Fθ«→

Ulangi setiap karakter, sisakan celah setiap kali. (Langkah pertama tidak berpengaruh karena kanvas masih kosong pada saat ini.)

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

Aktifkan karakter dan jika itu ruang, aatau zkemudian output kode yang sesuai. Saya menggunakan ×0²bukannya di 00sini karena yang terakhir akan menelan biaya dua byte di pemisah tambahan.

I⌕βι

Kalau tidak, output posisi 0-huruf diindeks dalam huruf kecil sebagai string.

Neil
sumber
0

Jelly , 24 byte

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

Cobalah online!

Erik the Outgolfer
sumber