結果
| 問題 |
No.8005 天使のハッシュ関数
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2021-04-10 03:59:33 |
| 言語 | Kuin (KuinC++ v.2021.9.17) |
| 結果 |
AC
|
| 実行時間 | 2 ms / 5,000 ms |
| コード長 | 3,291 bytes |
| コンパイル時間 | 3,555 ms |
| コンパイル使用メモリ | 155,804 KB |
| 実行使用メモリ | 5,376 KB |
| 最終ジャッジ日時 | 2024-09-16 12:30:04 |
| 合計ジャッジ時間 | 3,613 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 14 |
ソースコード
func main()
var s: []char :: cui@input()
if(s =& null)
do s :: ""
end if
do s :: @md5(@md5(s))
do cui@print("\{s}\n")
end func
func md5(input: []char): []char
var message: []bit8 :: #[^input]bit8
for i(0, ^input - 1)
do message[i] :: input[i] $ bit8
end for
var s: []int :: [
|7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22,
|5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20,
|4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23,
|6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21
|]
var k: []bit64 :: [
|0xD76AA478b64, 0xE8C7B756b64, 0x242070DBb64, 0xC1BDCEEEb64,
|0xF57C0FAFb64, 0x4787C62Ab64, 0xA8304613b64, 0xFD469501b64,
|0x698098D8b64, 0x8B44F7AFb64, 0xFFFF5BB1b64, 0x895CD7BEb64,
|0x6B901122b64, 0xFD987193b64, 0xA679438Eb64, 0x49B40821b64,
|0xF61E2562b64, 0xC040B340b64, 0x265E5A51b64, 0xE9B6C7AAb64,
|0xD62F105Db64, 0x02441453b64, 0xD8A1E681b64, 0xE7D3FBC8b64,
|0x21E1CDE6b64, 0xC33707D6b64, 0xF4D50D87b64, 0x455A14EDb64,
|0xA9E3E905b64, 0xFCEFA3F8b64, 0x676F02D9b64, 0x8D2A4C8Ab64,
|0xFFFA3942b64, 0x8771F681b64, 0x6D9D6122b64, 0xFDE5380Cb64,
|0xA4BEEA44b64, 0x4BDECFA9b64, 0xF6BB4B60b64, 0xBEBFBC70b64,
|0x289B7EC6b64, 0xEAA127FAb64, 0xD4EF3085b64, 0x04881D05b64,
|0xD9D4D039b64, 0xE6DB99E5b64, 0x1FA27CF8b64, 0xC4AC5665b64,
|0xF4292244b64, 0x432AFF97b64, 0xAB9423A7b64, 0xFC93A039b64,
|0x655B59C3b64, 0x8F0CCC92b64, 0xFFEFF47Db64, 0x85845DD1b64,
|0x6FA87E4Fb64, 0xFE2CE6E0b64, 0xA3014314b64, 0x4E0811A1b64,
|0xF7537E82b64, 0xBD3AF235b64, 0x2AD7D2BBb64, 0xEB86D391b64
|]
var state: []bit32 :: [
|0x67452301b32,
|0xEFCDAB89b32,
|0x98BADCFEb32,
|0x10325476b32
|]
var initialMessageLength: int :: ^message % (2 ^ 61) * 8
do message :~ [0x80b8]
var len: int :: ^message % (2 ^ 61)
var padLen: int :: len < 56 ?(56 - len, 120 - len)
do message :~ [0b8].repeat(padLen)
for i(0, 7)
do message :~ [(initialMessageLength % 256) $ bit8]
do initialMessageLength :/ 256
end for
for ii(0, ^message / 64 - 1)
var m: []bit32 :: #[16]bit32
for i(0, 15)
for j(3, 0, -1)
do m[i] :* 256b32
do m[i] :+ message[ii * 64 + 4 * i + j] $ bit32
end for
end for
var a: bit32 :: state[0]
var b: bit32 :: state[1]
var c: bit32 :: state[2]
var d: bit32 :: state[3]
for i(0, 63)
var f: bit32
var g: int
switch(i)
case 0 to 15
do f :: (b.and(c)).or(b.not().and(d))
do g :: i
case 16 to 31
do f :: (d.and(b)).or(d.not().and(c))
do g :: (5 * i + 1) % 16
case 32 to 47
do f :: b.xor(c).xor(d)
do g :: (3 * i + 5) % 16
case 48 to 63
do f :: c.xor(b.or(d.not()))
do g :: (7 * i) % 16
end switch
do f :+ a + k[i] $ bit32 + m[g]
do a :: d
do d :: c
do c :: b
do b :+ leftRotate(f, s[i])
end for
do state[0] :+ a
do state[1] :+ b
do state[2] :+ c
do state[3] :+ d
end for
var result: []bit8 :: #[16]bit8
for i(0, 3)
for j(0, 3)
do result[4 * i + j] :: state[i].and(0xFFb32) $ bit8
do state[i] :: state[i].shr(8)
end for
end for
var res: []char :: #[32]char
for i(0, 15)
var val: []char :: result[i] $ int.toStrFmt("02x")
for j(0, 1)
do res[2 * i + j] :: val[j]
end for
end for
ret res
func leftRotate(x: bit32, c: int): bit32
ret x.shl(c).or(x.shr(32 - c))
end func
end func