Hadi Şifreleyelim!


12

Meydan okuma

Zorluk, aşağıda belirtilen kuralları kullanarak belirli bir dizeyi şifrelemektir. Dize yalnızca küçük harfler , rakamlar ve / veya boşluklar içerecektir .

Bir Karakterin Eşdeğeri

Şimdi, öncelikle her karakterin "eşdeğerini" nasıl bulacağınızı bilmeniz gerekir.

Karakter bir ünsüz ise, bu eşdeğerini bulmanın yolu budur:

1) List all the consonants in alphabetical order
    b c d f g h j k l m n p q r s t v w x y z
2) Get the position of the consonant you are finding the equivalent of.
3) The equivalent is the consonant at that position when starting from the end.

örneğin: 'h' ve 't' birbirlerinin eşdeğerleridir çünkü 'h', 't' sırasıyla başlangıç ​​ve bitişten 6. konumdadır.

Sesli harflerin / rakamların eşdeğerini bulmak için aynı prosedür izlenir. Tüm sesli harfleri veya rakamları (0'dan başlayarak) sırayla listeler ve eşdeğerini bulursunuz.

Aşağıda tüm karakterlerin eşdeğerlerinin listesi verilmiştir:

b <-> z
c <-> y
d <-> x
f <-> w
g <-> v
h <-> t
j <-> s
k <-> r
l <-> q
m <-> p
n <-> n

a <-> u
e <-> o
i <-> i

0 <-> 9
1 <-> 8
2 <-> 7
3 <-> 6
4 <-> 5

Şifreleme Kuralları

1) Soldan hareket etmeye başlıyorsunuz ve sağa doğru gidiyorsunuz.

2) Karakter bir ünsüz / rakamsa, eşdeğeri alınır ve boşluksa, boşluk alınır.

3) Karakter bir sesli harf ise, eşdeğerini alır ve ters yönde hareket etmeye başlarsınız. Örneğin, sağa hareket ediyorsanız ve bir sesli harfle karşılaşıyorsanız, bu karakteri şifreleyin, ardından en sağdaki şifrelenmemiş karaktere atlayın ve sol yönde şifrelemeye başlayın (veya tersi).

4) Bir karakteri aynı pozisyonda iki kez düşünmemelisiniz. Girişteki tüm karakterler kapsanana kadar adımlar takip edilmelidir.

5) Girişteki toplam karakter sayısı (boşluklar dahil) çıktıdaki toplam karakter sayısına eşit olmalıdır.

Şifrelenmiş karakterlerin çıktıda şifrelendikleri sırayla göründüğünü lütfen unutmayın.

Şimdi senin için bir dize şifreleyeyim.

String = "tre d1go3t is"
Moving left to right
"t" -> "h"
"r" -> "k"
"e" -> "o"
Vowel encountered. Now moving right to left.
"s" -> "j"
"i" -> "i"
Vowel encountered. Now moving left to right.
" " -> " "
"d" -> "x"
"1" -> "8"
"g" -> "v"
"o" -> "e"
Vowel encountered. Now moving right to left.
" " -> " "
"t" -> "h"
"3" -> "6"

Output -> "hkoji x8ve h6"

Örnekler

"flyspy" -> "wqcjmc"
"hero" -> "toek"
"heroic" -> "toyike"
"ae" -> "uo"
"abe" -> "uoz"
"the space" -> "htoo jmuy"
"a d1g13t" -> "uh68v8x "
"we xi12" -> "fo78i d"
"this is a code" -> "htioj ixej uy "

Küçük harf yerine büyük harfli alfabe kullanmayı da seçebilirsiniz.

puanlama

Bu , bu yüzden en kısa kod kazanır!


1
Adım 3, yön değiştirme ile ilgili olarak biraz belirsizdir. Sanırım "Sağa doğru hareket ediyorsanız ve bir sesli harfle karşılaşıyorsanız, bu karakteri şifreleyin, sonra en sağdaki şifrelenmemiş karaktere atlayın ve sol yönde şifrelemeye başlayın" gibi bir şey söylemelisiniz. (Demek istediğin buysa). Ayrıca, şifrelenmiş karakterlerin çıktıda şifrelendikleri sırayla göründüğünü açıkça belirtmeniz gerektiğini düşünüyorum.
dylnan

@dylnan Bunu ekledi.
Manish Kundu

Sadece meraktan - Şifre çözme prosedürünü tarif edebilir misiniz? Şifreleme işlevi kendi tersi olmadığından (ROT13 algo'da olduğu gibi). Dolayısıyla, şifrelenmiş verileri aynı şifreleme prosedürüne geçirirsek - orijinal metni alamayacağız. Teşekkürler
Agnius Vasiliauskas

1
@AgniusVasiliauskas: Bunu yapmanın bir yolu şudur: Aynı karakter dönüşümlerini uygulayın. 2 şifresini çözmek dizeleri. Sağdan sola doğru dizginin üzerinden geçin. İlk harf için karakter ekleme ve her sesli harf kullandığınızda ikinciye ekleme arasında geçiş yapın. Sonunda dizeleri birleştir.
Emigna

3
Yakında aynısını çözmek için bir şifre çözme zorluğu olacak, burada süreci açıklamaya çalışacağım
Manish Kundu

Yanıtlar:


4

JavaScript (node.js) , 173 ... 166 156 ... 124 123 bayt

-28 bayt Teşekkürler Arnauld

f=([q,...s])=>q?(c="aeioubcdfghjklmpqrstvwxyz",t=c.search(q),q=="0"|+q?9-q:~t?c[(t<5?4:29)-t]:q)+f(~t&&t<5?s.reverse():s):s

Çevrimiçi deneyin!

İlk yinelemede bu String, olarak değiştirilecek Arrayve sonraki yinelemeler kullanılmaya devam edecektir Array. Voila

Orijinal Yaklaşım (166 bayt):

f=(s,i=0,r=s.length,d=1,c="bcdfghjklmnpqrstvwxyz",v="aeiou")=>(d^=!!(t=~v.search(q=s[d?i:r])),q<"0"|q>"9"?c[20-c.search(q)]||v[5+t]||q:9-q)+(i<r-1?f(s,i+d,r-!d,d):"")

&bazı numaralar için çalışmadı ama &&çalıştı. Teşekkürler.
Shieru Asakoto

Oh evet, bunu optimize etmek için bir yöntem bulamadım ve sen yaptın! Teşekkürler!
Shieru Asakoto

3
124 bayt , tüm harfler için aynı dizeyi kullanarak ve biraz daha golf uygulayarak.
Arnauld

Vay canına! Tüm dizeleri birleştirmeyi düşünmedim
Shieru Asakoto

q=="0"|+qaslında 1 bayt daha kısadır q>" "&&1/q.
Arnauld

3

05AB1E , 22 bayt

vćžN‡žM‡žh‡D?žMsåiR

Çevrimiçi deneyin! veya Test takımı olarak

açıklama

v                        # for each char in input
 ć                       # extract the head of the current string (initially input)
  žN‡                   # transform consonants
      žM‡               # transofrm vowels
          žh‡           # transform numbers
              D?         # print a copy of the current char
                žMsåi    # if the current char is a vowel
                     R   # reverse the rest of the string

žhžMžN)UvćXJXíJ‡D?žMsåiRgelişme için düşündüğüm şeydi, ama XJXiJyeterince kesemiyorum.
Sihirli Ahtapot Urn

@MagicOctopusUrn: Ben de DJsíJpek etkili olmayan benzer bir fikrim vardı .
Emigna

1

C, 196 bayt

#define C(k,m)for(i=m;i--;)k[i]-c||putchar(k[m+~i],r^=m==5);
r;p(c,i){C("bcdfghjklmnpqrstvwxyz",21)C("0123456789",10)C("aeiou",5)C(" ",1)}f(S){char*s=S,*t=s+strlen(s);for(r=1;s<t;)p(r?*s++:*--t);}

Çevrimiçi deneyin!


1

J , 132 bayt

f=:3 :0
c=.(u:97+i.26)-.v=.'aeiou'
d=.u:48+i.10
g=.;"0|.
a=.''
while.*#y do.a=.a,{.y rplc(g c),(g d),g v
y=.|.^:({:a e.v)}.y
end.a
)

Çevrimiçi deneyin!

Bu kez ayrıntılı bir fiil.

Açıklama:

c=.(u:97+i.26) bir liste yapar az

v=.'aeiou' ünlülerin bir listesini yapar

-. ünlüleri harf listesinden çıkarır

d=.u:48+i.10 rakamların bir listesini yapar

g=.;"0|. kutulu ikame sembollerinin bir listesini oluşturmak için bir yardımcı fiil

   g d
┌─┬─┐
│0│9│
├─┼─┤
│1│8│
├─┼─┤
│2│7│
├─┼─┤
│3│6│
├─┼─┤
│4│5│
├─┼─┤
│5│4│
├─┼─┤
│6│3│
├─┼─┤
│7│2│
├─┼─┤
│8│1│
├─┼─┤
│9│0│
└─┴─┘

a=.'' sonucu saklamak için bir liste

while.*#y do.a=.a,{.y rplc(g c),(g d),g v listenin uzunluğu> 0 iken bir sembol alın, değiştirin ve sonuca ekleyin

y=.|.^:({:a e.v)}.y listenin başından bir sembol bırakın ve sembol sesli harfse listeyi ters çevirin

end.whiledöngüyü bitirir

a sonucu döndürür


1

Temiz , 221 206 198 190 186 178 bayt

import StdEnv
r=reverse
l=['bcdfghjklm01234aeou56789pqrstvwxyz']
$s#(a,b)=span(\e=all((<>)e)['aeiou'])s
|s>[]=[j\\e<-a++b%(0,0),i<-['in ':l]&j<-['in ':r l]|e==i]++ $(init(r b))=s

Çevrimiçi deneyin!


0

Retina , 78 bayt

T`dl`9-0uz-x\ow-vtis-pnem-j\hagfd-b
/[aeiou]/{*>0L`.*?[aeiou]
0`.*?[aeiou]

V`

Çevrimiçi deneyin! Bağlantı, test senaryolarını içerir. Açıklama:

T`dl`9-0uz-x\ow-vtis-pnem-j\hagfd-b

Her karakteri eşdeğeriyle değiştirin.

/[aeiou]/{

Sesli harf kalırken tekrarlayın.

*>0L`.*?[aeiou]

Seslendirmeye kadar metin çıktısı alın.

0`.*?[aeiou]

Sesli harf olana kadar metni silin.

V`

Kalan metni ters çevirin. Hiç sesli harf kalmadığında, bu daha sonra dolaylı olarak çıkarılır, ancak test senaryolarının amaçları için, başlık her satırın sonunda metni çıkarır.


0

Stax , 24 bayt

╥j•td╢Ä;Sµ*ûⁿvÉ╫î▓J o╩π╗

Çalıştır

İşte aynı programın ascii temsili.

VcGVdGVvGwB]qVvs#!Hv*c}cr\$|t

Önce her karakter sınıfını çevirir, sonra bir while döngüsü başlatır. Döngüde, bir sonraki karakteri verir ve bir sesli harfle karşılaşılırsa dizenin geri kalanını koşullu olarak tersine çevirir.

VcG                             Push lowercase consonants and jump to trailing }
   VdG                          Push digits and jump to trailing }
      VvG                       Push lowercase vowels and jump to trailing }
         wB]qVvs#!Hv*c          While; run this block until popped value is falsy
          B]                    Split first character off string 
            q                   Output with no newline; keep on the stack
             Vvs#               1 if letter is a vowel, 0 otherwise
                 !Hv            Not, Double, then Decrement
                                    -1 for vowels, 1 otherwise
                    *           Multiply string. -1 causes reversal       
                     c          Copy value to be popped as while condition
                      }         Jump target from above.  Return when done.
                       cr\$     Copy, reverse, zip, and flatten.
                           |t   Translate: use string as a character map
                                    for replacements
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.