Ana Faktör Kodlaması


15

Kodlama nasıl çalışır?

Bir bit listesi verildiğinde:

  • Asal tut (ile başlayan 2)
  • Bir listeniz var
  • Girişteki her bit için
    • Önceki bit ile aynıysa, tuttuğunuz asalı listeye ekleyin
    • Farklıysa, bir sonraki asalınızı tutun ve listeye ekleyin
  • Listenizdeki tüm numaraların ürününü iade edin
  • İlk bit için, önceki bitin 0

Not: bu adımlar yalnızca açıklama amaçlıdır, bunları izlemenize gerek yoktur.

Örnekler

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

Bazı örnekler:

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

Meydan okuma

Bu kodlama yöntemi için bir kodlayıcı ve bir kod çözücü yazın .

(Kod çözücü kodlayıcının işlemini tersine çevirir).

Giriş çıkış

  • Kodlayıcı girişi makul herhangi bir biçimde alabilir

  • Kodlayıcı bir tamsayı veya bir dize çıktısı almalıdır

  • Kod çözücü girişi, kodlayıcının kullandığı formatta almalıdır.

  • Kod çözücü, kodlayıcının girdi ile aynı formatta çıktı alması gerekir

Diğer bir deyişle decoder( encoder( input ) ) === input

notlar

  • Dekoder, girişinin deşifre edilebilir olduğunu varsayabilir
  • Cevabınız sadece dil doğal olarak (kullanmadan destekleyebilir tamsayılar uğraşmak zorundadır long, bigIntsadece 1'e int'leri destekler dil varsa, makul ol, vs.), belki Yanıt göndererek yeniden

puanlama

Skorunuz enkoder ve dekoderin bayt cinsinden uzunluklarının toplamıdır.

Bir modülü içe aktarmanız gerekirse, kodlayıcı ve kod çözücünüz aynı dosyada bir arada bulunabiliyorsa ve yeniden kullanılabilirse (işlevler gibi) içe aktarma yalnızca bir kez sayılabilir.

Varsayılan boşluklar yasaktır.

Bu yani her dil için en kısa puan kazanır.


Bu son örnek zorunlu mu yoksa çıktıyı 64 bitle sınırlayabilir miyiz (2 ^ 63-1 / 9223372036854775808)?
Kevin Cruijssen

1
@KevinCruijssen Hayır, cevabınızın yalnızca dilinizin işleyebileceği tamsayılar için çalışması gerekir.
Asone Tuhid

1
@KevinCruijssen * bigints kütüphaneleri olmadan yerel olarak işlemek, açıklığa
kavuşacağım

Yanıtlar:


8

05AB1E , 13 bayt

Enkoder, 8 bayt

0ì¥ĀηOØP

Çevrimiçi deneyin!

açıklama

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

Kod çözücü, 5 bayt

Ò.ØÉJ

Çevrimiçi deneyin!

açıklama

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

7

Jöle , 17 bayt

Kodlayıcı (10 bayt):

0;IA+\‘ÆNP

Çevrimiçi deneyin!

Kod çözücü (7 bayt):

ÆEĖŒṙḂ¬

Çevrimiçi deneyin!

Nasıl?

Encoder:

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

dekoder:

Æ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 bayt

G / Ç: bit dizisi ↔ tamsayı

Enkoder, 71 bayt

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

Çevrimiçi deneyin!

Kod çözücü, 59 bayt

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

Çevrimiçi deneyin!


3

Java 10, 209 bayt

Kodlayıcı, 124 bayt

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;}

Çevrimiçi deneyin.

Açıklama:

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

Kod çözücü, 85 bayt

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;}

Çevrimiçi deneyin.

Açıklama:

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

Sen değiştirerek 2 bayt kaydedebilirsiniz longiçin int.
Asone Tuhid

3

Kabuk , 18 bayt

Enkoder, 11 bayt

Πmo!İp→∫Ẋ≠Θ

Çevrimiçi deneyin!

Kod çözücü, 7 bayt

mȯ¬%2ṗp

Çevrimiçi deneyin!

Onlar nasıl çalışır

Encoder:

!Mo! İp → ∫Ẋ ≠ Θ - Tam program. İlk CLA'dan girdi alır, STDOUT'a çıktı verir.
          Θ - Varsayılan bir öğeyi ekle (bu durumda 0).
        Ẋ ≠ - Bitişik elemanların çiftlerini with (eşit değil) ile eşleyin. Kabuğunda,
              bazı operatörler yalnızca boole değerlerinden başka yararlı şeyler döndürür.
              Burada, two iki argümanı arasındaki mutlak farkı döndürür.
       ∫ - Kümülatif toplamlar.
 mo - Aşağıdaki işlevi toplamlar listesiyle eşleştir:
    İp - Sonsuz asal listesini verin.
   ! → - Ve toplamı artırılarak endekslenir.
Π - Ürünü alın.

dekoder:

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 bayt

Jonathan Allan'ın Jelly çözümünden büyük ilham aldı!

Kodlayıcı: 23 bayt

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

Çevrimiçi deneyin!

                    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  

O kadar çok çatal çatal sevmiyorum [:- golf edilebilir olmalı.

Kod çözücü: 11 bayt

2|[:_1&p:q:

Çevrimiçi deneyin!

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


1

C (gcc) , 180 184 byte

  • Çıktı biçimlerinin eşleşmesi için dört bayt eklendi.

102 bayt - Kodlayıcı

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;}

Çevrimiçi deneyin!

82 bayt - Kod çözücü

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;}

Çevrimiçi deneyin!


@AsoneTuhid Üzgünüm, yanlış okudum.
Jonathan Frech

@AsoneTuhid Şimdi bir kod çözücü ekledi. Umarım şimdi uyumludur.
Jonathan Frech

@ovs True; Yorumunuz için teşekkürler.
Jonathan Frech

1

Göl> <> , 29 + 39 = 68 bayt

Enkoder, 29 bayt

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

Çevrimiçi deneyin!

Kod çözücü, 39 bayt

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

Çevrimiçi deneyin!

Bunlar nasıl çalışır?

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

Bir sonraki ana döngüde golf oynasam daha iyi olurdu ...

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.