주요 요소 인코딩


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당신은 단지 1의 int를 지원 언어 경우, 합리적인 등), 아마 대답을 게시 재고

채점

점수는 인코더와 디코더의 길이를 바이트 단위로 합한 것입니다.

모듈을 가져와야하는 경우 인코더와 디코더가 같은 파일에 공존하고 재사용 될 수있는 경우 가져 오기는 한 번만 계산할 수 있습니다 (함수처럼).

기본 허점 은 금지되어 있습니다.

이것은 이므로 모든 언어에서 가장 짧은 점수가 이깁니다.


마지막 예제는 필수입니까, 아니면 출력을 최대 64 비트 (2 ^ 63-1 / 9223372036854775808)로 제한 할 수 있습니까?
Kevin Cruijssen

1
@KevinCruijssen 아니오, 귀하의 답변은 귀하의 언어가 처리 할 수있는 정수에 대해서만 작동해야합니다.
Asone Tuhid

1
@KevinCruijssen * bigints 라이브러리없이 기본적으로 처리합니다. 명확하게 설명
하겠습니다

답변:



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]


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

로 변경 long하여 2 바이트를 절약 할 수 있습니다 int.
Asone Tuhid

3

껍질 , 18 바이트

인코더, 11 바이트

Πmo!İp→∫Ẋ≠Θ

온라인으로 사용해보십시오!

디코더, 7 바이트

mȯ¬%2ṗp

온라인으로 사용해보십시오!

작동 방식

인코더 :

Πmo! İp → ∫Ẋ ≠ Θ – 전체 프로그램. 첫 번째 CLA에서 입력을 가져와 STDOUT으로 출력합니다.
          Θ – 기본 요소 앞에 붙습니다 (이 경우 0).
        Ẋ ≠ – ≠ (같지 않음)으로 인접한 요소 쌍에 맵핑합니다. 허 스크에서
              일부 연산자는 부울 값 이외의 유용한 정보를 반환합니다.
              여기서 ≠는 두 인수 사이의 절대 차이를 반환합니다.
       ∫ – 누적 합계.
 mo – 합계 목록에 다음 함수를 맵핑하십시오.
    – – 무한 소수 목록을 나타냅니다.
   ! → – 현재 합계가 증가한 상태에서 색인을 생성합니다.
Π – 제품을 가져 가십시오.

디코더 :

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.


1

J , 34 바이트

Jonathan Allan의 Jelly 솔루션에 큰 영향을 받았습니다!

인코더 : 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) 바이트

  • 출력 형식이 일치하도록 4 바이트를 추가했습니다.

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 죄송합니다. 잘못 읽었습니다.
Jonathan Frech

@AsoneTuhid 이제 디코더를 추가했습니다. 희망적으로 준수하십시오.
Jonathan Frech

@ovs True; 귀하의 의견에 감사드립니다.
Jonathan Frech

1

Gol> <> , 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.