অ্যাডলার -32 চেকসামটি গণনা করুন


32

পটভূমি

অ্যাডলার -32 হ'ল মার্ক অ্যাডলার 1995 সালে আবিষ্কার করেন একটি 32-বিট চেকসাম যা বহুল ব্যবহৃত জ্লিব লাইব্রেরির অংশ (এটি অ্যাডলার দ্বারাও বিকাশিত)। অ্যাডলার -32 32-বিট চক্রীয় রিডানডেন্সি চেকের মতো নির্ভরযোগ্য নয় , তবে - কমপক্ষে সফ্টওয়্যারে - এটি প্রয়োগ করা আরও দ্রুত এবং সহজ।

সংজ্ঞা

যাক বি = [খ 1 , ⋯, খ এন ] একটি বাইট অ্যারের হও।

বি এর অ্যাডলার -32 চেকসামটি নিম্ন + 65536 × উচ্চের ফলাফল হিসাবে সংজ্ঞায়িত করা হয়েছে , যেখানে:

  • কম: = ((1 + বি 1 + ⋯ + বি এন ) 630521 মডি)

  • উচ্চ: = (((1 + বি 1 ) + (1 + বি 1 + বি 2 ) + ⋯ (1 + বি 1 + ⋯ + বি এন )) আধুনিক 65521))

কার্য

ইনপুট হিসাবে একটি বাইট অ্যারে দেওয়া হয়েছে, নিম্নোক্তভাবে মেনে চলুন এবং তার অ্যাডলার -32 চেকসামটি ফিরিয়ে দিন

  • আপনি ইনপুটটি বাইট বা পূর্ণসংখ্যার অ্যারে বা স্ট্রিং হিসাবে নিতে পারেন।

    উভয় ক্ষেত্রেই কেবল প্রিন্টযোগ্য এএসসিআইআই অক্ষরের সাথে সম্পর্কিত বাইটগুলি ইনপুটটিতে উপস্থিত হবে।

    আপনি ধরে নিতে পারেন যে ইনপুটটির দৈর্ঘ্য 0 <দৈর্ঘ্য ≤ 4096 পূরণ করবে ।

  • আপনি যদি আউটপুট মুদ্রণ করতে চান তবে আপনি 256 পর্যন্ত কোনও ধনাত্মক বেস ব্যবহার করতে পারেন।

    আপনি ইউনারী চয়ন করেন তাহলে, নিশ্চিত করুন অনুবাদক পর্যন্ত সব ব্যবস্থা করতে সক্ষম করতে 2 32 983056 - RAM এর 16 GiB সহ মেশিনে আউটপুট বাইট।

  • অ্যাডলার -32 চেকসুমের গণনা করা বিল্ট-ইনগুলি নিষিদ্ধ।

  • স্ট্যান্ডার্ড বিধি প্রযোজ্য।

পরীক্ষার মামলা

String:     "Eagles are great!"
Byte array: [69, 97, 103, 108, 101, 115, 32, 97, 114, 101, 32, 103, 114, 101, 97, 116, 33]
Checksum:   918816254

String:     "Programming Puzzles & Code Golf"
Byte array: [80, 114, 111, 103, 114, 97, 109, 109, 105, 110, 103, 32, 80, 117, 122, 122, 108, 101, 115, 32, 38, 32, 67, 111, 100, 101, 32, 71, 111, 108, 102]
Checksum:   3133147946

String:     "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
Byte array: [126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126]
Checksum:   68095937

String:     <1040 question marks>
Byte array: <1040 copies of 63>
Checksum:   2181038080

7
আমি নোট করব যে এখানে জবাবগুলি গণনা না হওয়া অবধি মডিউল অপারেশন পিছিয়ে দেওয়ার কারণে 32 বা 64-বিট পূর্ণসংখ্যার যোগফলগুলি ওভারফ্লো করার সময় এখানে অনেকগুলি উত্তর বড় বা খুব বড় ইনপুট সিকোয়েন্সগুলির সাথে ব্যর্থ হয়। সত্যিকারের কমপ্লায়েন্ট বাস্তবায়নের জন্য পরিমাণগুলি উপচে পড়া থেকে রক্ষা পেতে অন্তত পর্যায়ক্রমে মডুলো অপারেশন করা দরকার। একটি 32-বিট স্বাক্ষরিত পূর্ণসংখ্যা কেবল 4096 0xff এর পরে উপচে পড়বে। একটি 64-বিট স্বাক্ষরিত পূর্ণসংখ্যার 0xff এর 256 এমবি এর পরে উপচে পড়বে।
মার্ক অ্যাডলার

@ মার্কএডলার এইচএম, ফর্সা পয়েন্ট। যেহেতু আমি সুনির্দিষ্টভাবে দীর্ঘতর স্ট্রিংয়ের জন্য সমাধানগুলি কাজ করতে হবে এবং আমি বিদ্যমান উত্তরগুলিকে অকার্যকর করতে চাই না তা নির্দিষ্ট করেছিলাম না, তাই ইনপুটটির দৈর্ঘ্যের জন্য আমি একটি সীমা নির্ধারণ করব।
ডেনিস 19

@ মার্কএডলার আমার মনে হয় না এটি গুরুত্ব দেয়। আমি মোটামুটি নিশ্চিত যে ওভারফ্লো (স্বাক্ষরিত 32-বিট ইন্টিজার) শুধুমাত্র ইনপুটের 4104 বা তার বেশি বাইট সঙ্গে ঘটতে পারে নই, হিসেবে সর্বোচ্চ মান উচ্চ মডিউল আগে n * যেসব (ঢ + 1) / 2 * 255 + এন । তার উপরে, চ্যালেঞ্জটি ইনপুটটিকে প্রিন্টযোগ্য এএসসিআইআই অক্ষরের সাথে সম্পর্কিত বাইটগুলিতে সীমাবদ্ধ করে।
ডেনিস

আমরা ভাষাগুলিকে তাদের সংখ্যার ধরণের উপায়ে প্রবাহের অনুমতি দিতে পারি এবং কেবলমাত্র প্রত্যাশিত ফলাফলটি সমপরিমাণ, ওভারফ্লোর জন্য অ্যাকাউন্টিং, সঠিক ফলাফলের জন্য প্রয়োজন।
মাইল 23

1
@ পিটারকর্ডস হ্যাঁ, 32-বিট ইন্টের অ্যারেগুলি পুরোপুরি জরিমানা। কমপক্ষে আমার মতে, জমা দেওয়ার ক্ষেত্রে অ্যালগরিদমকে গল্ফ করার দিকে মনোনিবেশ করা উচিত এবং I / O তে যতটা সম্ভব মনোযোগ দেওয়া উচিত।
ডেনিস

উত্তর:


3

জেলি, 19 17 বাইট

+\,S‘S€%65521ḅ⁹²¤

এটি অনলাইন চেষ্টা করুন!

+\,S‘S€%65521ḅ⁹²¤    Main monadic chain. Takes array as only argument.

                     The array is shown here as [b1 b2 ... bn].
+\                   Reduce by addition (+) while returning immediate results.
                         yields [b1 b1+b2 ... b1+b2+...+bn].

  ,                  Concatenate with...
   S                 the sum of the argument.
                         yields [[b1 b1+b2 ... b1+b2+...+bn] b1+b2+...+bn].

    ‘                Increment [each].
                         yields [[1+b1 1+b1+b2 ... 1+b1+b2+...+bn] 1+b1+b2+...+bn].

     S€              Sum each list.
                         yields [[1+b1+1+b1+b2+...+1+b1+b2+...+bn] 1+b1+b2+...+bn].

       %65521        Modulo [each] by 65521.

             ḅ⁹²¤    Convert from base    65536    to integer.
              ⁹                        256
               ²                           squared

আরও ভাল:⁹²¤
ডেনিস

1
@ ডেনিস আমি তখন আপনার 18-বাইট ছাড়িয়েছি
লিকি নুন

1
ঠিক আছে, আপনি ছড়িয়ে পড়েছেন ..
লিকি নুন

64

গণিত, 46 বাইট

{1,4^8}.Fold[##+{0,#&@@#}&,{1,0},#]~Mod~65521&

একটি বেনামে ফাংশন যা একটি পূর্ণসংখ্যার অ্যারে নেয় এবং মাইল এবং মার্টিন থেকে কিছু উন্নতি সহ অ্যাডলার -32 ফেরত দেয় (মন্তব্য দেখুন)।

মাইল '46 বাইট , তবে দ্রুত:

{1,4^8}.{Tr@#+1,Tr[Accumulate@#+1]}~Mod~65521&

37
... আপনি কি নিজের বিখ্যাত অ্যালগরিদমকে গল্ফ দিয়েছিলেন?
মেগো

25
আমি যদি কিছুটা তারকা-আঘাত পেয়েছি তবে আমাকে ক্ষমা করুন। এটি আমাদের প্রতিদিনের নয় যে আপনি আমাদের নম্র ছোট্ট সাইটে সফটওয়্যার ইঞ্জিনিয়ারিংয়ের এত বড় নাম দেখেন। বিদেশে স্বাগতম!
মেগো

6
এত বড় নয়।
মার্ক অ্যাডলার

3
আপনি যদি আমাকে বোঝাতে চান তবে এই প্রথম আমি ম্যাথমেটিকায় অ্যাডলার -32 বাস্তবায়ন করার কথা ভাবলাম।
মার্ক অ্যাডলার

9
অথবা আপনি কোড গল্ফে যোগদানের পর থেকে সম্ভবত আপনি এই সমাধানটি প্রস্তুত পেয়েছেন, কেবল এটির জিজ্ঞাসা করার অপেক্ষা করে। "অবশেষে!" ;-)
অ্যান্টি হাপাল

13

জুলিয়া, 73 46 বাইট

x->[sum(x)+1;sum(cumsum(x)+1)]%65521⋅[1;4^8]

এটি একটি বেনাম ফাংশন যা একটি অ্যারে গ্রহণ করে এবং পূর্ণসংখ্যা ফেরত দেয়। এটি কল করতে, এটি একটি ভেরিয়েবলের জন্য বরাদ্দ করুন।

আমরা একত্রিত sum(x) + 1এবং sum(cumsum(x) + 1)একটি অ্যারের, যেখানে মধ্যে xইনপুট অ্যারের, এবং প্রতিটি মডিউল 65521. নিতে আমরা তখন 1 এবং 4 ডট পণ্য গনা 8 , যা আমাদের দেয় (sum(x) + 1) + 4^8 * sum(cumsum(x) + 1), যা ঠিক এডলার-32 সূত্র।

এটি অনলাইন চেষ্টা করুন! (সমস্ত পরীক্ষার কেস অন্তর্ভুক্ত)

স্পাই 3000 এবং ডেনিসকে 27 বাইট সংরক্ষণ করা!


বাহ, সত্যিই চালাক।
বিড়াল

@ কেট আমার কাছে স্প 3000 এবং ডেনিস বেশিরভাগ চতুরতার জন্য ধন্যবাদ জানাতে চাই। :)
অ্যালেক্স এ।

11

x86-64 মেশিন কোড ফাংশন: 33 32 বাইট (অথবা এর পরিবর্তে একটি ইনপুট সহ 31 30 বাইট )int[]char[]

x86-32 মেশিন কোড ফাংশন: 31 বাইট

একটি জিএনইউ সি হিসাবে ইনলাইন-এসএম কোড খণ্ড: 2 বি 1 বি সংরক্ষণ করে (কেবলমাত্র retইনসন)।

মন্তব্য করেছেন উত্স এবং গিথুবে ড্রাইভার ড্রাইভার

Bit৪ বিট সংস্করণটি সি থেকে সরাসরি স্ট্যান্ডার্ড সিস্টেম ভি x86-64 এবিআইয়ের সাথে কল করা যায় (আমি যে রেজিগুলিতে চাই সেগুলিতে আরোগুলি পেতে 2 টি ডামি আর্গ ব্যবহার করে)। কাস্টম কলিং কনভেনশনগুলি asm কোডের জন্য অস্বাভাবিক নয়, সুতরাং এটি একটি বোনাস বৈশিষ্ট্য।

32 বিট মেশিন কোড 1 বি সংরক্ষণ করে, কারণ উচ্চ এবং নিম্ন অংশগুলিকে push16/push16 => pop32কেবল 32 বিট মোডে কাজ করে works একটি 32 বিট ফাংশনের একটি কাস্টম কলিং কনভেনশন প্রয়োজন। আমাদের এটির বিরুদ্ধে রাখা উচিত নয়, তবে সি থেকে কল করার একটি মোড়কের ফাংশন প্রয়োজন।

4096 ~(ASCII 126) বাইট প্রসেস করার পরে high = 0x3f040000, low = 0x7e001,। সুতরাং highএর সবচেয়ে উল্লেখযোগ্য বিটটি এখনও সেট করা হয়নি। আমার কোডটির এই সুবিধা নেয়, সাইন-ব্যাপ্ত eaxমধ্যে edx:eaxদিয়ে cdqzeroing একটি উপায় হিসেবে edx

# See the NASM source below
0000000000401120 <golfed_adler32_amd64>:
  401120:       31 c0                   xor    eax,eax
  401122:       99                      cdq    
  401123:       8d 7a 01                lea    edi,[rdx+0x1]
0000000000401126 <golfed_adler32_amd64.byteloop>:
  401126:       ac                      lods   al,BYTE PTR ds:[rsi]
  401127:       01 c7                   add    edi,eax
  401129:       01 fa                   add    edx,edi
  40112b:       e2 f9                   loop   401126 <golfed_adler32_amd64.byteloop>
000000000040112d <golfed_adler32_amd64.end>:
  40112d:       66 b9 f1 ff             mov    cx,0xfff1
  401131:       92                      xchg   edx,eax
  401132:       99                      cdq    
  401133:       f7 f1                   div    ecx
  401135:       52                      push   rdx
  401136:       97                      xchg   edi,eax
  401137:       99                      cdq    
  401138:       f7 f1                   div    ecx
  40113a:       66 52                   push   dx      # this is the diff from last version: evil push/pop instead of shift/add
  40113c:       58                      pop    rax
  40113d:       66 5a                   pop    dx
  40113f:       c3                      ret    
0000000000401140 <golfed_adler32_amd64_end>:

0x40 - 0x20 = 32 বাইট।


মন্তব্য করেছেন এনএএসএম উত্স:

ঠাট:

  • xchg eax, r32এক বাইট; মুভ চেয়ে সস্তা। > = 386 এর চেয়ে অনেক বেশি স্টাফের জন্য কুড়ালিতে 8086 এর প্রয়োজনীয় ডেটা প্রয়োজন, তাই তারা এখন-বিরল-ব্যবহৃত-তে প্রচুর অপকোড-স্পেস ব্যয় করার সিদ্ধান্ত নিয়েছে xchg ax, r16

  • একক রেজিস্টারে উচ্চ এবং নিম্ন সংশ্লেষের জন্য পুশ 64 এবং পুশ 16 মেশানো রেজি-রেগ ডেটা মুভমেন্ট নির্দেশাবলী প্রায় দু'জনের কাছাকাছি সাশ্রয় করে div। এই কৌশলটির 32 বিট সংস্করণটি আরও ভাল কাজ করে: push16 / push16 / pop326 টি নয়, কেবল 5 বি মোট।

যেহেতু আমরা ধাক্কা / পপ করি, এটি সিসভি এমডি 64 এবিআইতে (একটি লাল অঞ্চল সহ) ইনলাইন এসেমের জন্য নিরাপদ নয়

golfed_adler32_amd64_v3:   ; (int dummy, const char *buf, int dummy, uint64_t len)

    ;; args: len in rcx,  const char *buf in rsi
    ;; Without dummy args, (unsigned len, const char *buf),  mov ecx, edi is the obvious solution, costing 2 bytes

    xor     eax,eax         ; scratch reg for loading bytes
    cdq                     ; edx: high=0
    lea     edi, [rdx+1]    ; edi: low=1
    ;jrcxz  .end            ; We don't handle len=0.  unlike rep, loop only checks rcx after decrementing
.byteloop:
    lodsb                   ; upper 24b of eax stays zeroed (no partial-register stall on Intel P6/SnB-family CPUs, thanks to the xor-zeroing)
    add     edi, eax        ; low += zero_extend(buf[i])
    add     edx, edi        ; high += low
    loop   .byteloop
.end:
    ;; exit when ecx = 0, eax = last byte of buf
    ;; lodsb at this point would load the terminating 0 byte, conveniently leaving eax=0

    mov     cx, 65521       ; ecx = m = adler32 magic constant.  (upper 16b of ecx is zero from the loop exit condition.  This saves 1B over mov r32,imm32)
    ;sub    cx, (65536 - 65521) ; the immediate is small enough to use the imm8 encoding.  No saving over mov, though, since this needs a mod/rm byte

    xchg    eax, edx        ; eax = high,  edx = buf[last_byte]
    cdq                     ; could be removed if we could arrange things so the loop ended with a load of the 0 byte

    div     ecx             ; div instead of idiv to fault instead of returning wrong answers if high has overflowed to negative.  (-1234 % m is negative)
    push    rdx             ; push high%m and 6B of zero padding

    xchg    eax, edi        ; eax=low
    cdq
    div     ecx             ; edx = low%m

    ;; concatenate the two 16bit halves of the result by putting them in contiguous memory
    push    dx              ; push low%m with no padding
    pop     rax             ; pop  high%m << 16 | low%m   (x86 is little-endian)

    pop     dx              ; add rsp, 2 to restore the stack pointer

    ;; outside of 16bit code, we can't justify returning the result in the dx:ax register pair
    ret
golfed_adler32_amd64_end_v3:

আমি rcxদুটি লুপ কাউন্টার না রেখে অ্যারে সূচক হিসাবে ব্যবহার করার বিষয়টি বিবেচনা করেছি , তবে অ্যাডলার 32 (গুলি) = অ্যাডলার 32 (বিপরীত (গুলি))। সুতরাং আমরা ব্যবহার করতে পারি না loop। -লাইন থেকে শূন্যের দিকে গণনা করা এবং movzx r32, [rsi+rcx]কেবলমাত্র অনেকগুলি বাইট ব্যবহার করে ।

আমরা যদি পয়েন্টারটি নিজের বাড়ানোর কথা বিবেচনা করতে চাই তবে 32 বিট কোডটি সম্ভবত যাওয়ার উপায়। এমনকি এক্স 32 এবিআই (32 বিট পয়েন্টার) যথেষ্ট নয়, কারণ inc esiএএমডি 64 এ 2 বি, তবে আই 386-তে 1 বি। প্রতিটি উপাদানকে ইক্সে শূন্য-প্রসারিত করার জন্য মোট xor eax,eax/ lodsb/ loop: 4B টিকে পরাজিত করা শক্ত মনে হয়। inc esi/ movzx r32, byte [esi]/ loopহয় 5 বি।

scas64 বিট মোডে 1B নির্দেশাবলী সহ পয়েন্টার বাড়ানোর জন্য অন্য বিকল্প option ( rdi/ এর ediপরিবর্তে rsi, সুতরাং আমরা পয়েন্টারটি আর্গ ইন করব rdi)। আমরা scasলুপের শর্ত হিসাবে পতাকা ফলাফলটি ব্যবহার করতে পারি না , যদিও আমরা ইক্স শূন্য রাখতে চাই না। বিভিন্ন রেজিস্টার বরাদ্দ সম্ভবত লুপ পরে একটি বাইট সংরক্ষণ করতে পারে।


int[] ইনপুট

সম্পূর্ণ ফাংশন গ্রহণ করা uint8_t[]হ'ল "প্রধান" উত্তর, কারণ এটি আরও আকর্ষণীয় চ্যালেঞ্জ। আমাদের কলকারীকে int[]এই ভাষায় করতে বলার জন্য আনপ্যাক করা একটি অযৌক্তিক জিনিস, তবে এটি 2 বি সংরক্ষণ করে না।

আমরা যদি 32bit পূর্ণসংখ্যার একটি প্যাক না অ্যারে হিসাবে আমাদের ইনপুট নিতে, আমরা এক বাইট সহজে সংরক্ষণ করুন (ব্যবহার করতে পারেন lodsdএবং প্রতিস্থাপন xor eax,eax / cdqশুধু সঙ্গে xor edx,edx)।

আমরা lodsd/ এর সাথে এডেক্স শূন্য করে আরেকটি বাইট সংরক্ষণ করতে পারি cdqএবং লুপটি পুনরায় সাজিয়ে তুলতে পারলে এটি প্রস্থান করার আগে 0 টি উপাদানকে লোড করে। (আমরা এখনও ধরে নিচ্ছি যে এটি বিদ্যমান, যদিও এটি intএকটি স্ট্রিংয়ের অ্যারে নয়)।

; untested: I didn't modify the test driver to unpack strings for this
golfed_adler32_int_array:
    ; xor   edx,edx
    lodsd                   ; first element. only the low byte non-zero
    cdq                     ; edx: high=0
    lea     edi, [rdx+1]    ; edi: low=1
    ;jrcxz  .end            ; handle len=0?  unlike rep, loop only checks rcx after decrementing
.intloop:
    add     edi, eax        ; low += buf[i]
    add     edx, edi        ; high += low
    lodsd                   ; load buf[i+1] for next iteration
    loop   .intloop
.end:
    ;; exit when ecx = 0, eax = terminating 0

    xchg    eax, edx
    ;cdq               ; edx=0 already, ready for div
    ; same as the char version

আমি একটি অনির্ধারিত সংস্করণও তৈরি করেছি যা ব্যবহার করে scasd(1 বি সংস্করণ add edi,4) এবং এর add eax, [rdi]পরিবর্তে lodsd, তবে এটি 30 বাইটও। highলুপের শেষে ইক্স থাকা থেকে প্রাপ্ত সঞ্চয়গুলি অন্য কোথাও বড় কোডের মাধ্যমে ভারসাম্যপূর্ণ। ইনপুটটিতে কোনও সমাপ্তি 0উপাদানের উপর নির্ভর না করার সুবিধা রয়েছে , যদিও এটি কোনও আনপ্যাকড অ্যারের জন্য অযৌক্তিক যেখানে আমাদের স্পষ্টতই দৈর্ঘ্যটি দেওয়া হয়েছে।


সি ++ 11 পরীক্ষা চালক

গিথুব লিঙ্কটি দেখুন। এই উত্তরটি খুব বড় হয়ে উঠছিল, এবং পরীক্ষা চালকরা আরও বড় কোড সহ আরও বৈশিষ্ট্য পেয়েছিলেন।


2
আমি বাইটের পরিবর্তে পূর্ণসংখ্যার অনুমতি দিয়েছিলাম কারণ অনেকগুলি ভাষায় এমনকি বাইট টাইপও নেই। 32-বিট ইন্টিজারগুলি সমাবেশের জন্য একটি অপ্রাকৃত পছন্দ হতে পারে, তবে কোড গল্ফ নিয়মের মধ্যে থাকতে গিয়ে শেষ বাইটটি চেপে ধরতে চলেছে। যদি কোনও "অপ্রাকৃত" পছন্দ কম বাইট গণনা নিয়ে যায়, আমি বলব এটির জন্য যান।
ডেনিস

@ ডেনিস: আমি কিছু ভাষার নিয়মের প্রয়োজনীয়তা বুঝতে পারি। আমি আশা করি নিয়মটির কোনও উপায় int[]যদি কেবলমাত্র প্রয়োজন হয় তবে তা আপনাকে ব্যবহার করতে দেওয়া হয়েছিল, বা কোড বা কোনও কিছু 4 বাইটের বেশি সঞ্চয় করেছেন saved সমস্যার কোনও সমাধান উপস্থাপনে আমার কোনও সমস্যা নেই adler32(int[]), তবে আমি মনে করি যে adler32(char[])সমস্যাটি আরও আকর্ষণীয়, কারণ এটি আসল অ্যাডলার 32 ফাংশন। আমি সত্যিই এএসএম তে গল্ফ হতে চাই। (এবং আমি সত্যিই একরকম আরও একটি বাইট সংরক্ষণ করতে পছন্দ করব, যেহেতু বাস্তব জীবনে আসামে, পরবর্তী ফাংশনটি যদি 33 বাইট = 48 বাইট ব্যবহার করে ALIGN 16)। আমার ধারণা আমি দু'জনেই গল্ফ করব।
পিটার কর্ডেস

@ ডেনিস: এছাড়াও, আমাদের কী লেন = 0 কেস পরিচালনা করতে হবে? আমি এ এর do{}while(--len)পরিবর্তে লুপের স্টাইল ব্যবহার করে 2 বি সঞ্চয় করি while(len--){}
পিটার কর্ডেস

4
যখন এটি ব্যাখ্যার দিকে আসে, তত বেশি বিস্তারিত, তত ভাল।
ডেনিস

3
@ কেট: না, আমি ছাই বেদনা পাই না। আমি asm / পারফরম্যান্স প্রশ্নগুলির স্ট্যাকওভারফ্লো উত্তর লিখতে এবং x86 ট্যাগ উইকি আপডেট করে আমার সময় ব্যয় করব না: পি আপনি কোডটি কেন ধীর বা দ্রুত চালিত তা জানতে চাইলে আপনাকে এএসএমটি দেখতে হবে এবং বুঝতে হবে। একবার আপনি কিছুক্ষণ এটি করার পরে, আপনি কখনই কম্পাইলারটি দ্রুত কোড তৈরি করতে পারত তা দেখতে শুরু করেন ... এবং অবশেষে আপনি এটি লিখতে লিখতে কম্পাইলার কীভাবে কোডটি সংকলন করতে পারে তা ভাবতে শুরু করেন। পারফরম্যান্সের পরিবর্তে কোড আকারের জন্য অপ্টিমাইজ করা একটি আকর্ষণীয় পরিবর্তন sometimes
পিটার কর্ডেস

8

এমএটিএল , 22 বাইট

tsQwYsQsh16W15-\l8Mh*s

ইনপুট সংখ্যার একটি অ্যারে বা সংশ্লিষ্ট ASCII স্ট্রিং হতে পারে।

এটি অনলাইন চেষ্টা করুন!

ব্যাখ্যা

t       % Take array or string as input. Duplicate
sQ      % Sum all its values, and add 1
wYsQs   % Swap. Cumulative sum, add 1, sum
h       % Concatenate horizontally
16W     % 2^16: gives 65536
15-     % Subtract 15: gives 65521
\       % Element-wise modulo operation
l       % Push 1
8M      % Push 65536 again
h       % Concatenate horizontally: gives array [1, 65535]
*s      % Element-wise multiplication and sum. Display

7

আসলে, 36 বাইট

;Σu@;╗lR`╜HΣu`MΣk`:65521@%`M1#84ⁿ@q*

এটি অনলাইন চেষ্টা করুন!

ব্যাখ্যা:

;Σu@;╗lR`╜HΣu`MΣk`:65521@%`M1#84ⁿ@q*
;Σu                                   sum(input)+1
   @;╗lR                              push a copy of input to reg0, push range(1, len(input)+1)
        `╜HΣu`M                       map over range: sum(head(reg0,n))+1
               Σk                     sum, combine lower and upper into a list
                 `:65521@%`M          modulo each by 65521
                            1#84ⁿ@q*  dot product with [1,4**8]

7

জাভা, 84 বাইট

long a(int[]i){long a=1,b=0;for(int p:i)b=(b+(a=(a+p)%(p=65521)))%p;return b<<16|a;}

যদি জাভা সমাধানগুলি সর্বদা সম্পূর্ণ সংকলনযোগ্য কোড হিসাবে অনুমিত হয় তবে দয়া করে আমাকে জানান।

Ungolfed

long a(int[] i) {
    long a = 1, b = 0;
    for (int p : i) b = (b + (a = (a + p) % (p = 65521))) % p;
    return b << 16 | a;
}

বিঃদ্রঃ

আপনি ইনপুট রূপান্তর করতে হবে Stringকরতে int[]( int[]একাধিক বাইট খাটো byte[]বা char[])।

আউটপুট

String:     "Eagles are great!"
Byte Array: [69, 97, 103, 108, 101, 115, 32, 97, 114, 101, 32, 103, 114, 101, 97, 116, 33]
Checksum:   918816254
Expected:   918816254

String:     "Programming Puzzles & Code Golf"
Byte Array: [80, 114, 111, 103, 114, 97, 109, 109, 105, 110, 103, 32, 80, 117, 122, 122, 108, 101, 115, 32, 38, 32, 67, 111, 100, 101, 32, 71, 111, 108, 102]
Checksum:   3133147946
Expected:   3133147946

String:     "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
Byte Array: [126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126]
Checksum:   68095937
Expected:   68095937

String:     "?????????...?"
Byte Array: [63, 63, 63, 63, 63, 63, 63, 63, 63, ...,63]
Checksum:   2181038080
Expected:   2181038080

1
সুন্দর উত্তর, এবং সাইটে আপনাকে স্বাগতম! এছাড়াও, যেগুলি সমাধান সম্পূর্ণ এবং সংকলনযোগ্য নয় তা ঠিক আছে যদি না চ্যালেঞ্জটি স্পষ্টভাবে না বলে যে এটি একটি সম্পূর্ণ প্রোগ্রাম হওয়া উচিত। এটি একটি সম্পূর্ণ ফাংশন, তাই এটি গণনা করা হয়।
ডিজেএমসিএমহেম

6

পিট, 120 কোডেল কোডেলাইজ 1

কোডেল 20 এর সাথে:

কোডেল 20

নোটস / এটি কীভাবে কাজ করে?

  • যেহেতু কোনও অ্যারে বা স্ট্রিংটি ইনপুট হিসাবে ব্যবহার করা সম্ভব নয়, তাই এই প্রোগ্রামটি ইনপুট হিসাবে একক সিরিজ (পূর্ণসংখ্যা ascii অক্ষর উপস্থাপন করে) নিয়ে কাজ করে। আমি প্রথমে চরিত্রের ইনপুটগুলি ব্যবহার করার কথা ভেবেছিলাম তবে সমাপ্তির জন্য একটি ভাল সমাধান খুঁজতে লড়াই করেছিলাম, সুতরাং 1 এর চেয়ে কম সংখ্যক সংখ্যক প্রবেশ করা হলে এখন এটি বন্ধ হয়ে যায়। এটি মূলত সমাপ্তির জন্য কেবল নেতিবাচক মান ছিল, তবে প্রোগ্রামটি লেখার পরে আমাকে সূচনা পরিবর্তন করতে হয়েছিল, সুতরাং এখন আমি প্রয়োজনীয়টি ফিট করতে পারি না 2, কেবলমাত্র একটি 1(ট্রেস ইমেজের 26/45)। যদিও এটি চ্যালেঞ্জের নিয়ম অনুসারে, কেবল মুদ্রণযোগ্য আস্কি অক্ষর অনুমোদিত।

  • লুপটি পুনরায় স্থাপনের সাথে দীর্ঘ সময় ধরে সংগ্রাম করা হয়েছে, যদিও শেষ পর্যন্ত আমি বেশ মার্জিত সমাধান পেয়েছি। না pointerবা switchঅপারেশনস, ইনপুটটি পড়ার জন্য সবুজ কোডেলে ফিরে না আসা পর্যন্ত কেবল দোভাষী দেওয়ালগুলিতে চলে। (43-> 44 টিস চিত্রগুলিতে)।

  • লুপ সমাপ্তি প্রথমে ইনপুটটিকে সদৃশ করে 1 টি যোগ করে এবং পরে এটি 1 এর চেয়ে বড় কিনা তা পরীক্ষা করে পাওয়া যায় যদি এটি হয় তবে কোডেল চয়নকারী ট্রিগার হয় এবং নীচের পথে কার্যকর হয়। যদি তা না হয় তবে প্রোগ্রামটি বামদিকে সংশ্লেষ করে (উজ্জ্বল হলুদ কোডেলগুলি, ট্রেস চিত্রগুলিতে 31/50)।

  • সমর্থিত ইনপুট আকারটি ইন্টারপ্রেটার বাস্তবায়ন নির্ভর, যদিও ডান ইন্টারপ্রেটারের সাথে একটি নির্বিচারে বড় ইনপুটটিকে সমর্থন করা সম্ভব হবে (বলুন, উদাহরণস্বরূপ, একটি জাভা ইন্টারপ্রেটার যা BigIntegerঅভ্যন্তরীণ মান হিসাবে ব্যবহার করে )

  • সবেমাত্র দেখা গেছে যে সেটআপটিতে একটি অপ্রয়োজনীয় DUPএবং CC(ট্রেস চিত্রগুলিতে 7-> 8-> 9) অন্তর্ভুক্ত রয়েছে। কীভাবে ঘটেছিল তা ধারণা নেই। এটি কার্যকরভাবে একটি নূপা, যদিও এটি কোডেল চয়নকারীকে 16 বার টগল করে যার ফলে কোনও পরিবর্তন হয় না।

এনপিট ছবিগুলি ট্রেস করুন

সেটআপ এবং প্রথম লুপ:

starttrace

লুপ সমাপ্তি, আউটপুট এবং প্রস্থান:

endtrace

আউটপুট

যদি আমি কেবল একটি আউটপুট অন্তর্ভুক্ত করি তবে আমাকে ক্ষমা করুন, ইনপুট করতে এটি কেবল দীর্ঘ সময় নেয়: ^)

String: "Eagles are great!"

PS B:\Marvin\Desktop\Piet> .\npiet.exe adler32.png
? 69
? 97
? 103
? 108
? 101
? 115
? 32
? 97
? 114
? 101
? 32
? 103
? 114
? 101
? 97
? 116
? 33
? -1
918816254

[65, -1] এর জন্য এনপিট ট্রেস

trace: step 0  (0,0/r,l nR -> 1,0/r,l dR):
action: push, value 4
trace: stack (1 values): 4

trace: step 1  (1,0/r,l dR -> 2,0/r,l dB):
action: duplicate
trace: stack (2 values): 4 4

trace: step 2  (2,0/r,l dB -> 3,0/r,l nM):
action: multiply
trace: stack (1 values): 16

trace: step 3  (3,0/r,l nM -> 4,0/r,l nC):
action: duplicate
trace: stack (2 values): 16 16

trace: step 4  (4,0/r,l nC -> 5,0/r,l nY):
action: duplicate
trace: stack (3 values): 16 16 16

trace: step 5  (5,0/r,l nY -> 6,0/r,l nM):
action: duplicate
trace: stack (4 values): 16 16 16 16

trace: step 6  (6,0/r,l nM -> 7,0/r,l nC):
action: duplicate
trace: stack (5 values): 16 16 16 16 16

trace: step 7  (7,0/r,l nC -> 8,0/r,l nY):
action: duplicate
trace: stack (6 values): 16 16 16 16 16 16

trace: step 8  (8,0/r,l nY -> 9,0/r,l lB):
action: switch
trace: stack (5 values): 16 16 16 16 16
trace: stack (5 values): 16 16 16 16 16

trace: step 9  (9,0/r,l lB -> 10,0/r,l dM):
action: multiply
trace: stack (4 values): 256 16 16 16

trace: step 10  (10,0/r,l dM -> 11,0/r,l nR):
action: multiply
trace: stack (3 values): 4096 16 16

trace: step 11  (11,0/r,l nR -> 12,0/r,l lY):
action: multiply
trace: stack (2 values): 65536 16

trace: step 12  (12,0/r,l lY -> 13,0/r,l lM):
action: duplicate
trace: stack (3 values): 65536 65536 16

trace: step 13  (13,0/r,l lM -> 14,0/r,l nM):
action: push, value 3
trace: stack (4 values): 3 65536 65536 16

trace: step 14  (14,0/r,l nM -> 15,0/r,l dM):
action: push, value 2
trace: stack (5 values): 2 3 65536 65536 16

trace: step 15  (15,0/r,l dM -> 16,0/r,l lC):
action: roll
trace: stack (3 values): 16 65536 65536

trace: step 16  (16,0/r,l lC -> 17,0/r,l nB):
action: sub
trace: stack (2 values): 65520 65536

trace: step 17  (17,0/r,l nB -> 18,0/r,l dB):
action: push, value 1
trace: stack (3 values): 1 65520 65536

trace: step 18  (18,0/r,l dB -> 19,0/r,l dM):
action: add
trace: stack (2 values): 65521 65536

trace: step 19  (19,0/r,l dM -> 19,1/d,r dC):
action: duplicate
trace: stack (3 values): 65521 65521 65536

trace: step 20  (19,1/d,r dC -> 18,1/l,l lC):
action: push, value 1
trace: stack (4 values): 1 65521 65521 65536

trace: step 21  (18,1/l,l lC -> 17,1/l,l nC):
action: push, value 1
trace: stack (5 values): 1 1 65521 65521 65536

trace: step 22  (17,1/l,l nC -> 16,1/l,l dB):
action: sub
trace: stack (4 values): 0 65521 65521 65536

trace: step 23  (16,1/l,l dB -> 15,1/l,l lB):
action: push, value 1
trace: stack (5 values): 1 0 65521 65521 65536

trace: step 24  (15,1/l,l lB -> 13,2/l,l dG):
action: in(number)
? 65
trace: stack (6 values): 65 1 0 65521 65521 65536

trace: step 25  (13,2/l,l dG -> 12,2/l,l dR):
action: duplicate
trace: stack (7 values): 65 65 1 0 65521 65521 65536

trace: step 26  (12,2/l,l dR -> 11,2/l,l lR):
action: push, value 1
trace: stack (8 values): 1 65 65 1 0 65521 65521 65536

trace: step 27  (11,2/l,l lR -> 10,2/l,l lY):
action: add
trace: stack (7 values): 66 65 1 0 65521 65521 65536

trace: step 28  (10,2/l,l lY -> 9,2/l,l nY):
action: push, value 1
trace: stack (8 values): 1 66 65 1 0 65521 65521 65536

trace: step 29  (9,2/l,l nY -> 8,1/l,r nB):
action: greater
trace: stack (7 values): 1 65 1 0 65521 65521 65536

trace: step 30  (8,1/l,r nB -> 7,1/l,r lY):
action: switch
trace: stack (6 values): 65 1 0 65521 65521 65536
trace: stack (6 values): 65 1 0 65521 65521 65536

trace: step 31  (7,1/l,l lY -> 6,2/l,l nY):
action: push, value 2
trace: stack (7 values): 2 65 1 0 65521 65521 65536

trace: step 32  (6,2/l,l nY -> 5,3/l,l dB):
action: pointer
trace: stack (6 values): 65 1 0 65521 65521 65536

trace: step 33  (5,3/r,l dB -> 7,4/r,l dM):
action: add
trace: stack (5 values): 66 0 65521 65521 65536

trace: step 34  (7,4/r,l dM -> 8,4/r,l dC):
action: duplicate
trace: stack (6 values): 66 66 0 65521 65521 65536

trace: step 35  (8,4/r,l dC -> 9,3/r,l lC):
action: push, value 3
trace: stack (7 values): 3 66 66 0 65521 65521 65536

trace: step 36  (9,3/r,l lC -> 10,3/r,l nC):
action: push, value 2
trace: stack (8 values): 2 3 66 66 0 65521 65521 65536

trace: step 37  (10,3/r,l nC -> 11,3/r,l dY):
action: roll
trace: stack (6 values): 0 66 66 65521 65521 65536

trace: step 38  (11,3/r,l dY -> 12,3/r,l dG):
action: add
trace: stack (5 values): 66 66 65521 65521 65536

trace: step 39  (12,3/r,l dG -> 13,3/r,l lG):
action: push, value 2
trace: stack (6 values): 2 66 66 65521 65521 65536

trace: step 40  (13,3/r,l lG -> 14,3/r,l nG):
action: push, value 1
trace: stack (7 values): 1 2 66 66 65521 65521 65536

trace: step 41  (14,3/r,l nG -> 15,3/r,l dR):
action: roll
trace: stack (5 values): 66 66 65521 65521 65536
trace: white cell(s) crossed - continuing with no command at 17,3...

trace: step 42  (15,3/r,l dR -> 17,3/r,l lB):

trace: step 43  (17,3/r,l lB -> 13,2/l,l dG):
action: in(number)
? -1
trace: stack (6 values): -1 66 66 65521 65521 65536

trace: step 44  (13,2/l,l dG -> 12,2/l,l dR):
action: duplicate
trace: stack (7 values): -1 -1 66 66 65521 65521 65536

trace: step 45  (12,2/l,l dR -> 11,2/l,l lR):
action: push, value 1
trace: stack (8 values): 1 -1 -1 66 66 65521 65521 65536

trace: step 46  (11,2/l,l lR -> 10,2/l,l lY):
action: add
trace: stack (7 values): 0 -1 66 66 65521 65521 65536

trace: step 47  (10,2/l,l lY -> 9,2/l,l nY):
action: push, value 1
trace: stack (8 values): 1 0 -1 66 66 65521 65521 65536

trace: step 48  (9,2/l,l nY -> 8,1/l,r nB):
action: greater
trace: stack (7 values): 0 -1 66 66 65521 65521 65536

trace: step 49  (8,1/l,r nB -> 7,1/l,r lY):
action: switch
trace: stack (6 values): -1 66 66 65521 65521 65536
trace: stack (6 values): -1 66 66 65521 65521 65536

trace: step 50  (7,1/l,r lY -> 6,1/l,r dY):
action: pop
trace: stack (5 values): 66 66 65521 65521 65536

trace: step 51  (6,1/l,r dY -> 4,1/l,r lY):
action: push, value 3
trace: stack (6 values): 3 66 66 65521 65521 65536

trace: step 52  (4,1/l,r lY -> 3,1/l,r nY):
action: push, value 2
trace: stack (7 values): 2 3 66 66 65521 65521 65536

trace: step 53  (3,1/l,r nY -> 2,1/l,r nM):
action: duplicate
trace: stack (8 values): 2 2 3 66 66 65521 65521 65536

trace: step 54  (2,1/l,r nM -> 1,1/l,r dG):
action: pointer
trace: stack (7 values): 2 3 66 66 65521 65521 65536

trace: step 55  (1,1/r,r dG -> 2,2/r,r lR):
action: roll
trace: stack (5 values): 65521 66 66 65521 65536

trace: step 56  (2,2/r,r lR -> 2,3/d,l nR):
action: push, value 1
trace: stack (6 values): 1 65521 66 66 65521 65536

trace: step 57  (2,3/d,l nR -> 2,4/d,l lC):
action: switch
trace: stack (5 values): 65521 66 66 65521 65536
trace: stack (5 values): 65521 66 66 65521 65536

trace: step 58  (2,4/d,r lC -> 2,5/d,r nM):
action: mod
trace: stack (4 values): 66 66 65521 65536

trace: step 59  (2,5/d,r nM -> 4,5/r,r dM):
action: push, value 3
trace: stack (5 values): 3 66 66 65521 65536

trace: step 60  (4,5/r,r dM -> 6,5/r,r lM):
action: push, value 2
trace: stack (6 values): 2 3 66 66 65521 65536

trace: step 61  (6,5/r,r lM -> 7,5/r,r nC):
action: roll
trace: stack (4 values): 65521 66 66 65536

trace: step 62  (7,5/r,r nC -> 8,5/r,r dM):
action: mod
trace: stack (3 values): 66 66 65536

trace: step 63  (8,5/r,r dM -> 11,5/r,r lM):
action: push, value 3
trace: stack (4 values): 3 66 66 65536

trace: step 64  (11,5/r,r lM -> 12,5/r,r nM):
action: push, value 1
trace: stack (5 values): 1 3 66 66 65536

trace: step 65  (12,5/r,r nM -> 13,5/r,r dC):
action: roll
trace: stack (3 values): 66 65536 66

trace: step 66  (13,5/r,r dC -> 14,5/r,r nB):
action: multiply
trace: stack (2 values): 4325376 66

trace: step 67  (14,5/r,r nB -> 15,5/r,r nM):
action: add
trace: stack (1 values): 4325442

trace: step 68  (15,5/r,r nM -> 16,5/r,r dB):
action: out(number)
4325442
trace: stack is empty
trace: white cell(s) crossed - continuing with no command at 19,5...

trace: step 69  (16,5/r,r dB -> 19,5/r,r nM):

5

C89, 70 বাইট

h,l,m=65521;A(char*B){h=0;l=1;while(*B)h+=l+=*B++;return h%m<<16|l%m;}

পরীক্ষা করার জন্য (সংকলন gcc -std=c89 -lm golf.c):

#include <stdio.h>
int main(int argc, char** argv) {
    printf("%u\n", A("Eagles are great!"));
    printf("%u\n", A("Programming Puzzles & Code Golf"));
    printf("%u\n", A("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"));
    return 0;
}

zlibউত্সটি কি এমন দেখাচ্ছে? এইচ এম ...
বিড়াল

1
এই বাস্তবায়নটি আমার x86 asm সংস্করণটির জন্য একটি দুর্দান্ত সূচনা পয়েন্ট করেছে।
পিটার কর্ডেস

এর forপরিবর্তে 1 বাইট ব্যবহার করে সংরক্ষণ করতে পারেন while:for(h=0,l=1;*B;)h+=l+=*B++;
নিঞ্জালজ

5

ল্যাবরেথ , 37 36 32 31 বাইট

}?"{655:}21:}%=}){%{{36*+!
:++)

এটি অনলাইন চেষ্টা করুন!

পূর্ণসংখ্যার একটি তালিকা হিসাবে ইনপুট। প্রোগ্রামটি একটি ত্রুটির সাথে শেষ হয় (যার ত্রুটির বার্তাটি STDERR এ যায়)।

ব্যাখ্যা

ভিজিটর প্রাইমার:

  • ল্যাবরেথে দুটি নির্বিচার-নির্ভুলতা পূর্ণসংখ্যার প্রধান , প্রধান এবং অক্স (আইলিয়ারি) থাকে, যা প্রাথমিকভাবে একটি (অন্তর্নিহিত) অসীম পরিমাণ জিরো দিয়ে পূর্ণ হয়।
  • উত্স কোডটি একটি গোলকধাঁধার অনুরূপ, যেখানে নির্দেশিকা পয়েন্টার (আইপি) করিডোরগুলি অনুসরণ করে যখন এটি করতে পারে (এমনকি কোনও কোণেও)। কোডটি পাঠের ক্রমে প্রথম বৈধ অক্ষর থেকে শুরু হয়, এই ক্ষেত্রে শীর্ষ বাম কোণে। আইপি যখন কোনও ফর্মের সংযোগে আসে (অর্থাত্ এটি থেকে আসা কয়েকটি সংলগ্ন ঘর), এটি মূল স্ট্যাকের শীর্ষের ভিত্তিতে একটি দিক বাছাই করবে। প্রাথমিক নিয়মগুলি হ'ল: নেতিবাচক হলে বাম দিকে ঘুরুন, শূন্যের দিকে এগিয়ে যেতে থাকুন, ইতিবাচক হলে ডানদিকে ঘুরুন। এবং যখন এর মধ্যে কোনওটি সম্ভব না হওয়ায় একটি প্রাচীর রয়েছে, তখন আইপি বিপরীত দিকটি গ্রহণ করবে। মৃত প্রান্তগুলিতে আঘাত করার সময় আইপিও ঘুরিয়ে দেয়।
  • অঙ্কগুলি প্রধান স্ট্যাকের শীর্ষটি 10 ​​দ্বারা গুণিত করে এবং পরে অঙ্কটি যুক্ত করে প্রক্রিয়া করা হয়। একটি নতুন নম্বর শুরু করতে, আপনি একটি শূন্য দিয়ে ধাক্কা দিতে পারেন _

যদিও কোডটি 4x2 "কক্ষ" দিয়ে শুরু হয়, এটি আসলে দুটি পৃথক দুটি বাই লুপ একসাথে চেপে যায়। আইপি স্ট্যাক মানগুলির কারণে একবারে একটি লুপের সাথে লেগে যায়।

সুতরাং কোডটি 2x2 (ঘড়ির কাঁটার) লুপ দিয়ে শুরু হয় যা উপসর্গের অঙ্কগুলি গণনা করার সময় ইনপুট পড়ে:

}   Move last prefix sum over to aux.
?   Read an integer from STDIN or push 0 on EOF, which exits the loop.
+   Add current value to prefix sum.
:   Duplicate this prefix sum.

এখন আমরা সব উপসর্গ অঙ্কের পেয়েছেন -aux- স্ট্যাক, সেইসাথে সব মান উপর সমষ্টি একটি কপি এবং 0উপর ফাইলের শেষে থেকে প্রধান । এটির সাথে আমরা আরও একটি 2x2 (ঘড়ির কাঁটা) লুপ প্রবেশ করি যা গণনা করার জন্য সমস্ত উপসর্গের যোগফল HIGH

"   No-op. Does nothing.
{   Pull one prefix sum over from aux. When we're done, this fetches a 0,
    which exits the loop.
)   Increment prefix sum.
+   Add it to HIGH.

প্রধান স্ট্যাকের এখন LOW - 1এবং HIGHছাড়া আমরা মডিউল এখনো নিয়েছি এবং শূন্য। কোডের বাকী অংশগুলি সম্পূর্ণ রৈখিক:

655      Turn the zero into 655.
:}       Make a copy and shift it over to aux.
21       Turn the copy on main into 65521.
:}       Make a copy and shift it over to aux.
%        Take HIGH mod 65521.
=        Swap HIGH with the other copy of 65521 on aux.
}){      Move 65521 back to aux, increment LOW-1 to LOW, 
         move 65521 back to main.
%        Take LOW mod 65521.
{        Move HIGH back to main.
{        Move the other copy of 655 back to main.
36       Turn it into 65536.
*        Multiply HIGH by that.
+        Add it to LOW.
!        Print it.

আইপি এখন একটি শেষ প্রান্তে আঘাত করে এবং ঘুরে ফিরে। +এবং *মূলত স্ট্যাকের নীচে শূন্য কারণে নো অপস করে। 36এখন উপরের সক্রিয় প্রধান মধ্যে 63, কিন্তু দুই {{টান থেকে দুই শূন্য -aux- এটি উপরে। তারপরে %শূন্য দ্বারা ভাগ করার চেষ্টা করে যা প্রোগ্রামটি শেষ করে।

নোট করুন যে ল্যাবরেথ নির্বিচারে-নির্ভুলতার পূর্ণসংখ্যার ব্যবহার করে এতক্ষণে মডুলোর পিছনে ফেলে সমাপ্তির অবধি পূর্ণসংখ্যার ওভারফ্লোতে সমস্যা তৈরি করে না।


5

পাইথন 2, 60 58 বাইট

H=h=65521
l=1
for n in input():l+=n;h+=l
print h%H<<16|l%H

একটি দুর্দান্ত সোজা পদ্ধতি। এটি একটি সম্পূর্ণ প্রোগ্রাম যা STDIN এর মাধ্যমে পূর্ণসংখ্যার একটি তালিকা গ্রহণ করে [72, 105, 33]

(আশ্চর্যজনক এলিয়াসিং / ইনিশিয়ালাইজেশন টিপের জন্য @ এক্সনরকে ধন্যবাদ)


2
65521 এ্যালিয়াস H=h=65521করার hসময় আপনি আরম্ভ করতে পারেন
xnor

4

জে, 30 বাইট

+/(+65536&*)&(65521|+/)&:>:+/\

এটি সম্ভবত একটি ভিন্ন ট্রেন দিয়ে আরও ঘনীভূত হতে পারে।

ব্যবহার

এখানে অনুলিপি x $ yসহ একটি তালিকা তৈরি করে ।xy

   f =: +/(+65536&*)&(65521|+/)&:>:+/\
   f 69 97 103 108 101 115 32 97 114 101 32 103 114 101 97 116 33
918816254
   f 80 114 111 103 114 97 109 109 105 110 103 32 80 117 122 122 108 101 115 32 38 32 67 111 100 101 32 71 111 108 102
3133147946
   f (32 $ 126)
68095937
   f (1040 $ 63)
2181038080
   f (4096 $ 255)
2170679522

ব্যাখ্যা

+/(+65536&*)&(65521|+/)&:>:+/\
f (           g           ) h     Monad train (f g h) y = (f y) g (h y)
+/                                Sum the input list
                           +/\    Sum each prefix of the input, forms a list
x     f   &   g   &:   h    y     Composed verbs, makes (g (h x)) f (g (h y))
                         >:       Increment the sum and increment each prefix sum
               (m f g) y          Hook, makes m f (g y)
                    +/            Sum the prefix sums
              65521|              Take the sum and prefix total mod 65521
    (f g) y                       Hook again
    65536&*                       Multiply the prefix total by 65536
                                  This is a bonded verb, it will only multiply
                                  using a fixed value now
   +                              Add the sum and scaled prefix total

4

অক্টাভা, 52 50 বাইট

@ লুইস মেন্ডোকে ধন্যবাদ 2 বাইট সংরক্ষণ করা হয়েছে

@(B)mod([sum(S=cumsum(B)+1),S(end)],65521)*[4^8;1]

ইনপুট হিসাবে পূর্ণসংখ্যার অ্যারে নেয়।

কম এর শেষ উপাদান থেকে নেওয়া হয় উচ্চ বদলে স্পষ্টভাবে সমষ্টি গণক, এর ... একটি সর্বোমোট সংরক্ষণ (summing আগে) 1 বাইট !

আদর্শের উপর নমুনা রান করুন ।


@LuisMendo কীসব আমি ভুলে গেছি +B। আমার অনুমান ইনপুট স্পিক বলে যে আপনি পূর্ণসংখ্যা নিতে পারেন, তাই সম্ভবত আমি এটি করব।
বেকার

3

সিজেম, 30 29 বাইট

q~{1$+}*]:)_W>]1fb65521f%2G#b

পূর্ণসংখ্যার একটি তালিকা হিসাবে ইনপুট।

এটি এখানে পরীক্ষা করুন।

ব্যাখ্যা

q~       e# Read and evaluate input.
{        e# Fold this block over the list, computing prefix sums.
  1$+    e#   Copy the last prefix and add the current element.
}*
]        e# Wrap the prefix sums in an array.
:)       e# Increment each. This will sum to HIGH.
_W>      e# Copy the list and truncate to only the last element, i.e.
         e# the sum of the entire input plus 1. This is LOW.
]        e# Wrap both of those lists in an array.
1fb      e# Sum each, by treating it as base 1 digits.
65521f%  e# Take each modulo 65521.
2G#b     e# Treat the list as base 65536 digits, computing 65536*HIGH + LOW.

3

পার্ল 6 , 60 বাইট

{(.sum+1)%65521+65536*((sum(1,*+.shift...->{!$_})-1)%65521)}

ব্যাখ্যা:

{
  # $_ is the implicit parameter for this lambda because this block doesn't have
  # an explicit parameter, and @_ isn't seen inside of it.
  # ( @_ takes precedence over $_ when it is seen by the compiler )

  # .sum is short for $_.sum
  ( .sum + 1 ) % 65521 + 65536
  *
  (
    (
      sum(

        # generate a sequence:

        1,         # starting with 1
        * + .shift # lambda that adds previous result (*) with $_.shift
        ...        # generate until:
        -> { !$_ } # $_ is empty

        # ^ I used a pointy block with zero parameters
        # so that the block doesn't have an implicit parameter
        # like the surrounding block

        # this is so that $_ refers to the outer $_

      ) - 1        # remove starting value
    ) % 65521
  )
}

টেস্ট:

#! /usr/bin/env perl6
use v6.c;
use Test;

# give the lambda a name
my &Adler32 = {(.sum+1)%65521+65536*((sum(1,*+.shift...->{!$_})-1)%65521)}

my @tests = (
  (  918816254,  'Eagles are great!'),
  ( 3133147946,  'Programming Puzzles & Code Golf'),
  (   68095937,  '~' x 32,     "'~' x 32"),
  ( 2181038080,  63 xx 1040,   "'?' x 1040"),
);

plan +@tests;

for @tests -> ($checksum, $input, $gist? ) {
  my @array := do given $input {
    when Str { .encode.Array }
    default { .Array }
  }

  is Adler32(@array), $checksum, $gist // $input.perl
}
1..4
ok 1 - "Eagles are great!"
ok 2 - "Programming Puzzles \& Code Golf"
ok 3 - '~' x 32
ok 4 - '?' x 1040

3

পাইথন 3 (79 বাইট)

আর কাপের সমাধানের ভিত্তিতে।

lambda w,E=65521:(1+sum(w))%E+(sum(1+sum(w[:i+1])for i in range(len(w)))%E<<16)

আমি গুণটিকে একটি শিফ্ট দ্বারা প্রতিস্থাপন করেছি এবং বন্ধনীগুলির এক জোড়া সরিয়েছি।

কারণ আমি মন্তব্য পোস্ট করতে পারি না আমি একটি নতুন উত্তর দিয়েছি।



3

হাস্কেল, 54 50 বাইট

m=(`mod`65521).sum
g x=m(-1:scanl(+)1x)*4^8+m(1:x)

ব্যবহারের উদাহরণ: g [69,97,103,108,101,115,32,97,114,101,32,103,114,101,97,116,33]-> 918816254

scanlতালিকায় (-> 1) প্রারম্ভিক মান (-> ) অন্তর্ভুক্ত করে [1,1+b1,1+b1+b2,..], সুতরাং এটি sumবন্ধ হয় 1, যা সংক্ষিপ্ত -1হওয়ার আগে তালিকার প্রিপেন্ডিং দিয়ে স্থির করা হয় ।

সম্পাদনা করুন: 4x বাইটের জন্য @xnor ধন্যবাদ


দেখে মনে হচ্ছে আপনি মধ্যে সামিং আউট নিষ্কাশন করতে পারেন m: m=(`mod`65521).sum g x=m(-1:scanl(+)1x)*4^8+m(1:x)। প্রিমেন্টিংয়ের চেয়ে অঙ্কগুলি ঠিক করার আরও ভাল উপায় সম্ভবত রয়েছে।
xnor

3

জাভাস্ক্রিপ্ট (ES7), 52 50 বাইট

a=>a.map(b=>h+=l+=b,h=0,l=1)&&l%65521+h%65521*4**8

ইএস 6 টি 51 বাইট নেয় (65 * 36 দিয়ে 4 ** 8 প্রতিস্থাপন করুন)। আপনি যদি স্ট্রিং সংস্করণ চান তবে 69 বাইটের জন্য:

s=>[...s].map(c=>h+=l+=c.charCodeAt(),h=0,l=1)&&l%65521+h%65521*65536

সম্পাদনা করুন: @ ব্যবহারকারী81655 ধন্যবাদ 2 বাইট সংরক্ষণ করা।


3

এআরএম থাম্ব -2 ফাংশন গ্রহণ uint8_t[]: 40 বাইট (মানহীন এবিআইয়ের জন্য 36 বি এবং int[])

বৈশিষ্ট্য: মুলতুবিহীন মডুলো, তাই স্বেচ্ছাকৃতির আকারের ইনপুটগুলি ভাল are আসলে বিভাগ নির্দেশ ব্যবহার করে না, সুতরাং এটি ধীর হয় না। (ভুল, কমপক্ষে সে কারণে নয়: পি)

কম কঠোর নিয়ম অনুসরণ করা থেকে সঞ্চয়:

  • -2 বি যদি আমাদের সেগুলি ব্যবহারের আগে সংরক্ষণ করতে না হয়।
  • কলারকে একটি uint32_t[]অ্যারেতে বাইট আনপ্যাক করার জন্য -2 বি B

সুতরাং, সেরা ক্ষেত্রে 36B হয়।

// uint8_t *buf in r0,  uint32_t len in r1
00000000 <adler32arm_golf2>:
   0:   b570            push    {r4, r5, r6, lr} //
   2:   2201            movs    r2, #1          // low
   4:   2300            movs    r3, #0          // high
   6:   f64f 75f1       movw    r5, #65521      ; 0xfff1 = m
0000000a <adler32arm_golf2.byteloop>:
   a:   f810 4b01       ldrb.w  r4, [r0], #1    // post-increment byte-load
   e:   4422            add     r2, r4          // low += *B
  10:   4413            add     r3, r2          // high += low
  12:   42aa            cmp     r2, r5          // subtract if needed instead of deferred modulo
  14:   bf28            it      cs
  16:   1b52            subcs   r2, r2, r5
  18:   42ab            cmp     r3, r5
  1a:   bf28            it      cs              // Predication in thumb mode is still possible, but takes a separate instruction
  1c:   1b5b            subcs   r3, r3, r5
  1e:   3901            subs    r1, #1          // while(--len)
  20:   d1f3            bne.n   a <.byteloop2>
  22:   eac2 4003       pkhbt   r0, r2, r3, lsl #16   // other options are the same size: ORR or ADD.
  26:   bd70            pop     {r4, r5, r6, pc}  // ARM can return by popping the return address (from lr) into the pc; nifty
00000028 <adler32arm_end_golf2>:

0x28 = 40 বাইট


নোট:

log%mশেষের পরিবর্তে , আমরা if(low>=m) low-=mলুপের ভিতরে করি। যদি আমরা উচ্চের আগে কম কাজ করি তবে আমরা জানি যে 2*mদুটিই সম্ভবত সম্ভাব্য ছাড়িয়ে যেতে পারে না , তাই মডুলো কেবল বিয়োগ বা না করার বিষয়। একজন cmpএবং predicated subThumb2 মোডে শুধুমাত্র 6b হয়। থাম্ব 2 মোডের জন্য আদর্শ আইডিয়মটি% 8 বি:

UDIV R2, R0, R1         // R2 <- R0 / R1
MLS  R0, R1, R2, R0     // R0 <- R0 - (R1 * R2 )

অন্তর্নির্মিত দৈর্ঘ্যের adler(char *)সংস্করণটি সুস্পষ্ট দৈর্ঘ্যের মতোই কোড-আকার adler(uint8_t[], uint32_t len)। আমরা একক 2B নির্দেশ দিয়ে লুপ-প্রস্থান শর্তের জন্য পতাকা সেট করতে পারি।

অন্তর্নির্মিত দৈর্ঘ্যের সংস্করণটিতে 2 ^ 32 বার লুপ করার চেষ্টা করার পরিবর্তে খালি স্ট্রিংয়ের সাথে সঠিকভাবে কাজ করার সুবিধা রয়েছে।


সাথে একত্রিত / সংকলন:

arm-linux-gnueabi-as --gen-debug -mimplicit-it=always -mfloat-abi=soft -mthumb adler32-arm.S

অথবা

arm-linux-gnueabi-g++ -Wa,-mimplicit-it=always -g -static -std=gnu++14 -Wall -Wextra -Os -march=armv6t2 -mthumb -mfloat-abi=soft test-adler32.cpp -fverbose-asm adler32-arm.S -o test-adler32
qemu-arm ./test-adler32

ছাড়া -static, অধীনে চলমান প্রক্রিয়াটি qemu-armগতিশীল লিঙ্কারটি খুঁজে পায়নি। (আর হ্যাঁ, আমি একটি এআরএম ক্রস-devel সেটআপ শুধু এই উত্তরের জন্য ইনস্টল করুন, কারণ আমি ভেবেছিলাম আমার predicated-বিয়োগ ধারণা ঝরঝরে ছিল।) উপর AMD64 উবুন্টু ইনস্টল gcc-arm-linux-gnueabi, g++-arm-linux-gnueabi। আমি এর gdb-arm-none-eabiসাথে সংযোগ করার জন্য সবেমাত্র কাজ করেছি qemu-arm -g port

মন্তব্য করা উত্স:

// There's no directive to enable implicit-it=always

// gcc uses compiler uses these in its output
.syntax unified
.arch armv8-a
.fpu softvfp

.thumb      @ aka .code 16

.p2align 4
.globl adler32arm_golf    @ put this label on the one we want to test

.thumb_func
adler32arm_golf:
adler32arm_golf2:   @ (uint8_t buf[], uint32_t len)
        @ r0 = buf
        @ r1 = len
        push    {r4, r5, r6, lr}   @ even number of regs keeps the stack aligned.  Good style? since there's no code-size saving

        movs    r2, #1          @ r2: low
        movs    r3, #0          @ r3: high
                                @ r4 = tmp for loading bytes
        movw    r5, #65521      @ r5: modulo constant

adler32arm_golf2.byteloop2:
        ldrb    r4, [r0], #1    @ *(buf++) post-increment addressing.  4B encoding
        @ldrb    r4, [r0, r1]   @ 2B encoding, but unless we make the caller pass us buf+len and -len, it needs extra code somewhere else
        @ldmia   r0!, {r4}      @ int[] version:  r4 = [r0]; r0+=4;  post-increment addressing.  2B encoding.

        add     r2, r2, r4      @ low += tmp
        add     r3, r3, r2      @ high += low;   // I think it's safe to do this before the modulo range-reduction for low, but it would certainly work to put it after.

        cmp     r2, r5
        subhs   r2, r5          @ if(low>=m) low-=m;   @ 6B total for %.  predicated insns require an IT instruction in thumb2

        cmp     r3, r5
        subhs   r3, r5          @ if(high>=m) high-=m;  // equivalent to high %= m.

        @sub    r1, #1          @ 4B encoding: sub.w to not set flags with immediate
        subs    r1, #1          @ len-- and set flags.  2B encoding
        @cmp    r4, #0          @ null-termination check. 2B encoding
        bne     adler32arm_golf2.byteloop2

@        udiv    r0, r2, r5            @ normal way to do one of the modulos
@        mls     r2, r5, r0, r2         @ r2 = low % m.  8B total for %

        PKHBT   r0, r2, r3, lsl #16     @ 4B   r0 = [ high%m <<16  |   low%m  ]
        @orr     r0, r0, r4, lsl #16    @ 4B
        @orr     r0, r0, r4             @ 4B
        @add     r0, r2, r3, lsl #16    @ 4B
        @add     r0, r0, r4             @ 2B
        pop     {r4, r5, r6, pc}        @ ARM can return by popping the return address (saved from lr) into pc.  Nifty
adler32arm_end_golf2:

test-adler32.cppmain()আমার টেস্ট- কেসগুলির একই পরীক্ষাগুলি রয়েছে এবং আমার x86-64 উত্তর হিসাবে, তবে এইভাবে শুরু করুন:

#include <stdint.h>
uint32_t adler32_simple(const uint8_t *B) {
  const uint32_t m=65521;

  uint32_t h=0, l=1;
  do {
    l += *B++;        // Borrowed from orlp's answer, as a simple reference implementation
    h += l;
    l %= m; h %= m;   // with non-deferred modulo if this is uncommented
  } while(*B);

  return h%m<<16|l%m;
}


#include <stdio.h>
//#include <zlib.h>
#include <string.h>
#include <assert.h>
#include <string>   // useful for the memset-style constructors that repeat a character n times


extern "C" {
    unsigned golfed_adler32_amd64(int /*dummy1*/, const char *buf, int /*dummy2*/, unsigned len);
    unsigned adler32arm_golf(const char *buf, unsigned len);
}
#ifdef __amd64__
#define golfed_adler32(buf, len)   golfed_adler32_amd64(1234, buf, 1234, len)
#elif  __arm__
#define golfed_adler32(buf, len)   adler32arm_golf(buf, len)
#else
#error "no architecture"
#endif

static void test_adler(const char *str)
{
    unsigned len = strlen(str);
//    unsigned zlib = zlib_adler(len, str);
    unsigned reference = adler32_simple((const uint8_t*)str);
    unsigned golfed = golfed_adler32(str, len);

    printf("%s: c:%u asm:%u\n", str, reference, golfed);
    assert(reference == golfed);
}

// main() to call test_adler() unchanged from my amd64 answer, except that the comments about length limits don't apply

3

x86 16 বিট মেশিন কোড ফাংশন: কাস্টম কলিং কনভেনশন ব্যবহার করে 32 বাইট

নিবন্ধগুলিতে আর্টস, এবং বিপি (এবং এসপি) ব্যতীত অন্য কোনও রেগ সংরক্ষণ না করে।

16 বিট কোডে, আমরা dx:axরেজিস্টার জোড়ায় 32 বিট মানটি ফিরিয়ে দেব । এর অর্থ হল আমরা মার্জ কোনো নির্দেশাবলী ব্যয় করতে হবে না highএবং lowমধ্যে eax। (এটি 32 এবং bit৪ বিট কোডেও বাইটস সংরক্ষণ করতে পারে, তবে আমরা কেবল 16 বিট কোডে কলারের কাছে এই কাজটি অফলোডিংকে ন্যায়সঙ্গত করতে পারি))

মন্তব্য করা উত্স এবং গিথুবে পরীক্ষক ড্রাইভার (x86 16, 32, এবং 64 বিট এবং এআরএম এর জন্য)।

### const char *buf in SI,  uint16_t len in CX
## returns in dx:ax
## also clobbers bx and di.
00000100 <adler32_x16_v6>:
 100:   31 c0                   xor    ax,ax         # set up for lods
 102:   99                      cwd                  # dx= high=0
 103:   bf 01 00                mov    di,0x1        # di= low=0
 106:   bb f1 ff                mov    bx,0xfff1     # bx= m
00000109 <adler32_x16_v6.byteloop>:
 109:   ac                      lods
 10a:   01 c7                   add    di,ax         # low+=buf[i]. modulo-reduce on carry, or on low>=m
 10c:   72 04                   jc     112 <adler32_x16_v6.carry_low>
 10e:   39 df                   cmp    di,bx
 110:   72 02                   jb     114 <adler32_x16_v6.low_mod_m_done>
00000112 <adler32_x16_v6.carry_low>:
 112:   29 df                   sub    di,bx
00000114 <adler32_x16_v6.low_mod_m_done>:
 114:   01 fa                   add    dx,di         # high+=low
 116:   0f 92 d0                setb   al            # store the carry to set up a 32bit dividend.
 119:   92                      xchg   dx,ax
 11a:   f7 f3                   div    bx            # high (including carry) %= m, in dx.  ax=0 or 1 (so we're set for lods next iteration)                                                         
 11c:   e2 eb                   loop   109 <adler32_x16_v6.byteloop>
 11e:   97                      xchg   di,ax         # 
 11f:   c3                      ret    
00000120 <adler32_x16_v6_end>:

0x120 - 0x100 = 32 বাইট

32 বিট মোডের জন্য একই কোডটি একত্রিত করে পরীক্ষিত, যাতে আমি সি থেকে এটি সংযুক্ত (একটি মোড়ক ফাংশন সহ) কল করতে পারি -m32। আমার জন্য, 16 বিট মোড কিছুটা আকর্ষণীয়, ডস সিস্টেম কলগুলি নেই। সমস্ত নির্দেশাবলীতে সুস্পষ্ট অপারেশন রয়েছে loopএবং ব্যতীত lodsb, 32 বিট মোডের জন্য একত্রিত হয়ে অপারেন্ড-আকারের উপসর্গগুলি ব্যবহার করে। একই নির্দেশনা, বিভিন্ন এনকোডিং। তবে lodsb32 বিট মোডে ব্যবহার করবে [esi], সুতরাং পরীক্ষার জন্য এই সংস্করণটি 32 বিট পয়েন্টারগুলির সাথে কাজ করে (কারণ আমরা কোনও ঠিকানা-গণিত বা পয়েন্টার বৃদ্ধি / তুলনা করি না)।

কোনও মিল নেই। আমার পরীক্ষার জোতা কোনও মিল নেই তবে কোনও বার্তা প্রিন্ট করে।

$ yasm -felf32 -Worphan-labels -gdwarf2 adler32-x86-16.asm -o adler32-x86-16+32.o &&
   g++ -DTEST_16BIT -m32 -std=gnu++11 -O1 -g -Wall -Wextra -o test-adler32-x16  adler32-x86-16+32.o  test-adler32.cpp -lz &&
   ./test-adler32-x16
Eagles are great! (len=17): zlib:0x36c405fe  c:0x36c405fe golfed:0x36c405fe
Programming Puzzles & Code Golf (len=31): zlib:0xbac00b2a  c:0xbac00b2a golfed:0xbac00b2a
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (len=32): zlib:0x040f0fc1  c:0x040f0fc1 golfed:0x040f0fc1
?????????????????????????????????????????????????? (len=1040): zlib:0x82000000  c:0x82000000 golfed:0x82000000
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (len=4096): zlib:0xb169e06a  c:0xb169e06a golfed:0xb169e06a
(0xFF repeating) (len=4096): zlib:0x8161f0e2  c:0x8161f0e2 golfed:0x8161f0e2
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (len=5837): zlib:0x5d2a398c  c:0x5d2a398c golfed:0x5d2a398c
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (len=5838): zlib:0x97343a0a  c:0x97343a0a golfed:0x97343a0a
(0xFF repeating) (len=9999): zlib:0xcae9ea2c  c:0xcae9ea2c golfed:0xcae9ea2c
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (len=65535): zlib:0x33bc06e5  c:0x33bc06e5 golfed:0x33bc06e5

১bit বিট রেজিস্ট্রার সহ, আমরা লুপ না হওয়া পর্যন্ত মডুলো হ্রাস স্থগিত করতে পারি না। 16 বিট এবং অন্যান্য অপারেন্ড-আকারের মধ্যে একটি আকর্ষণীয় পার্থক্য রয়েছে: m = 65521( 0xFFF1) অর্ধেক 65536 এর বেশি carry mবহন করে বিয়োগ করা মান 2 * মিটার নীচে রাখে, এমনকি যদি high=0xFFF0 + 0xFFF0। লুপের পরে, একটি তুলনা-এবং-বিয়োগটি কৌতুকটি করবে, পরিবর্তে একটি div

আমি ক্যারি উত্পাদন করতে পারে এমন একটি অ্যাডের পরে মডেলো-হ্রাস করার জন্য একটি অভিনব কৌশল নিয়ে এসেছি । এর জন্য ইনপুটটির উপরের অর্ধেকটি শূন্য করার পরিবর্তে, অন-কাটা কাটা অ্যাড ফলাফল ( ইতিমধ্যে শূন্য) হোল্ড করে একটি 32 বিবিট লভ্যাংশ তৈরি করতে divব্যবহার setc dlকরুন dh। ( div32 বি / 16 বি => 16 বিট বিভাজন করে))

setcc(3 বাইট), 386. সঙ্গে চালু করা হয় 286 বা তার আগে এই চালানোর জন্য শ্রেষ্ঠ আমি ব্যবহারসমূহ সঙ্গে আসা পর্যন্ত করেছি অনথিভুক্ত salcনির্দেশ (বহন থেকে সেট আওয়ামী লীগের) । এটি এর জন্য ওয়ান-বাইট অপকোড sbb al,al, তাই আমরা এটি করার আগে salc/ ব্যবহার করতে পারতাম (যা আমাদের যেভাবেই প্রয়োজন)। ছাড়া , একটি 4 বি সিকোয়েন্স রয়েছে: / । আমরা 3 বি / ব্যবহার করতে পারি না , কারণ এটির পরিবর্তে অনুকরণ করতে পারে ।neg alxchg ax, dxsalcsbb dx,dxneg dxsbb dx,dxinc dxsetncsetc


আমি ক্যারি পরিচালনা করার পরিবর্তে 32 বিট অপারেন্ড-আকারটি ব্যবহার করার চেষ্টা করেছি , তবে এটি কেবলমাত্র addনির্দেশাবলীর অপারেন্ড-আকারের উপসর্গের প্রয়োজন নয়। কনস্ট্যান্টগুলি সেট আপ করার জন্য নির্দেশাবলী এবং এছাড়াও অপারেন্ড-আকারের উপসর্গগুলি প্রয়োজন, তাই এটি সর্বকনিষ্ঠ না হয়ে শেষ হয়েছিল।



2

পার্ল 5, 43 বাইট

42 বাইট, প্লাস 1 এর -aEপরিবর্তে-e

ইনপুট দশমিক পূর্ণসংখ্যা হিসাবে, স্থান দ্বারা পৃথক।

map$h+=$.+=$_,@F;say$.%65521+$h%65521*4**8

আমার টুপি Sp3000 এ একটি টিপ , যার কাছ থেকে আমি এই উত্তরের জন্য ধারণা নিয়েছি।

কিভাবে এটা কাজ করে:

  1. এর কারণে -a, $. 1 থেকে শুরু হয় এবং @Fইনপুট অ্যারে হয়। $h0 থেকে শুরু হয় অ্যারের প্রতিটি উপাদানগুলির জন্য স্থানধারক হিসাবে $_ব্যবহৃত হয় map
  2. map$h+=$.+=$_,@Fমানে প্রতিটি উপাদানের জন্য যে @Fআমরা যে উপাদান যোগ $.এবং তারপর যোগ $.করার $h
  3. তারপরে আমরা মডিউলার গাণিতিক করি $.%65521+$h%65521*4**8(এটি, ($. % 65521) + ( ($h % 65521) * (4**8) )এবং say(মুদ্রণ) ফলাফল।

1

ফ্যাক্টর, 112 109 103 বাইট

এখন , এই প্রশ্নের অ্যালগরিদমের একটি আক্ষরিক অনুবাদ ... এখন যে আমি আসলে এটি তৈরি করেছি, জানলাম, সঠিক।

[ [ sum 1 + ] [ [ dup length [1,b] reverse v. ] [ length ] bi + ] bi [ 65521 mod ] bi@ 16 shift bitor ]

Ungolfed:

: adler-32 ( seq -- n )
  [ sum 1 + ] 
  [ 
    [ dup length [1,b] reverse v. ] 
    [ length ] bi + 
  ] bi 
  [ 65521 mod ] bi@ 
  16 shift bitor 
  ;

সংখ্যার কোনও ক্রম বা একটি স্ট্রিং (খুব বেশি পার্থক্য নয়, যদিও তারা প্রযুক্তিগতভাবে একই নয়) আশা করে।

আমি জানি না যে এটি 32-বিট শব্দ-আকারের সাথে সংকলিত ফ্যাক্টরের একটি সংস্করণে প্রদত্ত সীমাটির জন্য কীভাবে সম্পাদন করবে, তবে আমার 6 জিবি 64-বিট 2.2GHz মেশিনে:

IN: scratchpad 1040 63 <array>

--- Data stack:
{ 63 63 63 63 63 63 63 63 63 63 63 63 63 63 ~1026 more~ }
IN: scratchpad [ adler-32 ] time
Running time: 7.326900000000001e-05 seconds

--- Data stack:
2181038080
IN: scratchpad 10,000 63 <array> 

--- Data stack:
2181038080
{ 63 63 63 63 63 63 63 63 63 63 63 63 63 63 ~9986 more~ }
IN: scratchpad [ adler-32 ] time
Running time: 0.000531669 seconds


1

ক্লোজার, 109 বাইট

@ মার্ক অ্যাডলারের সমাধানের ভিত্তিতে ।

(fn f[s](->> s(reduce #(mapv + %(repeat %2)[0(first %)])[1 0])(map #(rem % 65521))(map *[1 65536])(apply +)))

Ungolfed

(fn f [s]
  (->> s
       (reduce #(mapv + % (repeat %2) [0 (first %)]) [1 0])
       (map #(rem % 65521))
       (map * [1 65536])
       (apply +)))

ব্যবহার

=> (def f (fn f[s](->> s(reduce #(mapv + %(repeat %2)[0(first %)])[1 0])(map #(rem % 65521))(map *[1 65536])(apply +))))
=> (f [69 97 103 108 101 115 32 97 114 101 32 103 114 101 97 116 33])
918816254
=> (f [80 114 111 103 114 97 109 109 105 110 103 32 80 117 122 122 108 101 115 32 38 32 67 111 100 101 32 71 111 108 102])
3133147946
=> (f (repeat 32 126))
68095937
=> (f (repeat 1040 63))
2181038080
=> (f (repeat 4096 255))
2170679522

1

জাভাস্ক্রিপ্ট (১৩০ টি চরিত্র গল্ফ করা)

Ungolfed

function a(b)
{
    c=1
    for(i=0;i<b.length;i++)
    {
        c+=b[i]
    }
    d=c%65521
    f=""
    e=0
    k=""
    for(j=0;j<b.length;j++)
    {
        k+= "+"+b[j]
        f+= "(1"+k+")"
        e= ((eval(f)))
        if(j!=b.length-1){f+="+"}
    }
    g=e%65521
    h=d+65536*g
    console.log(h)
}

Golfed

a=b=>{for(c=1,k=f="",y=b.length,i=0;i<y;i++)c+=x=b[i],f+="(1"+(k+="+"+x)+")",i<y-1&&(f+="+");return z=65521,c%z+65536*(eval(f)%z)}

বিকাশকারী কনসোলে আটকান এবং তারপরে এটিকে বাইটস ইজি এর একটি অ্যারে দিন:

[69, 97, 103, 108, 101, 115, 32, 97, 114, 101, 32, 103, 114, 101, 97, 116, 33]

এবং এটি কনসোলে চেকসামটি ফিরিয়ে দেবে


1

টিএমপি, 55 বাইট

3a1.3b0.1;4+a>T8%a>xFFF14+b>a8%b>xFFF11~5<b>164|b>a2$b$

লুয়া বাস্তবায়ন এখানে পাওয়া যাবে: http://preview.ccode.gq/projects/TMP.lua


1
প্রোগ্রামিং ধাঁধা এবং কোড গল্ফ স্বাগতম! এই ভাষা কি প্রোগ্রামিং ভাষার আমাদের সংজ্ঞাটি পূরণ করে ?
বিড়াল

@ ক্যাট আমি বিশ্বাস করি এটি এটি করে তবে আমি নিশ্চিত নই যে এটি "টিপলস" কে সত্যিই সমর্থন করে?
brianush1

উভয়ই ব্রেইনফাক করে না, তাই আপনি সম্ভবত ঠিক আছেন। যদি এটি টিউরিং সম্পূর্ণ হয়, মূল সংখ্যাগুলি সন্ধান করতে পারে এবং অন্য যে কোনও ভাষা করতে পারে এমন মৌলিক কাজগুলি করতে পারে (এবং এটি করতে পারে), এটি কাজ করবে :) সিএসএস নিজস্ব কোনও প্রোগ্রামিং ভাষা নয় এবং HTML নয় CSS3 + HTML নয় টিউরিং-সম্পূর্ণ এবং প্রাইমগুলি খুঁজে পেতে পারে।
বিড়াল

সুতরাং, কোডগল্ফ ব্যবহার করা ঠিক আছে?
brianush1

আমিও তাই মনে করি - আমি টিএমপি বা লুয়া উভয়ই জানি না, সুতরাং এই কোডটির ব্যাখ্যা একটি বড় সহায়ক হবে (এবং এটি একটি দুর্দান্ত উত্তর দেবে)। : ডি
বিড়াল

1

পাইথন 3.5, 82 বাইট:

( -1 বাইট নীলকে ধন্যবাদ ! )

( -১ বাইট ধন্যবাদ ম্যাথম্যান্ডনে ! )

( -4 বাইটস ডেনিসকে ধন্যবাদ ! )

lambda w:((1+sum(w))%65521)+4**8*(sum(1+sum(w[:i+1])for i in range(len(w)))%65521)

একটি বেনামী lambdaফাংশন। বাইট অ্যারে গ্রহণ করে, অ্যারের সাথে পুরো অ্যালগোরিদম প্রয়োগ করে এবং ফলাফলটি আউটপুট করে। সমস্ত পরীক্ষার ক্ষেত্রে সাফল্যের সাথে কাজ করেছে। আপনি এটিকে একটি ভেরিয়েবল বরাদ্দ করে কল করেছেন এবং তারপরে সেই পরিবর্তনশীলটিকে কল করে যেমন আপনি একটি সাধারণ ফাংশন কল করবেন। আপনি যদি শেলটি ব্যবহার করে থাকেন, তবে এটি মুদ্রণ ফাংশন ছাড়াই আউটপুট করা উচিত। তবে আপনি যদি না থাকেন তবে অবশ্যই print()আউটপুটটি দেখতে আপনাকে অবশ্যই ফাংশনটিতে ফাংশন কলটি আবদ্ধ করতে হবে ।

এটি অনলাইন চেষ্টা করুন! (Ideone)


(E+15)আসলে এর চেয়ে লম্বা বাইট 65536
নীল

@ নীল টিপটির জন্য ধন্যবাদ। এটা এখন ঠিক।
আর কাপ,

@ Sp3000 তাই? তারা কিছু বাইট যুক্ত করেছে কিনা তা বিবেচ্য হবে, তবে তারা যে কোনও বাইট যুক্ত করে না তা আমার পক্ষে খুব ভাল।
আর কাপ,

4**8চেয়ে বাইট খাটো 65536
mathmandan

জেনারেটরের চারপাশে বন্ধনী ফেলে এবং 0 থেকে লেন (ডাব্লু) পর্যন্ত পুনরাবৃত্তি করে আপনি 4 বাইট সংরক্ষণ করতে পারেন । অপারেটর অগ্রাধিকার কাজে লাগিয়ে আরও 6 বাইট সংরক্ষণ করা যায়।
ডেনিস 19

1

বিদারণ , 324 বাইট

          /   M
       R_MZ  |S
      D ]    |S
 /?V?\} {}/  |S /    \
R{/A  Z$[/   |S/     {\
  } J{\      |S      ;_
 \^  /       |S   R'~++Y++~'L
 /    /      |S       }Y;
 \  \        ;^/
 /  /         +\+ R'~++A++~'L
 \  <Z________________/
    ;\X       //
              \Y/
               *

সুস্পষ্ট সতর্কতা, আমি এটিকে পরীক্ষা করেছি কেবলমাত্র বাস্তবায়ন হ'ল এফ # তে আমার নিজস্ব বন্দর port এটি গল্ফ হয় না, মূলত যেহেতু আমার প্রধান ধ্রুবকটি নীচে বরাবর শীতল হয়ে যাওয়ার সময় বেশ কয়েকটি দীর্ঘ রান করা আমার পক্ষে সহজ হয়েছিল, তাই আমি ফিরে এসে এটি টুইট করতে পারি।

এটা কিভাবে কাজ করে?

  • R'~++Y++~'Lব্লক একটি 256 ধ্রুবক এবং লঞ্চ সংযোগ ঘটিয়ে সামজিক এটা নীচের দিকে সরাসরি নীচের চুল্লী ভর গুণক সেটিং।
  • R'~++A++~'Aব্লক অন্য 256 এবং চুল্লী প্রতি এটা লঞ্চ আপ সংযোগ ঘটিয়ে সামজিক উপরে, যা fissions দুই ভর গুণিতক মধ্যে কণা 65536ভর প্রতিটি তাদের চালু বাম এবং ডান (যেখানে ডান কণা অবিলম্বে টারমিনেটর দ্বারা ধ্বংস হয় না)।
  • বাম কণা আরেকটি চুল্লিকে আঘাত করে এবং বিদারণের মধ্য দিয়ে যায় এবং উপরের এবং নীচে সমান ভরগুলির দুটি কণায় বিভক্ত হয়।
  • উপরের দিকে যাত্রা শক্তির দুটি কণা নেট-শূন্যের গণ হেরফেরের মধ্য দিয়ে যায়, বামে প্রতিবিম্বিত হয়, তারপরে ফিউশন চুল্লির ভর গুণককে সেট করে। এই চুল্লিটি হবে কীভাবে আমরা এইচ ব্লকে গুণ করব।
  • নিম্নগামী ভ্রমণ কণা বাম দিকে প্রতিফলিত হয় এবং দীর্ঘকাল ধরে ভর ছড়িয়ে দেয়, শেষ পর্যন্ত 65521(আমাদের বৃহত প্রাইম) একটি ভর পৌঁছায় ।
  • Zরানের শেষে ঘোরানো আয়না ( ) আবর্তনের ফলে কণাকে প্রাইমিকে নকল করে তোলে এবং ডানদিকে ফিরে পাঠায় যেখানে এটি শেষ পর্যন্ত বিদারণ চুল্লীর (act ^) সঞ্চিত ভর সেট করে । এইভাবে আমরা এইচ ব্লকে মডুলাস অপারেটরটি প্রয়োগ করব।
  • দ্বিতীয় অনুলিপিটি প্রতিবিম্বিত হয়েছে, যেখানে এটি বিভাজন চুল্লী ( <) এর জন্য আমরা অ্যালবামের জন্য ব্যবহার করব alog
  • এখন আমাদের ধ্রুবকগুলি স্থানে রয়েছে, আমরা আমাদের ইনপুট পড়তে এবং আমাদের দুটি তালিকা তৈরি করতে উপরের বাম দিকে শেননিগানে জড়িত। সত্যি বলতে কী, আমি সেগুলি কীভাবে কাজ করি তা ভুলে গিয়েছি, তবে খালি স্ট্রিংয়ের জন্য আমাকে এইচ ব্লক সামিং কণাটি ধীর করতে হয়েছিল, যা |S"কুলিং টাওয়ার" ব্যাখ্যা করে ।
  • \Y/ এল ব্লক (যা বাম চ্যানেলের মাধ্যমে আসে) এবং এইচ ব্লকটি (যা ডান চ্যানেলের মাধ্যমে আসে) ফিউজ করে, তারপরে এগুলিকে একটি টার্মিনেটরে স্ল্যাম করে যা ফিউজ ভরকে প্রস্থান কোড নির্ধারণ করে।

আমি যদি কোথাও ভুল না করি তবে এটি সরকারী দোভাষী ( লিঙ্ক ) এর সাথে কাজ করবে বলে মনে হয় না । আমি আপনার বন্দরটি এফ # তে কোথায় পাব?
ডেনিস

@ ডেনিস আমি চেষ্টা করতে চেষ্টা করছি যে বাগটি আমার শেষ দিকে আছে কি না, তবে আমি দোভাষীকে কাজ করতে পারি না। আমি এটির কাজ পেতে পারি কিনা তা যদি দেখতে পাই তবে প্রয়োজন হলে আমার উত্তর আপডেট করুন।
অ্যান্ড্রু কুনস

@ ডেনিস এটি দেখা যাচ্ছে যে অনলাইন অনুবাদক ত্রুটি কোড অবসান পরিচালনা করে না *, এটিই আমি আউটপুটটি ফিরিয়ে দিচ্ছি। আগামীকাল আউটপুট যাচাই করার জন্য আমি আর কোনও দোভাষী খুঁজে পেতে পারি কিনা তা আমি দেখতে পাব।
অ্যান্ড্রু কুনস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.