প্রাইম ফ্যাক্টর এনকোডিং


15

এনকোডিং কীভাবে কাজ করে

বিটের একটি তালিকা দেওয়া হয়েছে:

  • একটি প্রাইম ধরে রাখা (দিয়ে শুরু 2)
  • একটি তালিকা আছে
  • ইনপুট প্রতিটি বিট জন্য
    • যদি এটি পূর্বের বিটের মতো হয় তবে আপনি তালিকায় থাকা প্রধানটিকে যুক্ত করুন
    • যদি এটি আলাদা হয় তবে পরবর্তী প্রধানটিকে ধরে রাখুন এবং এটিকে তালিকায় যুক্ত করুন
  • আপনার তালিকার সমস্ত সংখ্যার পণ্যটি ফিরিয়ে দিন
  • প্রথম বিটের জন্য, ধরে নিন আগের বিটটি ছিল 0

দ্রষ্টব্য: এই পদক্ষেপগুলি কেবল উদাহরণস্বরূপ, আপনার সেগুলি অনুসরণ করার দরকার নেই।

উদাহরণ

Input: 001
hold 2

0:         add 2 to the list
0:         add 2 to the list
1: hold 3, add 3 to the list

list: 2,2,3
Output: 12

Input: 1101
hold 2

1: hold 3, add 3 to the list
1:         add 3 to the list
0: hold 5, add 5 to the list
1: hold 7, add 7 to the list

list: 3,3,5,7
Output: 315

আরও কয়েকটি উদাহরণ:

000000000 -> 512
111111111 -> 19683
010101010 -> 223092870
101010101 -> 3234846615
011101101 -> 1891890
000101101010010000 -> 3847834029582062520

চ্যালেঞ্জ

এই এনকোডিং পদ্ধতির জন্য একটি এনকোডার এবং একটি ডিকোডার লিখুন ।

(ডিকোডারটি এনকোডারটির প্রক্রিয়াটিকে বিপরীত করে)।

ইনপুট আউটপুট

  • এনকোডারটি কোনও যুক্তিসঙ্গত ফর্ম্যাটে ইনপুট নিতে পারে

  • এনকোডারটিকে অবশ্যই একটি পূর্ণসংখ্যা বা একটি স্ট্রিং আউটপুট করতে হবে

  • ডিকোডারটি অবশ্যই এনকোডারটি একই বিন্যাসে ইনপুট নেবে

  • এনকোডারটি ইনপুট হিসাবে গ্রহণ করে একই ফর্ম্যাটটি ডিকোডারকে অবশ্যই আউটপুট করতে হবে

অন্য কথায় decoder( encoder( input ) ) === input

মন্তব্য

  • ডিকোডারটি ধরে নিতে পারে যে এর ইনপুটটি ডিকোডেবল
  • আপনার উত্তর শুধুমাত্র পূর্ণসংখ্যার সঙ্গে মোকাবিলা করার জন্য যে আপনার ভাষা স্থানীয়ভাবে ব্যবহার (ছাড়া সমর্থন করতে পারে না হয়েছে long, bigIntইত্যাদি), যুক্তিসঙ্গত হতে যদি আপনি ভাষা শুধুমাত্র একটি ints আপ 1 সমর্থন করে, হয়তো একটি উত্তর পোস্ট পুনর্বিবেচনা

স্কোরিং

আপনার স্কোরটি এনকোডার এবং ডিকোডারের বাইটের দৈর্ঘ্যের সমষ্টি।

আপনার যদি কোনও মডিউল আমদানি করতে প্রয়োজন হয় তবে আপনার এনকোডার এবং ডিকোডার একই ফাইলটিতে সহাবস্থান করতে পারে এবং পুনরায় ব্যবহার করা যেতে পারে (ফাংশনগুলির মতো) কেবলমাত্র একবার আমদানি গণনা করা যেতে পারে।

ডিফল্ট লুফোলগুলি নিষিদ্ধ।

এটি তাই প্রতিটি ভাষার জন্য সংক্ষিপ্ততম স্কোর জেতে।


এটি কি শেষ উদাহরণটি বাধ্যতামূলক, বা আমরা আউটপুটটিকে 64 বিট (2 ^ 63-1 / 9223372036854775808) পর্যন্ত সীমাবদ্ধ করতে পারি?
কেভিন ক্রুইজসেন

1
@ কেভিন ক্রুজসেন না, আপনার উত্তরটিতে কেবল আপনার ভাষা যে পরিচালনা করতে পারে সেই পূর্ণসংখ্যার জন্য কাজ করতে হবে।
Asone Tuhid

1
@ কেভিন ক্রুজসেন * দ্য বিগিন্টের লাইব্রেরি ছাড়াই স্থানীয়ভাবে পরিচালনা করুন, আমি স্পষ্ট করে
বলব

উত্তর:


8

05 এ বি 1 ই , 13 বাইট

এনকোডার, 8 বাইট

0ì¥ĀηOØP

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

ব্যাখ্যা

0ì          # prepend 0 to input
  ¥         # calculate deltas
   Ā        # truthify each
    η       # calculate prefixes
     O      # sum each
      Ø     # get the prime at that index
       P    # product

ডিকোডার, 5 বাইট

Ò.ØÉJ

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

ব্যাখ্যা

Ò       # get prime factors of input
 .Ø     # get their indices among the primes
   É    # check for oddness
    J   # join

7

জেলি , 17 বাইট

এনকোডার (10 বাইট):

0;IA+\‘ÆNP

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

ডিকোডার (7 বাইট):

ÆEĖŒṙḂ¬

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

কিভাবে?

এনকোডার:

0;IA+\‘ÆNP - Link: list of integers (1s and 0s)  e.g. [1,1,1,1,0]
0;         - prepend a zero                           [0,1,1,1,1,0]
  I        - incremental differences                  [1,0,0,0,-1]
   A       - absolute values                          [1,0,0,0,1]
    +\     - cumulative reduce with addition          [1,1,1,1,2]
      ‘    - increment each of the results            [2,2,2,2,3]
       ÆN  - get the nth prime for each result        [3,3,3,3,5]
         P - product of the list                      405

সঙ্কেতমোচক:

ÆEĖŒṙḂ¬ - Link: integer         e.g. 405
ÆE      - prime exponent array       [0,4,1] (representing 2^0*3^4*5^1)
  Ė     - enumerate                  [[1,0],[2,4],[3,1]]
   Œṙ   - run-length decode          [2,2,2,2,3]
     Ḃ  - bit (mod 2)                [0,0,0,0,1]
      ¬ - logical NOT                [1,1,1,1,0]

5

জাভাস্ক্রিপ্ট (ES6), 130 বাইট

I / O: বিট ↔ পূর্ণসংখ্যার অ্যারে

এনকোডার, 71 বাইট

a=>a.map(p=k=>r*=(g=i=>n%--i?g(i):i<2?n:g(++n))(n+=p^(p=k)),r=1,n=2)&&r

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

ডিকোডার, 59 বাইট

D=(n,k=2,x=b=0)=>k>n?[]:n%k?D(n,k+1,1):[b^=x,...D(n/k,k,0)]

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


3

জাভা 10, 209 বাইট

এনকোডার, 124 বাইট

s->{long p=48,P=2,r=1,n,i;for(int c:s.getBytes()){if(p!=(p=c))for(n=0;n<2;)for(n=++P,i=2;i<n;n=n%i++<1?0:n);r*=P;}return r;}

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

ব্যাখ্যা:

s->{                // Method with String parameter and long return-type
  long p=48,        //  Previous character, starting at '0'
       P=2,         //  Current prime, starting at 2
       r=1,         //  Result, starting at 1
       n,i;         //  Temp-integers
  for(int c:s.getBytes()){
                    //  Loop over the digits of the input-String as bytes
    if(p!=(p=c))    //   If the current and previous digits are different
      for(n=0;      //    Reset `n` to 0
          n<2;)     //    And loop as long as `n` is still 0 or 1
        for(n=++P,  //     Increase `P` by 1 first with `++P`, and set `n` to this new `P`
            i=2;i<n;n=n%i++<1?0:n);
                    //     Check of the current `n` is a prime
                    //     If it remains the same it's a prime, if it becomes 0 or 1 not
    r*=P;}          //   Multiply the result by the current prime `P`
  return r;}        //  Return the result

ডিকোডার, 85 বাইট

n->{var r="";for(long P=2,f=0,i=1;++i<=n;)for(;n%i<1;n/=P=i)r+=i!=P?f^=1:f;return r;}

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

ব্যাখ্যা:

n->{                // Method with long parameter and String return-type
  var r="";         //  Result-String, starting empty
  for(long P=2,     //  Current prime, starting at 2
      f=0,          //  Flag integer, starting at 0
      i=1;++i<=n;)  //  Loop `i` in the range [2,`n`]
    for(;n%i<1;     //   Inner loop over the prime factors of `n`
        n/=P=i)     //     After every iteration: divide `n` by `i`,
                    //     and set `P` to `i` at the same time
      r+=i!=P?      //    If `i` and `P` are not the same
          f^=1      //     Append the opposite of the flag `f` (0→1; 1→0)
         :          //    Else:
          f;        //     Append the flag `f`
  return r;}        //  Return the result

আপনি পরিবর্তন করে 2 বাইট সংরক্ষণ করতে পারবেন longকরার int
অসোন তুহিদ

3

হুশ , 18 বাইট

এনকোডার, 11 বাইট

Πmo!İp→∫Ẋ≠Θ

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

ডিকোডার, 7 বাইট

mȯ¬%2ṗp

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

তারা কিভাবে কাজ করে

এনকোডার:

!Mo! →p → ∫Ẋ ≠ Θ - সম্পূর্ণ প্রোগ্রাম। প্রথম সিএলএ থেকে ইনপুট নেয়, STDOUT এ আউটপুট দেয়।
          Θ - একটি ডিফল্ট উপাদান প্রস্তুত করুন (এই ক্ষেত্রে 0)
        । ≠ - সংলগ্ন উপাদানের জোড়া over (সমান নয়) এর সাথে মানচিত্র করুন। কাস্তে,
              কিছু অপারেটর কেবল বুলিয়ান মানগুলি ছাড়াও অন্যান্য দরকারী জিনিসগুলি ফেরত দেয়।
              এখানে, its তার দুটি আর্গুমেন্টের মধ্যে পরম পার্থক্য প্রদান করে।
       ∫ - সংখ্যার যোগফল।
 মো - অঙ্কের তালিকার উপরের ফাংশনটির মানচিত্র করুন:
    --P - প্রাইমগুলির অসীম তালিকার সন্ধান করুন।
   ! → - এবং বর্তমান বর্ধিত পরিমাণের সাথে এটিতে সূচক।
Π - পণ্যটি নিন।

সঙ্কেতমোচক:

mȯ¬%2ṗp – Full program.
      p – Prime factorization.
mȯ      – Map the following function over the list of factors:
     ṗ    – Retrieve the index in  the list of primes.
   %2     – Modulo 2.
  ¬       – Logical NOT.

3

পাইথন 2 , 234 193 174 বাইট

এনকোডার, 116 101 97 বাইট:

উইলসনের উপপাদ্য ব্যবহার করুন ।

i=input()
P=n=x=r=1
while i:
 P*=n*n;n+=1
 if P%n:t=(i+[x]).index(x);i=i[t:];r*=n**t;x^=1
print r

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

ডিকোডার, 118 92 77 বাইট:

i=input()
r=[]
n=x=1
while~-i:
 n+=1;x^=i%n<1
 while i%n<1:r+=x,;i/=n
print r

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


1

জে , 34 বাইট

ভারী জোনাথন অ্যালান এর জেলি সমাধান দ্বারা অনুপ্রাণিত!

এনকোডার: 23 বাইট

[:*/[:p:[:+/\2|@-~/\0,]

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

                    0,]  NB. prepend 0 to the input
             2  -~/\     NB. find the differences
              |@         NB. and their absolute values 
        [:+/\            NB. running sums
    [:p:                 NB. n-th prime
[:*/                     NB. product  

আমি অনেকগুলি ক্যাপ কাঁটা পছন্দ করি না [:- এটি গল্ফযোগ্য হওয়া উচিত।

ডিকোডার: 11 বাইট

2|[:_1&p:q:

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

        q:    NB. prime factorization
  [:_1&p:      NB. find the number of primes smaller than n
2|             NB. modulo 2 


1

সি (জিসিসি) , 180 184 বাইট

  • চারটি বাইট যুক্ত করা হয়েছে যাতে আউটপুট ফর্ম্যাটগুলি মেলে।

102 বাইট - এনকোডার

p,r,i,m;e(char*_){for(m=0,p=1,i=2;*_;m=*_++-48,p*=i)if(*_-48-m)for(i++,r=2;r<i;i%r++||(r=2,i++));i=p;}

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

82 বাইট - ডিকোডার

d(C){for(m=C%2,r=2+m,p=2;C>1;p++)if(C%p<1)p-r&&(m=!m,r=p),putchar(m+48),C/=p,p=1;}

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


@ অ্যাসোনতুহহিদ দুঃখিত, ভুল পড়া
জোনাথন ফ্রেচ

@ অ্যাসোনতুহিড এখন একটি ডিকোডার যুক্ত করেছে। আশা করি এখন সুসংগত।
জোনাথন ফ্রেচ

@ ওভস ট্রু; আপনার মন্তব্যের জন্য ধন্যবাদ
জনাথন ফ্রেচ

1

গোল> <> , 29 + 39 = 68 বাইট

এনকোডার, 29 বাইট

021IEh{$:}-Q$TP:SP?!t$|1k*3R!

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

ডিকোডার, 39 বাইট

02I:MZ;:2k%:z}Q$TP:SP?!t$|1k,{{-z:N}3R!

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

কিভাবে এই কাজ

Encoder

021IEh{$:}-Q$TP:SP?!t$|1k*3R!

021                            Setup the stack as [last bit, current prime, current output]
   IEh                         Take input as int; if EOF, print top as number and halt
      {$:}-Q          |        If the next bit is different from the last bit...
            $                    Move the prime to the top
             T      t            Loop indefinitely...
              P:SP?!               Increment; if prime, skip `t` i.e. break
                     $           Move the prime to the correct position
                       1k*     Multiply the prime to the output
                          3R!  Skip 3 next commands (the init part)
                               Loop the entire program until EOF

---

Decoder

02I:MZ;:2k%:z}Q$TP:SP?!t$|1k,{{-z:N}3R!

02I                  Setup the stack as [last bit, current prime, encoded]
   :MZ;              If encoded == 1, halt
       :2k%          Compute encoded modulo prime
           :z}       Store NOT of the last at the bottom of the stack
              Q...|  Same as encoder's next-prime loop
1k,                  Divide encoded by prime (assume it is divisible)
   {{                Pull out the two bits at the bottom
     -z              Compute the next bit
       :N}           Print as number with newline, and move to the bottom
          3R!        Skip 3 init commands
                     Loop the entire program until finished

আমি যদি পরের প্রাইম লুপটি গল্ফ করতে পারি তবে ভাল হত ...

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.