def enc(k, m)
code_a = 97
kosu = 26
leng = m.length
a = m.unpack("C*")
b = Array.new(leng)
sa = Array.new(leng)
for i in 0..leng-1
sa[i] = a[i] - code_a
if 0 <= sa[i] && sa[i] < kosu
for n in 0..k-1
if (sa[i] + (26*n))%3 == 0
sa[i] = (sa[i] + (26*n)) /3
end
end
end
b[i] = sa[i] + code_a
end
c = b.pack("C*")
return(c)
end
k = 3
hirabun = gets.chomp
angobun = enc(k, hirabun)
puts(angobun)
이게 복호화 프로그램이거든?
암호화프로그램은, 알파벳소문자 a,b,c,d,....w,x,y,z를 0,1,2,3,....,25로 번호매김해서 곱하기3씩 한 위치로 바꿔준건데
이걸 다시 복호화 프로그램을 만들려하니까
아무리생각해도 저 식에서 뭐가 틀렸는지 모르겠는데
abcdefghijklmnopqrstuvwxyz를 암호화 프로그램에 넣었더니 adgjmpsvybehknqtwzcfilorux가 되는데 이걸 다시 위에 써놓은 프로그램에 쳐넣으니까 adgjmpsvybehknqtwzcfilorux(abcdefg....xyz가 나와야되는데)가 나오네
도대체 뭐가틀린거야...? 아무리 눈씻고 찾아봐도 틀린곳이 없는데
p.s. %, /할때 k로 하니까 짜증나게 zerodivisi가 뜨는데 어차피 저거 k가 0아닐때만 하게되는데도 왜 이딴게 뜨는거지? 안뜨게할수없어?
혹시 사용하는 언어가 다르다면, 일단 저기서 97이 의미하는건 asci코드에서 97이 알파벳a이고 쭉 이후로 26개 늘어져있는형태. 그리고 unpack은 문자를 asci코드로 나타내는거고. 근데 그거 대충알아도 저기서 상식적으로 내가 쓴 식에서 뭐가잘못됀거야?
아무리봐도 잘썼는데 왜 좆같이 번역(해독)결과가나오지
얌마 복호화면 dec 지 enc 냐
아니 걍 그거는 어차피 나중에 바꾸는문제이고...함수이름 hamsu라고 써도 상관없는건데..뭐 햇갈리게했다면 미안
for n in 0..k-1 if (sa[i] + (26*n))%3 == 0 sa[i] = (sa[i] + (26*n)) /3 end end 여기서 왜 k 만큼 도는거임?
니가 n 을 0부터 돌리니까 0으로 나눈다는게 나오는거지 멍청아.
사실 k가 3으로 써도 됀다는점을 일단 말하고싶고 (%3이나 /3하는게 다 k임 좀 햇갈렸으면 ㅈㅅ. 원래 %k, /k로 써놨는데, 짜증나게 zerodivisi가 떠서 걍 k를 3으로 저쪽만 바꿨음)
for 문 없이 if (sa[i] % 3) == 0 sa[i] = sa[i] / 3 하는거랑 무슨 차이냔 말이지.
아니지 나누는건 k로나누는데 n이 0부터가는데. k는 맨아래 써놨듯이 3이나, 4나, 그런 한 값으로 고정
무슨 말인지 안다고 니가 3 번 돌리면서 0 부터 도니까 k 를 못쓰지.
니 말대로 3 으로 건너띈 문자열을 되돌리는데 저게 왜 필요함?
if (sa[i] % k) == 0 sa[i] = sa[i] / k 하면 될거 아님?
그냥 if만 쓰면, 3으로 나눠서 나머지 0이 아닐때는, 그다음에 뭐 어쩌라는 내용이 없잖어. (컴퓨터:나머지가 0이아닙니다. 이제 어떻게할까요? 명령이없네) 그러니까 0이 나올때까지 n을 바꿔주면서 0이 될때를 포착해야지...
아니다. 뒤로 넘어간걸 잡아내기 위한거구나. 근데 저렇게 쓰면 안되지.
아니 왜 k를못써? 0부터 도는건 n이고, n은 분수에 없어. k는 0이 될순간이 단한순간도없는데.
for 문은 일단 필요없구.
ㅇㅋ일단 나 잠깐 밥먹고옴 님 오늘 새벽2시까지 자지말고 도와주셈
sa[i] = (sa[i] + (2 - (sa[i] % k)) * kosu) / k 처럼 될텐데
2 대신 (k - 1) 을 쓰는게 맞지만, 저렇게 하면 어차피 k 에 1 이나 2 같은건 쓸 수 없을 것 같음. 나도 밥먹으러 나가서 제대로 확인은 못함. 니 숙제를 하는데 내가 왜 자지 말고 도와줘야돼? 미친것아.
sa[i] = (sa[i] + (sa[i] % k)) * kosu) / k 하니까 되네요. 근데 이건 k가 딱 3일때만 가능한 일회용공식...
님말대로 2 - 어쩌고하면 안됌
그리고 k에 2는 당연히 쓸수없구요..(k에 2쓰면 26과 2는 서로소가 아니기에 1:1대응이 안되서 역함수, 즉 복호가 안됌..)
그리고 위에 k가 0이 안나오는데 왜 zerodivisi가 나왔는지는 아직도모르겠구요
제로디비젼에러가 영어로 리플쓰니까 divisi에서끊기네
게다가 sa[i] = (sa[i] + (sa[i] % k)) * kosu) / k로 쓴다고해도, 왜 내가 쓴게 잘못됐는지, for써서 복잡하게 저렇게 한게 왜 안되는지도 알려주세요