素数编码


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

笔记

  • 解码器可以假定其输入是可解码的
  • 您的答案只需要处理您的语言即可原生支持的整数,而无需使用(longbigInt等),这是合理的,如果您的语言仅支持不超过1的整数,则可能需要重新考虑发布答案

计分

您的分数是编码器和解码器的字节长度之和。

如果您需要导入模块,则前提是您的编码器和解码器可以共存于同一文件中并且可以重复使用(例如函数),则导入仅可以计数一次。

禁止默认漏洞

这是因此每种语言的最短分数将获胜。


最后一个示例是否必须执行,还是可以将输出限制为最多64位(2 ^ 63-1 / 9223372036854775808)?
凯文·克鲁伊森

1
@KevinCruijssen不,您的答案仅适用于您的语言可以处理的整数。
Asone Tuhid

1
@KevinCruijssen *本机处理没有bigints库,我将澄清
Asone Tuhid

Answers:


8

05AB1E,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

JavaScript(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

Java 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

更改long为可以节省2个字节int
Asone Tuhid

3

外壳,18 个字节

编码器,11个字节

Πmo!İp→∫Ẋ≠Θ

在线尝试!

解码器,7个字节

mȯ¬%2ṗp

在线尝试!

他们如何工作

编码器:

Πmo!İp→∫Ẋ≠Θ–完整程序。从第一个CLA获取输入,输出到STDOUT。
          Θ–附加一个默认元素(在这种情况下为0)。
        Ẋ≠–用≠(不等于)映射成对的相邻元素。在果壳中
              一些运算符会返回其他有用的东西,而不仅仅是布尔值。
              在此,≠返回其两个参数之间的绝对差。
       ∫–累计和。
 mo –将以下函数映射到总和列表上:
    İ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

Python 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

J,34个字节

深受乔纳森·艾伦(Jonathan Allan)的果冻解决方案启发!

编码器: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

C(GCC) 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;}

在线尝试!


@AsoneTuhid对不起,读错了。
乔纳森·弗雷希

@AsoneTuhid现在添加了一个解码器。希望现在符合要求。
乔纳森·弗雷希

@ovs是的;谢谢你的发言。
乔纳森·弗雷希

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

如果我能打入下一个最佳循环,那会更好。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.