Prime Factor Encoding

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, возможно, пересмотрите возможность размещения ответа

счет

Ваша оценка - это сумма длин в байтах кодера и декодера.

Если вам нужно импортировать модуль, импорт может быть подсчитан только один раз при условии, что ваш кодер и декодер могут сосуществовать в одном и том же файле и использоваться повторно (как функции).

Лазейки по умолчанию запрещены.

Это поэтому выигрывает самая короткая оценка для каждого языка.

Асоне Тухид
источник
Это последний пример обязателен, или мы можем ограничить вывод до 64 бит (2 ^ 63-1 / 9223372036854775808)?
Кевин Круйссен
1
@KevinCruijssen Нет, ваш ответ должен работать только для целых чисел, которые ваш язык может обрабатывать.
Asone Tuhid
1
@KevinCruijssen * обрабатывать изначально без библиотек bigints, я
уточню

Ответы:

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
Emigna
источник
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

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
Кевин Круйссен
источник
Вы можете сохранить 2 байта, изменив longна int.
Asone Tuhid
3

Шелуха , 18 байт

Кодировщик, 11 байт

Πmo!İp→∫Ẋ≠Θ

Попробуйте онлайн!

Декодер, 7 байт

mȯ¬%2ṗp

Попробуйте онлайн!

Как они работают

Кодер:

Πmo! İp → ∫Ẋ ≠ Θ - Полная программа. Принимает вход от первого CLA, выводит на STDOUT.
          Θ - добавить элемент по умолчанию (в данном случае 0).
        Ẋ ≠ - Отобразить пары соседних элементов с помощью ≠ (не равно). В шелухе,
              некоторые операторы возвращают другие полезные вещи, кроме просто логических значений.
              Здесь ≠ возвращает абсолютную разницу между двумя аргументами.
       ∫ - кумулятивные суммы.
 mo - Сопоставить следующую функцию со списком сумм:
    İp - дает бесконечный список простых чисел.
   ! → - И индексировать его с текущей суммой.
Take - Возьми продукт.

декодер:

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.
Мистер Xcoder
источник
1

J , 34 байта

Сильно вдохновлен решением Jone от компании Jonathan Allan's 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 байта

  • Добавлены четыре байта, чтобы выходные форматы совпадали.

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 True; спасибо за ваше замечание
Джонатан Фрех
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

Было бы лучше, если бы я мог поиграть в гольф по следующей петле ...

фонтанчик для питья
источник