00 C0 20 FD AE A2 00 9D 4F C1 E8 20 73 00 90 F7 9D 4F C1 A0 FF C8 B9 4F C1 D0
FA A2 15 CA 88 30 0A B9 4F C1 29 0F 9D 4F C1 10 F2 A9 00 9D 4F C1 CA 10 F8 A9
00 A0 07 99 64 C1 88 10 FA A0 40 A2 6C 18 BD E4 C0 90 02 09 10 4A 9D E4 C0 E8
10 F2 A2 07 7E 64 C1 CA 10 FA 88 F0 13 A2 13 BD 50 C1 C9 08 30 05 E9 03 9D 50
C1 CA 10 F1 30 D1 A2 0F A9 00 9D 3F C1 CA D0 FA A9 01 8D 3F C1 8D 47 C1 A2 08
CA BD 64 C1 F0 FA A0 09 1E 64 C1 88 90 FA B0 0A CA 30 28 A0 08 1E 64 C1 90 04
A9 47 B0 02 A9 4F 8D AF C0 86 FE A2 F8 18 BD 47 C0 7D 4F C0 9D 47 C0 E8 D0 F4
A6 FE 88 D0 DC F0 D5 A2 F8 BD 47 C0 7D 4F C0 9D 6C C0 E8 D0 F4 AD 64 C1 E9 01
8D 64 C1 A2 F9 BD 6C C0 E9 00 9D 6C C0 E8 D0 F5 A0 15 A9 00 99 4E C1 88 D0 FA
A0 40 A2 13 BD 50 C1 C9 05 30 05 69 02 9D 50 C1 CA 10 F1 0E 64 C1 A2 F9 3E 6C
C0 E8 D0 FA A2 13 BD 50 C1 2A C9 10 29 0F 9D 50 C1 CA 10 F2 88 D0 D1 E0 14 F0
06 E8 BD 4F C1 F0 F6 09 30 99 4F C1 C8 E8 E0 15 F0 05 BD 4F C1 90 F0 A9 00 99
4F C1 A9 4F A0 C1 4C 1E AB
オンラインデモ
エラーチェック付きオンラインデモ(346バイト)
使用法: sys49152,[n]
などsys49152,911188917558917
。
時間制限とテストケースには、64ビット数で計算するソリューションが必要なので、C64が「最新のマシン」として適格であることを証明する時間です;)
もちろん、これにはかなりのコードが必要です。OSは16ビット以上の整数には何も提供しません。ここのラメな部分:それは、NofPのアルゴリズム応答の(もう少し修正された)さらに別の実装です。xnorの改良版。アイデアをありがとう;)
説明
以下は、アルゴリズムを実行する関連部分のコメント付き逆アセンブリリストです。
.C:c06c A2 0F LDX #$0F ; 15 bytes to clear
.C:c06e A9 00 LDA #$00
.C:c070 .clearloop:
.C:c070 9D 3F C1 STA .num_a,X
.C:c073 CA DEX
.C:c074 D0 FA BNE .clearloop
.C:c076 A9 01 LDA #$01 ; initialize num_a and num_b
.C:c078 8D 3F C1 STA .num_a ; to 1
.C:c07b 8D 47 C1 STA .num_b
.C:c07e A2 08 LDX #$08 ; 8 bytes of input to check,
.C:c080 .findmsb: ; start at most significant
.C:c080 CA DEX
.C:c081 BD 64 C1 LDA .nc_num,X
.C:c084 F0 FA BEQ .findmsb ; repeat until non-0 byte found
.C:c086 A0 09 LDY #$09 ; 8 bits to check (+1 for pre dec)
.C:c088 .findbit:
.C:c088 1E 64 C1 ASL .nc_num,X ; shift left, highest bit to carry
.C:c08b 88 DEY
.C:c08c 90 FA BCC .findbit ; bit was zero -> repeat
.C:c08e B0 0A BCS .loopentry ; jump into calculation loop
.C:c090 .mainloop:
.C:c090 CA DEX ; next byte
.C:c091 30 28 BMI .done ; index -1? -> done calculating
.C:c093 A0 08 LDY #$08 ; 8 bits to check
.C:c095 .bitloop:
.C:c095 1E 64 C1 ASL .nc_num,X ; shift left, highest bit to carry
.C:c098 90 04 BCC .tgt_b ; if 0, store addition result in num_b
.C:c09a .loopentry:
.C:c09a A9 47 LDA #$47
.C:c09c B0 02 BCS .tgt_a ; ... else store in num_a ...
.C:c09e .tgt_b:
.C:c09e A9 4F LDA #$4F
.C:c0a0 .tgt_a:
.C:c0a0 8D AF C0 STA $C0AF ; ... using self-modification.
.C:c0a3 86 FE STX $FE ; save byte index
.C:c0a5 A2 F8 LDX #$F8 ; index for adding
.C:c0a7 18 CLC
.C:c0a8 .addloop:
.C:c0a8 BD 47 C0 LDA $C047,X ; load byte from num_a
.C:c0ab 7D 4F C0 ADC $C04F,X ; add byte from num_b
.C:c0ae 9D 47 C0 STA $C047,X ; store to num_a or num_b
.C:c0b1 E8 INX ; next index
.C:c0b2 D0 F4 BNE .addloop ; done if index overflown
.C:c0b4 A6 FE LDX $FE ; restore byte index
.C:c0b6 88 DEY ; decrement bit index
.C:c0b7 D0 DC BNE .bitloop ; bits left in current byte -> repeat
.C:c0b9 F0 D5 BEQ .mainloop ; else repeat main loop
.C:c0bb .done:
.C:c0bb A2 F8 LDX #$F8 ; index for adding
.C:c0bd .addloop2:
.C:c0bd BD 47 C0 LDA $C047,X ; load byte from num_a
.C:c0c0 7D 4F C0 ADC $C04F,X ; add byte from num_b
.C:c0c3 9D 6C C0 STA $C06C,X ; store to nc_num (result)
.C:c0c6 E8 INX ; next index
.C:c0c7 D0 F4 BNE .addloop2 ; done if index overflown
.C:c0c9 AD 64 C1 LDA .nc_num ; load least significant result byte
.C:c0cc E9 01 SBC #$01 ; subtract 2 (1 + negated carry)
.C:c0ce 8D 64 C1 STA .nc_num ; store least significant result byte
.C:c0d1 A2 F9 LDX #$F9 ; index for subtract
.C:c0d3 .subloop:
.C:c0d3 BD 6C C0 LDA $C06C,X ; subtract 0 from all other bytes
.C:c0d6 E9 00 SBC #$00 ; for handling carry if necessary
.C:c0d8 9D 6C C0 STA $C06C,X
.C:c0db E8 INX
.C:c0dc D0 F5 BNE .subloop
残りは入出力であり、ダブルダブルアルゴリズムを使用して文字列と64ビット符号なし整数(リトルエンディアン)の間で変換されます。興味のある方のために、ここにエラーチェック付きのバージョンのアセンブリソース全体を示します。「ゴルフ」バージョンはブランチ「ゴルフ」にあります。