Zegar (transliteracja) Szyfr

12

Wprowadzenie:

Mam wiele różnych szyfrów przechowywanych w dokumencie, który kiedyś skompilowałem jako dziecko, wybrałem kilka z tych, które moim zdaniem najlepiej nadawały się na wyzwania (niezbyt trywialne i niezbyt trudne) i przekształciłem je w wyzwania. Większość z nich wciąż znajduje się w piaskownicy i nie jestem jeszcze pewien, czy opublikuję je wszystkie, czy tylko kilka. Oto trzeci i najłatwiejszy (po wcześniejszym opublikowaniu szyfru komputerowego i szyfru Trifid ).


Za pomocą Szyfrowania zegara używamy następującego obrazu do szyfrowania tekstu:

wprowadź opis zdjęcia tutaj
Tak więc zdanie takie this is a clock cipherbrzmiałoby:

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

Wyzwanie:

Biorąc pod uwagę ciąg sentence_to_encipher, szyfruj go jak opisano powyżej.

Zasady konkursu:

  • Możesz założyć, że sentence_to_encipherbędą zawierać tylko litery i spacje.
  • Możesz użyć zarówno wielkich, jak i wielkich liter (podaj, którego użyłeś w odpowiedzi).
  • Nie wolno dodawać zer na jednocyfrowe zaszyfrowanych listów bza pośrednictwem j, ale dwa zera 00są obowiązkowe dla przestrzeni.
  • Powinieneś użyć :jako separatora, a dodatkowe wiodące lub końcowe :nie jest dozwolone.
  • Możesz używać małych ami pmzamiast wielkich liter AMoraz PM, o ile jest to spójne.

Główne zasady:

  • To jest , więc wygrywa najkrótsza odpowiedź w bajtach.
    Nie pozwól, aby języki kod-golfowe zniechęcały Cię do publikowania odpowiedzi w językach niekodujących golfa. Spróbuj znaleźć możliwie najkrótszą odpowiedź na „dowolny” język programowania.
  • Do odpowiedzi mają zastosowanie standardowe reguły z domyślnymi regułami We / Wy , więc możesz używać STDIN / STDOUT, funkcji / metody z odpowiednimi parametrami i typem zwracanych, pełnych programów. Twoja decyzja.
  • Domyślne luki są zabronione.
  • Jeśli to możliwe, dodaj link z testem kodu (tj. TIO ).
  • Zalecane jest również dodanie wyjaśnienia do odpowiedzi.

Przypadki testowe:

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
źródło
Powiązane
Kevin Cruijssen
Dopuszczalne jest wyjście [7, ":", 8, ":", "00", ":", 1, ":", 14, ":", 1]do hi bob, lub należy dołączyć wynik? Nawiasem mówiąc, zgrabny szyfr!
Pan Xcoder
@ Mr.Xcoder Przepraszam, ze względu na motyw szyfru powiedziałbym, że powinien on być połączony z jednym ciągiem znaków (lub całą tą listą jako lista znaków takich jak ['7', ':', '8', ':', '0', '0', ':', '1', ':', '1', '4', ':', '1']).
Kevin Cruijssen

Odpowiedzi:

6

Python 2 , 74 72 bajty

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

Wypróbuj online!

Pobiera dane wejściowe jak wszystkie małe litery

TFeld
źródło
5

05AB1E , 22 21 bajtów

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

Wypróbuj online! lub jako pakiet testowy

Niektóre alternatywne rozwiązania 21- bajtowe:

':ýAð«24L„AMš„PMª00ª‡
00„AM24L„PM)˜AIk>è':ý
Emigna
źródło
Dobra odpowiedź, udało mi się uzyskać 23 bajty wieloma podejściami (jednym z nich była moja obecnie usunięta odpowiedź). To fajny sposób na uporządkowanie stosu, aby zaoszczędzić bajt!
Pan Xcoder
1
Alternatywny 22 bajter łączący nasze odpowiedzi: Wypróbuj online!
Pan Xcoder
@ Mr.Xcoder: Mój pierwszy pomysł faktycznie tak wyglądał, ale 2 bajty gorzej, bo nie pamiętam, że ªto się zmieniło :)
Emigna
Znalazłem 20 bajterów wykorzystujących część podejścia @ Mr.Xcodera , ale pozwolę ci to rozgryźć przed ujawnieniem. :)
Kevin Cruijssen
1
@KevinCruijssen: Dam ci znać po tym, jak spojrzałem trochę więcej;)
Emigna
4

Perl 6 , 47 bajtów

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

Wypróbuj online!

Anonimowy Bez względu na lambda, która pobiera ciąg obu przypadków i zwraca zaszyfrowany ciąg.

Wyjaśnienie:

*.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
źródło
3

Pyth, 25 bajtów

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

Spróbuj go online tutaj , lub sprawdzić wszystkie przypadki testowe od razu tutaj .

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
źródło
3

Java (JDK) , 95 bajtów

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

Wypróbuj online!

Kredyty

  • -1 bajt dzięki Kevin Cruijssen
Olivier Grégoire
źródło
Jeden łatwy golf: chardo var. :)
Kevin Cruijssen
Dzięki! Teraz to takie oczywiste, że mi to pokazujesz ...
Olivier Grégoire,
3

C # (interaktywny kompilator Visual C #) , 70 bajtów

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

Pobiera dane wejściowe jako ciąg małych liter. Najpierw sprawdza, czy znak jest spacją, a jeśli tak, konwertuje go na 00. Następnie sprawdza, czy znak jest literą A, i konwertuje go na AM. Sprawdza ponownie Z i konwertuje go, PMjeśli tak jest. Na koniec, jeśli znak przejdzie wszystkie testy, zostanie przekonwertowany na kolejność alfabetyczną-1.

-2 bajty dzięki @dana

Wypróbuj 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 + ""))
Wcielenie ignorancji
źródło
2

Rubinowy , 49 bajtów

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

Wypróbuj online!

Odpowiedź Portu Jo Kinga Perla . Pobiera dane wejściowe jako tablicę znaków, zwraca ciąg z AM / PM dużymi literami.

Kirill L.
źródło
2

Czerwony , 124 121 110 109 bajtów

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

Wypróbuj online!

Galen Iwanow
źródło
2

05AB1E , 20 bajtów

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

Znacznie zainspirowany @ Mr.Xcoder „s 22-byter w komentarzu istniejącego 05AB1E Odpowiedź @Emigna .

Pobiera dane wejściowe jako listę małych liter (byłoby 21 bajtów z wiodącym, Sjeśli wezmę dane jako ciąg znaków).

Wypróbuj online lub sprawdź wszystkie przypadki testowe .

Wyjaśnienie:

':ý            '# 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
źródło
1
O tak. Zastąpienie miejsca osobno oszczędza bajt. Powinienem był spróbować. Fajnie :)
Emigna
1

Tcl , 100 bajtów

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

Wypróbuj online!

sergiol
źródło
1

C # (interaktywny kompilator Visual C #) , 98 bajtów

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

Pobiera dane wejściowe jako tablicę znaków (małymi literami). Wypróbuj online!

mój zaimek to monicareinstate
źródło
82 bajtów: s=>string.Join(':',s.Select(c=>new[]{c-97+"","AM","PM","00"}["az ".IndexOf(c)+1])).
dana
1

Węgiel drzewny , 26 bajtów

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

Wypróbuj online! Link jest do pełnej wersji kodu. Pobiera dane pisane małymi literami (można w prosty sposób zmienić na wielkie litery). Wyjaśnienie:

UB:

Ustaw znak tła na :. Wypełnia to luki między wartościami wyjściowymi utworzonymi przez właściwy ruch.

Fθ«→

Pętla nad każdą postacią, za każdym razem pozostawiając odstęp. (Pierwszy ruch nie działa, ponieważ płótno jest w tym momencie puste.)

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

Włącz znak i jeśli jest to spacja, alub zwyślij odpowiedni kod. Używam ×0²zamiast tego 00, ponieważ ten ostatni kosztowałby dwa bajty w dodatkowych separatorach.

I⌕βι

W przeciwnym razie wypisz zindeksowaną pozycję litery w małym alfabecie jako ciąg.

Neil
źródło