लेवेनशीन दूरी और OEIS (पुलिस)


16

यह कॉप पोस्ट है। डाकू पोस्ट यहाँ है


आपका कार्य पूर्णांक इनपुट N को लेना है और Nth अंक को अनुक्रम OEIS A002942 में आउटपुट करना है

अनुक्रम में पीछे की ओर लिखे गए वर्ग संख्याएँ होती हैं:

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

ध्यान दें कि अग्रणी शून्य को छंटनी की जाती है ( 100 1 हो जाता है , 001 नहीं )। इसे एक स्ट्रिंग में समाप्‍त करना (या एक लंबी संख्‍या देता है):

1496152639446181121441

आप इस स्ट्रिंग / संख्या में Nth अंक का उत्पादन करेंगे । आप 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 कम हो सकता है)।


पुलिस:

आपको एक ही भाषा में दो कार्य / कार्यक्रम लिखने होंगे, वही काम करें। आपको एक फ़ंक्शन / प्रोग्राम और साथ ही आपके द्वारा लिखे गए दो फ़ंक्शन / प्रोग्राम के बीच लेवेन्सहाइट दूरी पोस्ट करना होगा। लेवेंसहाइट की दूरी को वर्णों में मापा जाता है (इसलिए दो बाइट वाले वर्ण एलडी = 1 देगा)।

अप्रकाशित कोड मूल समाधान से अधिक लंबा नहीं हो सकता (लेकिन यह समान आकार हो सकता है)। लुटेरे आपके द्वारा दी गई सटीक लेवेन्शिन दूरी के साथ एक कोड लिखने का प्रयास करेंगे (यह आपके अप्रमाणित कोड से अलग हो सकता है, जब तक यह काम करता है)।

विजेता अनियंत्रित सबमिशन होगा जिसमें सबसे कम लेवेंसहाइट दूरी होगी।

आप कर सकते हैं यहाँ Levenshtein दूरी की जाँच!


यदि आपका सबमिशन 7 दिनों के लिए अनियंत्रित हो जाता है तो आप अपने द्वारा लिखे गए वैकल्पिक कोड को प्रकट कर सकते हैं और अपने सबमिशन को सुरक्षित मान सकते हैं।



हां, मैं इसे नियमों में जोड़ दूंगा। :)
स्टीवी ग्रिफिन

आप स्क्रिप्ट के बारे में बात करते हैं, लेकिन मुझे लगता है कि यह डिफ़ॉल्ट प्रोग्राम या फ़ंक्शन है ?
केविन क्रूज़सेन

हां, डिफ़ॉल्ट सब कुछ :)
स्टू ग्रिफिन

आप टिप्पणियों और व्हाट्सएप को कैसे संभाल रहे हैं, मैं कुछ अजीब चीजें देखता हूं।
मैजिक ऑक्टोपस Urn

1
"आपका कोड N = 2 ^ 15 तक संख्याओं के लिए काम करना चाहिए" -> लेकिन परीक्षण मामलों में से एक इससे बड़ा है। क्या 274164 मामला आवश्यक है?
टॉम कारपेंटर

जवाबों:


6

हास्केल , एलडी = 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)


@ लिकोनी हां, cquents में कई गुणा गुणन जैसे कि, Mathematica जैसे थोड़े हैं, लेकिन आपको रिक्त स्थान की आवश्यकता नहीं है। एक स्पष्टीकरण जोड़ना।
स्टीफन

3

जावास्क्रिप्ट (ईएस 6), एलडी = 103 ( फटा )

इस तरह की उच्च लेवेंसाइटिन दूरी का उपयोग करना शायद सबसे अच्छी रणनीति नहीं है, लेकिन चलो इसे वैसे भी आज़माएं।

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``[$]

क्या यह पट्टी पीछे हटने के बाद 0s है?
आउटगोल्फ

@EriktheOutgolfer हां। यह +सुनिश्चित करता है कि उलटा स्ट्रिंग एक संख्या के लिए मजबूर है।
अरनौलड

1
ओह्ह्ह ... वाह, यह जितना मैंने सोचा था उससे कहीं ज्यादा कठिन है।
मैजिक ऑक्टोपस Urn


3

पायथन 2, 104 बाइट्स, एलडी = 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]

पुनश्च व्हाट्सएप और टिप्पणी की एक असीमित राशि की अनुमति है? यदि ऐसा है तो दरार करना मुश्किल नहीं होगा।


1
"अपरिवर्तित कोड मूल समाधान से अधिक लंबा नहीं हो सकता है।"
खुल्द्रेसथ ना'बर्या

@Sroroble मैंने देखा कि लेकिन मुझे नहीं लगता कि यह एक प्रोग्राम बनाना मुश्किल होगा जो इस से बहुत छोटा है। पहले से ही एक और जवाब में अजगर 3 में किया गया है और यह अजगर 2 में काम करता है इसलिए उन्हें जोड़ने की जरूरत है एस का एक गुच्छा \n(लगभग 50) है
dylnan

क्या 50 न्यूलाइन्स 21 की लेवेंसहाइट दूरी से अधिक नहीं होंगी?
खुल्द्रसेठ na'Barya

@Scrooble आप बहुत सही हैं मैं भ्रमित हो गया था और गलत तरीके से समस्या के बारे में सोच रहा था। धन्यवाद
dylnan

1
यह 5 से कम इनपुट पर त्रुटि लगता है
लियो

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जहांn0-अनुक्रमित इनपुट है।


अंतिम परीक्षण मामले के लिए, आपको थोड़ा धैर्य की आवश्यकता है, क्योंकि इस खराब मशीन को आपको परिणाम पेश करने के लिए लाखों बिट-शिफ्ट और परिवर्धन करने होंगे;)

यहाँ की भाषा मशीन कोड है, इसलिए 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। हाँ, संपादित किया गया।
फेलिक्स पालमेन


2

जावा 8, (177 बाइट्स) LD = 92 ( @Arnauld द्वारा क्रैक किया गया )

( Ive ने इस ऑनलाइन 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 बाइट्स, 92 एलडी )
केविन क्रूज़सेन

2

ऑक्टेव , एलडी = 63, फटा

@(t)[arrayfun(@(t)num2str(str2num(flip(num2str(t)))),(1:t).^2,'uni',0){:}](t)

इसे ऑनलाइन आज़माएं!

प्रस्तुत करने के लिए 77 बाइट्स है, इसलिए आपको बहुत थोड़ा स्थानापन्न करने की आवश्यकता है =)



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 से छोटे नंबर रखता है, तो यह अंडरफ्लो करता है, कैरी फ्लैग को क्लियर करता है, इसलिए सही ब्रांच इंस्ट्रक्शन वास्तव में है bccbmi(नकारात्मक होने पर शाखाओं में बँटना), जैसा कि मूल कोड में है, वैसे ही यहाँ काम करने के लिए होता है, क्योंकि तुलनात्मक संख्याएँ काफी छोटी हैं, इसलिए घटाव का परिणाम ऋणात्मक सीमा में समाप्त हो जाता है ($80-$ff ) जब कोई अंडरफ़्लो होता है।

ऑनलाइन डेमो


यह का एक उन्नत / संकुचित संस्करण है मेरे पिछले सबमिशन । आकार को कम करने के लिए कुछ अन्य ट्रिक्स के बीच, यह बेकार कोड को हटा देता है जो निहित था और एक प्रकार का "सरल" *) दरार की अनुमति देता था। सभी सभी में, आकार 16 बाइट्स से कम हो जाता है। इस बार, एलडी 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। अच्छी तरह से अगर आप जोर देते हैं - बहुत बहुत धन्यवाद, मैंने इसे संपादित किया।
फेलिक्स पालमेन




0

पायथन 3: एलडी = 9 | फटा

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

यह एक काफी (बहुत) आसान होना चाहिए: पी



1
मैंने अपना क्रैक हटा दिया क्योंकि मूल उत्तर अमान्य है।
श्री एक्सकोडर

@ Mr.Xcoder अब आप हटाना रद्द कर सकते हैं; एलडी एक ही है क्योंकि .lstrip("0")भाग को केवल कॉपी किया जा सकता है।
हाइपरएन्यूट्रीनो


0

सी ++, एलडी = 159

0-अनुक्रमित, इनपुट argv[1], जीसीसी 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);}

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.