ระยะทาง Levenshtein & OEIS (ตำรวจ)


16

นี่คือโพสต์ Cop โพสต์โม่งอยู่ที่นี่


งานของคุณคือการใช้การป้อนข้อมูลจำนวนเต็มNและเอาท์พุทชับหลักในลำดับOEIS A002942

ลำดับประกอบด้วยตัวเลขสแควร์ที่เขียนย้อนหลัง:

1, 4, 9, 61, 52, 63, 94, 46, 18, 1, 121, 441, ...

โปรดทราบว่าเลขศูนย์นำหน้าจะถูกตัดออก ( 100กลายเป็น1ไม่ใช่001 ) การเชื่อมโยงสิ่งนี้เข้ากับสตริง (หรือตัวเลขยาวหนึ่งค่า):

1496152639446181121441

คุณจะส่งออกตัวเลขที่Nในสตริง / หมายเลขนี้ คุณสามารถเลือกที่จะใช้Nเป็นดัชนี 0 หรือดัชนี 1 ดัชนี (โปรดระบุว่าคุณเลือกแบบใด)

กรณีทดสอบ (1 ดัชนี):

N = 1,      ==> 1
N = 5,      ==> 1
N = 17,     ==> 1   <- Important test case! It's not zero.
N = 20,     ==> 4
N = 78,     ==> 0
N = 100,    ==> 4

รหัสของคุณควรใช้กับตัวเลขที่มีค่าสูงสุดN = 2 ^ 15 (ยกเว้นกรณีที่ภาษาของคุณไม่สามารถจัดการกับจำนวนเต็ม 32 บิตโดยค่าเริ่มต้นซึ่งในกรณีนี้Nอาจต่ำกว่า)


ตำรวจ:

คุณต้องเขียนสองฟังก์ชัน / โปรแกรมในภาษาเดียวกันที่ทำสิ่งเดียวกัน คุณต้องโพสต์หนึ่งในฟังก์ชั่น / โปรแกรมเช่นเดียวกับระยะทาง Levenshteinระหว่างสองฟังก์ชั่น / โปรแกรมที่คุณเขียน ระยะทางของ Levenshtein วัดเป็นตัวอักษร (ดังนั้นการเพิ่มตัวอักขระสองไบต์จะให้ LD = 1)

รหัสที่ไม่ได้รับการเปิดเผยต้องไม่ยาวกว่าโซลูชันดั้งเดิม (แต่อาจมีขนาดเท่ากัน) โจรจะพยายามเขียนรหัสด้วยระยะทางที่แน่นอนที่คุณให้ Levenshtein (ซึ่งอาจแตกต่างจากรหัสที่ไม่เปิดเผยของคุณตราบใดที่ยังใช้งานได้)

ผู้ชนะจะเป็นผลงานที่ไม่ได้ติดตามซึ่งมีระยะทาง Levenshtein ต่ำสุด

คุณสามารถตรวจสอบระยะทางของ Levenshtein ได้ที่นี่!


หากการส่งของคุณไม่ได้ติดตาม 7 วันคุณอาจเปิดเผยรหัสอื่นที่คุณเขียนและทำเครื่องหมายการส่งของคุณว่าปลอดภัย



ใช่ฉันจะเพิ่มเข้าไปในกฎ :)
Stewie Griffin

คุณพูดถึงสคริปต์ แต่ฉันคิดว่านี่เป็นโปรแกรมหรือฟังก์ชั่นเริ่มต้นหรือไม่
Kevin Cruijssen

ใช่เริ่มต้นทุกอย่าง :)
Stewie Griffin

คุณจัดการความคิดเห็นและช่องว่างได้อย่างไรฉันเห็นสิ่งแปลก ๆ
Magic Octopus Urn

1
"รหัสของคุณควรใช้กับตัวเลขที่มีค่าไม่เกิน N = 2 ^ 15" -> แต่หนึ่งในกรณีทดสอบนั้นใหญ่กว่านั้น กรณี 274164 จำเป็นหรือไม่
Tom Carpenter

คำตอบ:


6

Haskell , LD = 13, แตก

((snd.span(<'1').reverse.show.(^2)=<<[1..])!!)

ลองออนไลน์!

ฉันตรวจสอบอีกครั้งว่าศูนย์นำหน้าถูกตัดแต่งแล้ว)

คำอธิบาย:

                    [1..]     -- for each element in [1,2,3,4,5,...]
                 =<<          -- apply the following functions 
             (^2)             -- square [1,4,9,16,25,...]
           show.              -- convert to string ["1","4","9","16","25",...]
       reverse.               -- reverse ["1","4","9","61","52",...,"001",...]
   span(<'1').                -- split into leading zeros and remainder [("","1"),("","4"),...,("00","1"),...]
  snd.                        -- only keep remainder ["1","4","9","61","52",...,"1",...]
                              -- and concatenate the result "1496152..."
((                       )!!) -- index into the sequence


3

cQuents 0 , LD = 1, แคร็ก

":\r$*$

ลองออนไลน์!

ฉันคิดว่านี้ไม่ได้ผลสำหรับศูนย์ชั้นนำ แต่มันก็ไม่จริง - ฟังก์ชั่นย้อนกลับใน cQuents int(reversed(str(n)))เป็นรหัสเป็น

คำอธิบาย

"         Concatenate sequence together, get nth term in the string instead of the sequence
 :        Mode: Sequence: given input n, output the nth term, 1-indexed
          Each term in the sequences equals:
  \r      reverse(
    $*$           the index * the index
                  or
    $$            the index * the index
                   ) (implicit)


@Laikoni ใช่แล้ว cQuents ทำการคูณโดยนัยเช่น kinda เช่น Mathematica แต่คุณไม่ต้องการช่องว่าง การเพิ่มคำอธิบาย
Stephen

3

JavaScript (ES6), LD = 103 ( แตก )

การใช้ระยะทางที่สูงเช่น Levenshtein อาจไม่ใช่กลยุทธ์ที่ดีที่สุด แต่ให้ลองใช้ต่อไป

n => { for(i = 0, str = ''; i <= n; i++) { str += +[...i * i + ''].reverse().join(''); } return str[n]; }

กรณีทดสอบ

แนวทางแก้ไขปัญหา

$=>eval(atob`Wy4uLkFycmF5KCQrMSldLm1hcCgoXyxpKT0+K1suLi5pKmkrJyddLnJldmVyc2UoKS5qb2luYGApLmpvaW5gYFskXQ`)

ส่วนที่เข้ารหัส:

[...Array($+1)].map((_,i)=>+[...i*i+''].reverse().join``).join``[$]

แถบนี้นำ 0 วินาทีหลังจากกลับด้านใช่หรือไม่
Erik the Outgolfer

@EriktheOutgolfer ใช่ unary +ทำให้แน่ใจว่าสตริงที่ถูกย้อนกลับถูกบังคับให้เป็นตัวเลข
Arnauld

1
โอ้วววววมันยากกว่าที่คิด
Magic Octopus Urn


3

Python 2, 104 ไบต์, LD = 21 ไม่ถูกต้องและแตก

d=lambda y:y if'0'!=str(y)[-1]else d(y/10)
lambda n:''.join([str(d(x*x))[::-1]for x in range(1,n)])[n-1]

PS มีพื้นที่ว่างและการแสดงความคิดเห็นไม่ จำกัด หรือไม่ ถ้าเป็นเช่นนี้จะไม่แตกยาก


1
"รหัสที่ยังไม่เปิดเผยไม่สามารถยาวเกินกว่าโซลูชันเดิม"
Khuldraeseth na'Barya

@Scoboble ฉันเห็นแล้ว แต่ฉันไม่คิดว่ามันจะยากที่จะสร้างโปรแกรมที่สั้นกว่าโปรแกรมนี้มาก ทำไปแล้วในไพ ธ อน 3 ในคำตอบอื่นและมันทำงานในไพ ธ อน 2 ดังนั้นสิ่งที่พวกเขาต้องเพิ่มคือพวง\n(ประมาณ 50)
dylnan

บรรทัดใหม่ 50 บรรทัดจะไม่เกินระยะทาง 21 ของ Levenshtein หรือไม่
Khuldraeseth na'Barya

@Scoboble คุณพูดถูกมากฉันสับสนและคิดถึงปัญหาอย่างไม่ถูกต้อง ขอบคุณ
dylnan

1
ดูเหมือนว่าจะเกิดข้อผิดพลาดในอินพุตต่ำกว่า 5
Leo

3

รหัสเครื่อง 6502 (C64), LD = 1 ( แตก )

00 C0 20 FD AE A0 00 99 5B 00 C8 20 73 00 90 F7 99 5B 00 A2 0B CA 88 30 09 B9
5B 00 29 0F 95 5B 10 F3 A9 00 95 5B CA 10 F9 A9 00 A0 03 99 69 00 88 10 FA A0
20 A2 76 18 B5 E6 90 02 09 10 4A 95 E6 E8 10 F4 A2 03 76 69 CA 10 FB 88 F0 11
A2 09 B5 5C C9 08 30 04 E9 03 95 5C CA 10 F3 30 D6 A2 03 B5 69 95 57 CA 10 F9
A9 01 85 FB A2 03 A9 00 95 FB CA D0 FB A2 03 B5 FB 95 22 95 26 CA 10 F7 A9 00
A2 03 95 69 CA 10 FB A0 20 A2 02 46 25 76 22 CA 10 FB 90 0C A2 7C 18 B5 AA 75
ED 95 ED E8 10 F7 A2 7D 06 26 36 AA E8 10 FB 88 10 DD A0 0B A9 00 99 5A 00 88
D0 FA A0 20 A2 09 B5 5C C9 05 30 04 69 02 95 5C CA 10 F3 06 69 A2 FD 36 6D E8
D0 FB A2 09 B5 5C 2A C9 10 29 0F 95 5C CA 10 F4 88 D0 D7 E0 0A F0 05 E8 B5 5B
F0 F7 09 30 99 5B 00 C8 E8 E0 0B F0 04 B5 5B 90 F1 88 B9 5B 00 C9 30 F0 F8 A2
7C 18 B5 DB E9 00 95 DB E8 10 F7 90 14 88 30 05 B9 5B 00 D0 EA A2 7C F6 7F D0
03 E8 10 F9 4C 73 C0 B9 5B 00 4C D2 FF

การสาธิตออนไลน์การใช้งาน:sys49152,nที่ไหนnคืออินพุต 0 ที่จัดทำดัชนี


สำหรับกรณีทดสอบครั้งสุดท้ายคุณจำเป็นต้องมีความอดทนเล็กน้อยเนื่องจากเครื่องที่ดีนี้ต้องทำการเปลี่ยนบิตและการเพิ่มเติมหลายล้านครั้งเพื่อนำเสนอผลลัพธ์ให้คุณ;)

ภาษาที่นี่คือรหัสเครื่องดังนั้น LD จึงถูกวัดในรูปแบบนี้ - อย่างไรก็ตามเพื่อให้สิ่งที่จะเริ่มต้นด้วยนี่คือโปรแกรมในca65แหล่งที่มาประกอบ:

NUMSIZE         = 4     ; 32 bit integers ...
NUMSTRSIZE      = 11    ; need up to 11 characters for 0-terminated string

.segment "ZPUSR": zeropage
v_x:            .res    NUMSIZE         ; next number to be squared

.segment "ZPFAC": zeropage
v_n:            .res    NUMSIZE         ; input index (0-based), counts down
nc_string:      .res    NUMSTRSIZE      ; string buffer for numbers

.segment "ZPTMP": zeropage
mpm_arg1:       .res    NUMSIZE         ; arg1 for multiplication
mpm_arg2:       .res    NUMSIZE         ; arg2 for multiplication

.segment "ZPFAC2": zeropage
mpm_res:        .res    NUMSIZE         ; numeric result (mult and str convert)

; load address for creating a C64 .PRG file:

.segment "LDADDR"
                .word   $c000

.code

; first read number from command argument and convert to unsigned
; integer in little-endian:

                jsr     $aefd
                ldy     #$00
rn_loop:        sta     nc_string,y
                iny
                jsr     $73
                bcc     rn_loop
                sta     nc_string,y
                ldx     #NUMSTRSIZE
stn_copybcd:    dex
                dey
                bmi     stn_fillzero
                lda     nc_string,y
                and     #$f
                sta     nc_string,x
                bpl     stn_copybcd
stn_fillzero:   lda     #$0
                sta     nc_string,x
                dex
                bpl     stn_fillzero
                lda     #$0
                ldy     #(NUMSIZE-1)
stn_znumloop:   sta     mpm_res,y
                dey
                bpl     stn_znumloop
                ldy     #(NUMSIZE*8)
stn_loop:       ldx     #($81-NUMSTRSIZE)
                clc
stn_rorloop:    lda     nc_string+NUMSTRSIZE+$80,x
                bcc     stn_skipbit
                ora     #$10
stn_skipbit:    lsr     a
                sta     nc_string+NUMSTRSIZE+$80,x
                inx
                bpl     stn_rorloop
                ldx     #(NUMSIZE-1)
stn_ror:        ror     mpm_res,x
                dex
                bpl     stn_ror
                dey
                beq     main
stn_sub:        ldx     #(NUMSTRSIZE-2)
stn_subloop:    lda     nc_string+1,x
                cmp     #$8
                bmi     stn_nosub
                sbc     #$3
                sta     nc_string+1,x
stn_nosub:      dex
                bpl     stn_subloop
                bmi     stn_loop

main:
                ldx     #(NUMSIZE-1)
argloop:        lda     mpm_res,x
                sta     v_n,x
                dex
                bpl     argloop
                lda     #$01
                sta     v_x
                ldx     #(NUMSIZE-1)
                lda     #$00
initxloop:      sta     v_x,x
                dex
                bne     initxloop

mainloop:

; prepare arguments for multiplication:

                ldx     #(NUMSIZE-1)
sqrargloop:     lda     v_x,x
                sta     mpm_arg1,x
                sta     mpm_arg2,x
                dex
                bpl     sqrargloop

; do multiplication:

                lda     #$00
                ldx     #(NUMSIZE-1)
mul_clearloop:  sta     mpm_res,x
                dex
                bpl     mul_clearloop
                ldy     #(NUMSIZE*8)
mul_loop:       ldx     #(NUMSIZE-2)
                lsr     mpm_arg1+NUMSIZE-1
mul_rorloop:    ror     mpm_arg1,x
                dex
                bpl     mul_rorloop
                bcc     mul_noadd
                ldx     #($80-NUMSIZE)
                clc
mul_addloop:    lda     mpm_arg2+NUMSIZE+$80,x
                adc     mpm_res+NUMSIZE+$80,x
                sta     mpm_res+NUMSIZE+$80,x
                inx
                bpl     mul_addloop
mul_noadd:      ldx     #($81-NUMSIZE)
                asl     mpm_arg2
mul_rolloop:    rol     mpm_arg2+NUMSIZE+$80,x
                inx
                bpl     mul_rolloop
                dey
                bpl     mul_loop

; convert result to string:

                ldy     #NUMSTRSIZE
                lda     #$0
nts_fillzero:   sta     nc_string-1,y
                dey
                bne     nts_fillzero
                ldy     #(NUMSIZE*8)
nts_bcdloop:    ldx     #(NUMSTRSIZE-2)
nts_addloop:    lda     nc_string+1,x
                cmp     #$5
                bmi     nts_noadd
                adc     #$2
                sta     nc_string+1,x
nts_noadd:      dex
                bpl     nts_addloop
                asl     mpm_res
                ldx     #($ff-NUMSIZE+2)
nts_rol:        rol     mpm_res+NUMSIZE,x       ; + $100 w/o zp wraparound
                inx
                bne     nts_rol
                ldx     #(NUMSTRSIZE-2)
nts_rolloop:    lda     nc_string+1,x
                rol     a
                cmp     #$10
                and     #$f
                sta     nc_string+1,x
nts_rolnext:    dex
                bpl     nts_rolloop
                dey
                bne     nts_bcdloop
nts_scan:       cpx     #(NUMSTRSIZE-1)
                beq     nts_copydigits
                inx
                lda     nc_string,x
                beq     nts_scan
nts_copydigits: ora     #$30
                sta     nc_string,y
                iny
                inx
                cpx     #(NUMSTRSIZE)
                beq     strip0loop
                lda     nc_string,x
                bcc     nts_copydigits

; search for first non-0 character from the end of the string:

strip0loop:     dey
                lda     nc_string,y
                cmp     #$30
                beq     strip0loop

; decrement n for each digit:

founddigit:
                ldx     #($80-NUMSIZE)
                clc
decnloop:       lda     v_n+NUMSIZE+$80,x
                sbc     #$00
                sta     v_n+NUMSIZE+$80,x
                inx
                bpl     decnloop
                bcc     foundresult

                dey
                bmi     next_x
                lda     nc_string,y
                bne     founddigit

; increment x to calculate next square number:

next_x:
                ldx     #($80-NUMSIZE)
incxloop:       inc     v_x+NUMSIZE-$80,x
                bne     incxdone
                inx
                bpl     incxloop
incxdone:       jmp     mainloop

foundresult:    lda     nc_string,y
                jmp     $ffd2

... และนี่คือสคริปต์ตัวเชื่อมโยงสำหรับld65:

MEMORY {
  LDADDR: start = $bffe, size = 2;
  CODE: start = $c000, size = $1000;
  ZPTMP: start = $0022, size = $0008;
  ZPFAC: start = $0057, size = $000f;
  ZPFAC2: start = $0069, size = $0004;
  ZPUSR: start = $00fb, size = $0004;
}

SEGMENTS {
  LDADDR: load = LDADDR;
  CODE: load = CODE;
  ZPTMP: load = ZPTMP, type = zp;
  ZPFAC: load = ZPFAC, type = zp;
  ZPFAC2: load = ZPFAC2, type = zp;
  ZPUSR: load = ZPUSR, type = zp;
}

แตก (ฉันเชื่อ)
โจ

@Jo ใช่แล้ว
เฟลิกซ์ Palmen


2

Java 8, (177 ไบต์) LD = 92 ( ถอดรหัสโดย@Arnauld )

( ฉันใช้เครื่องคิดเลข LD ออนไลน์นี้ )

n->{String r="",t=r;for(int i=1,j;r.length()<=n+1;i++)if(Math.sqrt(i)%1==0){for(t="",j=(i+"").length();j>0;t+=(i+"").charAt(--j));r+=t.replaceAll("^0+","");}return r.charAt(n);}

นี่อาจไม่ยากเกินไปถ้าคุณเล่นกอล์ฟนี้ :)

คำอธิบาย:

ลองที่นี่

n->{                             // Method with integer parameter and character return-type
  String r="",                   //  Result-String, starting empty
         t=r;                    //  Temp-String, starting empty
  for(int i=1,j;                 //  Index-integers
      r.length()<=n+1;i++)       //  Loop (1) as long as the length is at least n+1
    if(Math.sqrt(i)%1==0){       //   If the current number `i` is a perfect square:
      for(t="",                  //    Reset the temp-String to empty
          j=(i+"").length();     //    Set `j` to the length of the current number
          j>0;                   //    Inner loop (2) as long as `j` is larger than 0
        t+=                      //     Append the temp-String with:
           (i+"").charAt(--j)    //     The digit of integer `i` at index `j-1`
                                 //     (by first decrease `j` with 1 with `--j`)
      );                         //    End of inner loop (2)
      r+=t                       //    And then append the temp-String to the result-String
          .replaceAll("^0+","");}//    after we've removed any leading zeroes
                                 //  End of loop (1) (implicit / single-line body)
  return r.charAt(n);            //  Return the `n`'th character of the result-String
}                                // End of method


วิธีแก้ปัญหาที่ตั้งใจ: n->{String r="";for(int i=1;r.length()<=n+1;r+=new Long(new StringBuffer(i*i+++"").reverse()+""));return r.charAt(n);}( 118 bytes, 92 LD )
Kevin Cruijssen


2

รหัสเครื่อง 6502 (C64), LD = 1, ปลอดภัย

00 C0 20 FD AE A0 00 99 5B 00 C8 20 73 00 90 F7 99 5B 00 A2 0B CA 98 88 30 09
B9 5B 00 29 0F 95 5B 10 F2 95 5B CA 10 FB A0 20 A2 76 18 B5 E6 90 02 09 10 4A
95 E6 E8 10 F4 A2 03 76 69 CA 10 FB 88 F0 11 A2 09 B5 5C C9 08 30 04 E9 03 95
5C CA 10 F3 30 D6 A2 03 B5 69 95 57 CA 10 F9 A9 01 85 FB A2 03 A9 00 95 FB CA
D0 FB A2 03 B5 FB 95 22 95 26 CA 10 F7 A9 00 A2 03 95 69 CA 10 FB A0 20 A2 02
46 25 76 22 CA 10 FB 90 0C A2 7C 18 B5 AA 75 ED 95 ED E8 10 F7 A2 7D 06 26 36
AA E8 10 FB 88 10 DD A2 0B A9 00 95 5A CA D0 FB A0 20 A2 09 B5 5C C9 05 30 04
69 02 95 5C CA 10 F3 06 69 A2 FD 36 6D E8 D0 FB A2 09 B5 5C 2A C9 10 29 0F 95
5C CA 10 F4 88 D0 D7 E8 B5 5B F0 FB 09 30 99 5B 00 C8 E8 E0 0B F0 04 B5 5B 90
F1 88 B9 5B 00 C9 30 F0 F8 A2 7C 18 B5 DB E9 00 95 DB E8 10 F7 90 14 88 30 05
B9 5B 00 D0 EA A2 7C F6 7F D0 03 E8 10 F9 4C 68 C0 B9 5B 00 4C D2 FF

การสาธิตออนไลน์การใช้งาน:sys49152,nที่ไหนnคืออินพุต 0 ที่จัดทำดัชนี


วิธีแก้ไขปัญหา: (ต่าง)

 B9 5B 00 29 0F 95 5B 10 F2 95 5B CA 10 FB A0 20 A2 76 18 B5 E6 90 02 09 10 4A
-95 E6 E8 10 F4 A2 03 76 69 CA 10 FB 88 F0 11 A2 09 B5 5C C9 08 30 04 E9 03 95
+95 E6 E8 10 F4 A2 03 76 69 CA 10 FB 88 F0 11 A2 09 B5 5C C9 08 90 04 E9 03 95
 5C CA 10 F3 30 D6 A2 03 B5 69 95 57 CA 10 F9 A9 01 85 FB A2 03 A9 00 95 FB CA

30(opcode bmi) จะถูกแทนที่ด้วย90(opcode bcc) สิ่งนี้สอดคล้องกับส่วนต่อไปนี้ในแหล่งแอสเซมเบลอร์:

stn_subloop:    lda     nc_string+1,x
                cmp     #$8
                bmi     stn_nosub       ; use bcc here for same result
                sbc     #$3
                sta     nc_string+1,x

มันทำงานได้เพราะรหัสนี้ตรวจสอบว่าตัวเลขมีขนาดเล็กกว่า 8 cmpคำสั่งดำเนินการลบสำหรับการตั้งค่าธงตาม ดังนั้นถ้าสะสมถือจำนวนที่มีขนาดเล็กกว่า 8 underflows bccนี้ล้างธงพกดังนั้นการเรียนการสอนสาขาที่ถูกต้องเป็นจริง bmi(การแตกแขนงเมื่อลบ) เช่นเดียวกับในรหัสต้นฉบับก็เกิดขึ้นกับการทำงานที่นี่เช่นกันเพราะตัวเลขเปรียบเทียบมีขนาดเล็กพอดังนั้นผลลัพธ์ของการลบจะสิ้นสุดลงในช่วงลบ ( $80-$ff) เมื่อมีอันเดอร์โฟล์เกิดขึ้น

การสาธิตออนไลน์


นี่เป็นเวอร์ชันก่อนหน้าของฉันที่ได้รับการปรับปรุง / บีบอัดการส่งก่อนหน้าของฉันในบรรดากลวิธีอื่น ๆ เพื่อลดขนาดมันจะลบโค้ดไร้ประโยชน์ที่มีอยู่และอนุญาตให้มีการถอดรหัสแบบ "ง่าย" *) โดยรวมแล้วขนาดจะลดลง 16 ไบต์ เวลานี้มันควรจะยากขึ้นนิดหน่อยที่จะหาโปรแกรมที่เทียบเท่ากับ LD 1 :)

*) อาจยังหางานได้ค่อนข้างแน่นอน :)

ต่อไปนี้เป็นca65แหล่งรวมแอสเซมเบลอร์เพื่อช่วยเริ่มต้นใช้งานโค้ด:

NUMSIZE         = 4     ; 32 bit integers ...
NUMSTRSIZE      = 11    ; need up to 11 characters for 0-terminated string

.segment "ZPUSR": zeropage
v_x:            .res    NUMSIZE         ; next number to be squared

.segment "ZPFAC": zeropage
v_n:            .res    NUMSIZE         ; input index (0-based), counts down
nc_string:      .res    NUMSTRSIZE      ; string buffer for numbers

.segment "ZPTMP": zeropage
mpm_arg1:       .res    NUMSIZE         ; arg1 for multiplication
mpm_arg2:       .res    NUMSIZE         ; arg2 for multiplication

.segment "ZPFAC2": zeropage
mpm_res:        .res    NUMSIZE         ; numeric result (mult and str convert)

; load address for creating a C64 .PRG file:

.segment "LDADDR"
                .word   $c000

.code

; first read number from command argument and convert to unsigned
; integer in little-endian:

                jsr     $aefd
                ldy     #$00
rn_loop:        sta     nc_string,y
                iny
                jsr     $73
                bcc     rn_loop
                sta     nc_string,y
                ldx     #NUMSTRSIZE
stn_copybcd:    dex
                tya
                dey
                bmi     stn_fillzero
                lda     nc_string,y
                and     #$f
                sta     nc_string,x
                bpl     stn_copybcd
stn_fillzero:   sta     nc_string,x
                dex
                bpl     stn_fillzero
                ldy     #(NUMSIZE*8)
stn_loop:       ldx     #($81-NUMSTRSIZE)
                clc
stn_rorloop:    lda     nc_string+NUMSTRSIZE+$80,x
                bcc     stn_skipbit
                ora     #$10
stn_skipbit:    lsr     a
                sta     nc_string+NUMSTRSIZE+$80,x
                inx
                bpl     stn_rorloop
                ldx     #(NUMSIZE-1)
stn_ror:        ror     mpm_res,x
                dex
                bpl     stn_ror
                dey
                beq     main
stn_sub:        ldx     #(NUMSTRSIZE-2)
stn_subloop:    lda     nc_string+1,x
                cmp     #$8
                bmi     stn_nosub
                sbc     #$3
                sta     nc_string+1,x
stn_nosub:      dex
                bpl     stn_subloop
                bmi     stn_loop

main:
                ldx     #(NUMSIZE-1)
argloop:        lda     mpm_res,x
                sta     v_n,x
                dex
                bpl     argloop
                lda     #$01
                sta     v_x
                ldx     #(NUMSIZE-1)
                lda     #$00
initxloop:      sta     v_x,x
                dex
                bne     initxloop

mainloop:

; prepare arguments for multiplication:

                ldx     #(NUMSIZE-1)
sqrargloop:     lda     v_x,x
                sta     mpm_arg1,x
                sta     mpm_arg2,x
                dex
                bpl     sqrargloop

; do multiplication:

                lda     #$00
                ldx     #(NUMSIZE-1)
mul_clearloop:  sta     mpm_res,x
                dex
                bpl     mul_clearloop
                ldy     #(NUMSIZE*8)
mul_loop:       ldx     #(NUMSIZE-2)
                lsr     mpm_arg1+NUMSIZE-1
mul_rorloop:    ror     mpm_arg1,x
                dex
                bpl     mul_rorloop
                bcc     mul_noadd
                ldx     #($80-NUMSIZE)
                clc
mul_addloop:    lda     mpm_arg2+NUMSIZE+$80,x
                adc     mpm_res+NUMSIZE+$80,x
                sta     mpm_res+NUMSIZE+$80,x
                inx
                bpl     mul_addloop
mul_noadd:      ldx     #($81-NUMSIZE)
                asl     mpm_arg2
mul_rolloop:    rol     mpm_arg2+NUMSIZE+$80,x
                inx
                bpl     mul_rolloop
                dey
                bpl     mul_loop

; convert result to string:

                ldx     #NUMSTRSIZE
                lda     #$0
nts_fillzero:   sta     nc_string-1,x
                dex
                bne     nts_fillzero
                ldy     #(NUMSIZE*8)
nts_bcdloop:    ldx     #(NUMSTRSIZE-2)
nts_addloop:    lda     nc_string+1,x
                cmp     #$5
                bmi     nts_noadd
                adc     #$2
                sta     nc_string+1,x
nts_noadd:      dex
                bpl     nts_addloop
                asl     mpm_res
                ldx     #($ff-NUMSIZE+2)
nts_rol:        rol     mpm_res+NUMSIZE,x       ; + $100 w/o zp wraparound
                inx
                bne     nts_rol
                ldx     #(NUMSTRSIZE-2)
nts_rolloop:    lda     nc_string+1,x
                rol     a
                cmp     #$10
                and     #$f
                sta     nc_string+1,x
nts_rolnext:    dex
                bpl     nts_rolloop
                dey
                bne     nts_bcdloop
nts_scan:       inx
                lda     nc_string,x
                beq     nts_scan
nts_copydigits: ora     #$30
                sta     nc_string,y
                iny
                inx
                cpx     #(NUMSTRSIZE)
                beq     strip0loop
                lda     nc_string,x
                bcc     nts_copydigits

; search for first non-0 character from the end of the string:

strip0loop:     dey
                lda     nc_string,y
                cmp     #$30
                beq     strip0loop

; decrement n for each digit:

founddigit:
                ldx     #($80-NUMSIZE)
                clc
decnloop:       lda     v_n+NUMSIZE+$80,x
                sbc     #$00
                sta     v_n+NUMSIZE+$80,x
                inx
                bpl     decnloop
                bcc     foundresult

                dey
                bmi     next_x
                lda     nc_string,y
                bne     founddigit

; increment x to calculate next square number:

next_x:
                ldx     #($80-NUMSIZE)
incxloop:       inc     v_x+NUMSIZE-$80,x
                bne     incxdone
                inx
                bpl     incxloop
incxdone:       jmp     mainloop

foundresult:    lda     nc_string,y
                jmp     $ffd2

... และนี่คือสคริปต์ตัวเชื่อมโยงสำหรับld65:

MEMORY {
  LDADDR: start = $bffe, size = 2;
  CODE: start = $c000, size = $1000;
  ZPTMP: start = $0022, size = $0008;
  ZPFAC: start = $0057, size = $000f;
  ZPFAC2: start = $0069, size = $0004;
  ZPUSR: start = $00fb, size = $0004;
}

SEGMENTS {
  LDADDR: load = LDADDR;
  CODE: load = CODE;
  ZPTMP: load = ZPTMP, type = zp;
  ZPFAC: load = ZPFAC, type = zp;
  ZPFAC2: load = ZPFAC2, type = zp;
  ZPUSR: load = ZPUSR, type = zp;
}

พิจารณามันไม่แตก :)
โจ

@Jo ดีถ้าคุณยืนยัน - ขอบคุณมากฉันแก้ไขมัน
เฟลิกซ์ Palmen




0

Python 3: LD = 9 | Cracked

lambda i:"".join(str(k*k+2*k+1)[::-1].lstrip("0")for k in range(i+1))[i]

อันนี้ควรจะค่อนข้างง่าย (มาก) ที่จะได้รับ: P


Cracked
Mr. Xcoder

1
ฉันลบแคร็กของฉันเพราะคำตอบดั้งเดิมไม่ถูกต้อง
Mr. Xcoder

@ Mr.Xcoder คุณสามารถยกเลิกการลบได้ในตอนนี้ LD เหมือนกันเพราะ.lstrip("0")สามารถคัดลอกส่วนได้
HyperNeutrino


0

C ++, LD = 159

0 ดัชนีป้อนเข้าargv[1]รวบรวมใน GCC 7.2.0

#import<bits/stdc++.h>
char*h,b[1<<17],*q=b;int x,y;main(int,char**j){sscanf(j[1],"%d",&y);do{x++;q+=sprintf(h=q,"%d",x*x);while(*--q==48);std::reverse(h,++q);}while(q-b<=y);b[y+1]=0,printf(b+y);}

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.