Стислість максимальної послідовності-2 послідовності


18

Виведіть цю двійкову послідовність довжиною 1160:

-++-+--++-++-+--+--++-+--+--++-+--++-++-+-++--++-+---+-++-+--+--++++--+--++-+--++-++----++-++-+-++--++-+-+---++-+--++-++-+--++-+--+---+-++-+--++-++-+--+--++-++-+--++-+--+++-+-+----+++-+--+--+++---++-++-+--+--+++--+-+-+--+-+++-++-+--+--++-+--++-++-+--+--++--+++---+++-+---++-+--++--+-+--+-+++-+--++-++-+--++-+--+--++-+--++--+-++-+-+--+-+-++-+--++-+--+--++-+-+-++-+-+-++---+-+--++++--+---++-+-++-+--++-+--+--++-+--++++--+---+-++++--+--++-++-+--++-+--+--++-+--++-++-+--++-+--+--++-++-+----+++-+--++--+++---+-++-+--+-++---+-++-++-+--+--++--++++-+--+--+--++++--+--+++---++-++-+--++--+-+--+--++-++-+--+--+-+++-++-+--+--++--+-++-++-+--+--+--++-++-+--+++---++-+--++-++---+++---++-++----+++--+-++-+--+--++-+--++-++-+-++--++--++----+++-++--++----++-+++--++---+++----+-+-++-++-++-+-+----+++--++-+--++-++-+--+--+--++-+--++-++-+--++--+-+--+-+-+-++++---+-+-++--+--+-+-+-++-+-+++--+-+--+--+-+++--+-+++---++-+--+--++-++--++---++-+-++--++-+---+-++-+--+-++--++-+--++-+--+-+++-+--++--+-+-+++--+-+--++-++-+--+--+-++---+-++-+-++--++-+--+++-+----++--+-++-+-++--++-+--++-+-++--++-+---+-++-+--+++----+-+-++--++-+--++-++-++-+--+--+--++++---++---+-+-++-+-+++--+-++--+-+--+-+-++---+++-++

Послідовність

Ця кінцева послідовність є тісно структурованою таким чином, що, сподіваюся, надає унікальні методи стиснення. Він виникає з проблеми розбіжності Ерда, яка була викладена в а попередньому виклику .

Трактуючи терміни як +1 і -1, це послідовність максимальної довжини розбіжності 2, що означає:

Для кожного позитивного розміру кроку d, якщо ви приймаєте кожен d'-й термін (починаючи зd го ), поточна сума отриманої послідовності залишається між -2 і 2 включно.

Якщо ви думаєте, що кожен +означає крок праворуч і- означає крок вліво, це означає, що хода кожної dтретьої інструкції ніколи не рухається більше ніж на 2 кроки від вихідної позиції.

Наприклад, для d=3, якщо взяти кожен третій термін, задається послідовність +-++--+--+-..., чия сума сумарних сум [1,0,1,2,1,0,1,0,-1,0,1,...], яка ніколи не досягає -3 або 3.

-++-+--++-++-+--+--++-+--+--++-+--+...
  ^  ^  ^  ^  ^  ^  ^  ^  ^  ^  ^
  +  -  +  +  -  -  +  -  -  +  -
   1  0  1  2  1  0  1  0 -1  0  -1  ...

Цю послідовність було знайдено у 2014 році за допомогою комп'ютерного пошуку. Дивіться цей документ , де послідовність відтворена у Додатку B. Пошук доводить, що 1160 - це максимальна довжина послідовності з невідповідністю-2, хоча існує більше однієї послідовності такої довжини. Проблема розбіжності Ерда, доведена в 2015 році , говорить про те, що будь-яка така послідовність повинна мати кінцеву довжину для будь-якої максимальної невідповідності cзамість 2.

Часова вимога

Ваш код має закінчитися протягом 5 секунд . Це обмеження жорстокого насильства.

Формат виводу

Ви можете використовувати будь-які два фіксованих різних символи або значення для +та- у будь-якому форматі, подібному до списку чи рядку. Формат повинен бути таким, де 1160 бітових значень можна безпосередньо зчитувати, а не, наприклад, кодуватися як число через його бінарне подання або рядок через значення символів. Для виведення рядків дозволений останній новий рядок.

Таблиця лідерів


найпоширеніші підрядки довжиною 1-16, якщо хтось хоче знати
лише для ASCII

Я відчуваю, що буде дуже важко перемогти компресію ...
Esolanging Fruit

Відповіді:


3

Желе , 149 байт

“×GOẈ*m¬¿3d{ẋạ⁻@Ɓ]ZĊỵINBƬḊṿẊ*N¹Ẹ÷ƲẋɼoṬḳ£®⁾ƙŒọ¡[P1&ạ€ẊʠNỌXḢṖėÐß⁹Ụṗ¬⁹E#ụḷḌṁżżR=Ɗѳıɲ-ṭỌṾɲẎĿỴ⁶€ḋtɦÐ\ỵƒ⁾ƒụṫṡĊKpƭẏkaṪ,Ẋȧ⁻ḅMɓ%YḷsƲƭl¤æĊbṬ9D6ẎƘẓ^Œ⁷Ɲḷḷ€ḟ1g’B

Існує деяка закономірність, наприклад, лише 81 з 8 двійкових рядків довжиною 256 довжиною 256, якщо один розбиває послідовність у вісімку, але я (принаймні поки що) не помітив жодного способу використання будь-якого, щоб зменшити кількість байтів з цієї прямої передньої бази Стиснення 250, перетворене у бінарний список.

Спробуйте в Інтернеті! (колонтитул форматує двійковий список у рядок для легшого прямого порівняння).



3

JavaScript (ES6), 263 253 252 байти

Я намагався використовувати якомога менше даних про корисне навантаження. На жаль - але не дивно - для цього потрібно досить багато коду декомпресії.

Зламатися:

  • дані про корисне навантаження: 75 байт, закодовані у вигляді 100 символів рядка Base64
  • код: 163 153 152 байт

Нижче відформатована версія без даних. Сирий код міститься в демонстраційному фрагменті.

f = (a = Array(264).fill(n = p = 0)) =>
  n++ < 1160 ?
    '+/-'[
      p += !a.some((v, i) =>
        n % i | v * v - 4 ?
          0
        :
          r = v / 2,
        r = atob`...`.charCodeAt(p / 8) >> p % 8 & 1 || -1
      ),
      r + 1
    ] +
    f(a.map((v, i) => n % i ? v : v - r))
  :
    ''

Як?

Ми відслідковуємо поточні суми [i] кожного i -го доданків. Кожен раз, коли одна з цих сум потрапляє на нижню межу -2 , ми знаємо, що наступним доданком має бути значення + . Ця ж логіка стосується верхньої межі. Це корисно до i = 264 і не економить зайвих байтів.

Це дає нам 599 термінів, про які неможливо здогадатися. Ми зберігаємо їх у форматі 99599 / 8⌉ = 75 байт, закодованих у 100-символьний рядок Base64.

Демо


3

Желе , 110 109 107 байт

;1mS€:3o/Nȯ®Ṫṭḷ
“ĖṄẋ{Xṛ-İIṗ®6⁼Ḟ2a⁻!Ċẉȥ+¡Ƒ¥mvrẓsṘ×⁴ç&$nỴỤ)M7?ẊẎḅ=ṠƈTṙḌȥụẋXḌ⁵Ḣ⁺ḲL÷æTƥĿv€%ḟ¢®!Ė’BḤ’©ṛ⁽¡ɠÆD€Nç/

На TIO це забирає занадто багато часу, але воно закінчується за 3 секунди на моєму настільному комп’ютері.

Спробуйте в Інтернеті!


3

Желе , 135 133 130 129 105 104 байт

42“I=İėZP*ðEḄẈṆ'mBƝėŻƝ6®Ṇɼḥ[bȦėṡV£(6ṘɱX)Ṅẹ6~K7°ȤÄỴ¥ƝÇ5prḳġŻ£ƭṗṄFṾḃ{©@ɼ’ḃÄċL
L+Ø.ÆDm@NÇ¡§§No¥/Ṡo-ṭ
Ç⁽¡ɠ¡Ḋ

Спираючись на попередні елементи послідовності, алгоритм дає освіченому здогадуванню, яким може бути наступний елемент. Це працює для всіх, крім 99 елементів, індекси яких жорстко закодовані, щоб відповідні елементи можна було замінити.

Спробуйте в Інтернеті!


2

MATL , 224 байти

862:o'$Te]BQHoHxkw!-CEjv(j=zGp.8_C{\?wkH{t&%W.:ja#7=+>"/,=0wDJ+"2BREtgh9_2I%1>+99T3kPrknzlJ}&8kUR(S!pX]C]05u{"6MHA7"gg(M6\5Vp.k.18Y(c~m&wroTrN)sf" |>\,Lg80C:nUez|l;<h~m(%]4xx6?`=qGtZ):d"*"@~1M.T}jJ)Bl7>Ns >9$8R1MlkG'F3:qZaY"

Вихід має форму 1 0 0 1 0 ..., де 1відповідає '-'і 0відповідає '+'.

Спробуйте в Інтернеті!

Пояснення

Послідовність закодована довжиною. Усі 720 прогонів мають довжини 1, 2, 3 або 4, причому 3 або 4 є менш поширеними. Отже, кожен 3 був замінений на 2, 0, 1 (пробіг 2, потім пробіг 0 іншого символу, потім повтор 1 знову) і аналогічно кожен 4 був замінений на 2, 0, 2. Це дає потрійний масив довжиною 862.

Цей масив перетворюється на кодування base-94 і являє собою довгий рядок, показаний у коді ( '$Te...kG'). Базове кодування 94 використовує всі 95 символів для друку ASCII, за винятком єдиної цитати (яку потрібно було б уникнути).

Код перетворює цей рядок з бази 94 в базу 3 і використовує результат для декодування символів довжиною запустити [1 0 1 0 ... 0](масив довжиною 862).


2

Желе , 95 байт

“qạʂṅs⁽fØʋZ%BÞġı½.m0&u⁺TsƝȧAuỴż⁶3uÞ$+ȷ@4Ṣ’BḤC©µmLÆD$§SṠȯ®ṪNLḟ“⁶ .£µ+£gÐ9Ц.ñ×µ¥¤®‘ÄḤ¤ɗ}¡ṭø⁽¡ɠ¡Ḋ

Середня точка між двома моїми попередніми підходами.

Код намагається відгадати 842 елементи послідовності, а жорсткі коди залишилися 318. 19 припущень є невірними, і їх потрібно повернути за допомогою списку твердо кодованих індексів.

Спробуйте в Інтернеті!

Як це працює

“qạʂṅs⁽fØʋZ%BÞġı½.m0&u⁺TsƝȧAuỴż⁶3uÞ$+ȷ@4Ṣ’

Це бієктивна база 250 літералів, яка використовує кодову сторінку Jelly для цифр і кодує ціле число 380009100940380065412452185545474826295694594854898450166594167299196720639075810827320738450934, який ©зберігається в реєстрі.

BḤC©

Bперетворює ціле число у двійкові, unhalves / подвоює отримані біти, а потім Cвіднімає результати1. Результат - список із 318 примірників±1.

µmLÆD$§SṠȯ®ṪNLḟ“⁶ .£µ+£gÐ9Ц.ñ×µ¥¤®‘ÄḤ¤ɗ}¡ṭ

Цей монадичний ланцюг приймає префікс потрібного виходу (із попередньою формою) 0) і додає наступний елемент виводу. Ланцюг працює наступним чином:

mLÆD$§SṠȯ®ṪNLḟ“⁶ .£µ+£gÐ9Ц.ñ×µ¥¤®‘ÄḤ¤ɗ}¡ṭ  Monadic chain. Arument: A (array)

 LÆÐ$                                       Compute all divisors of the length of A.
m                                           For each divisor d, generate the subarray
                                            of each d-th element.
     §                                      Take the sum of each subarray.
      S                                     Take the sum of the sums.
       Ṡ                                    Take the sign of the sum.
        ȯ®                                  If the result is 0, replace it with the
                                            array in the register.
          Ṫ                                 Tail; pop and yield the last element,
                                            modifying the register for a zero sum.
                                            This is a no-op for a non-zero sum.
              “⁶ .£µ+£gÐ9Ц.ñ×µ¥¤®‘ÄḤ¤      Yield all indices of incorrect guesses.
           NLḟ                        ɗ¡    If the length of A doesn't appear among
                                            the indices, negate the result.
                                        ṭ   Append the result to A.
ø⁽¡ɠ¡Ḋ

Цей ніладієвий ланцюг скидає повернене значення до 0, викликає монадійне посилання вище 1160 разів ( ⁽¡ɠкодує ціле число1160 рік), потім видаляє перший елемент (0) з .


Схоже, арифметичне кодування було б простіше, ніж вручну змінити деякі записи; Ви пробували це, або Jelly для цього не підходить?
lirtosiast

Є лише 19 записів, які потрібно змінити, які закодовані в 23 байти. Я думаю, що арифметичний декодер був би довшим, ніж принаймні з пов'язаними даними.
Денніс

1

Вугілля деревне , 150 байт

”a∧∨~℅¹÷Oμ6fCC⁼∕⁵^;Ÿ‘«·T:∕D_=v§AHŒ,—<Pr¢E!◨±L^|.τ"NO“šþŽ∧<n`bÞE÷β$+Z⟦5⁶⁻.λ‹ζd⧴X>w,⊞?‹⟧⌈⪪-h÷³N“K⁺L¿>ρ@P⟲↘3νηKx÷?>™Ž¿•:8V¦£œεG↧x℅7¶	NRü"m”⟦)&¶bE“Yv”

Спробуйте в Інтернеті!

Використовує вбудований вугільний компресійний рядок. Використання .для -і !для +.


1

CJam, 153 байти

"Ke²ÉLº[
O%2¹d²Ý,Éeñlr[´KeÙ.Y­K-iZ[*Të
ÊYl°Ý
ËeËd¼Y%³l69,ÖÉmÙ¤¶ÉcN9<il²S3ÄÏ#8õ$¯d¶Ë%Õ¦Õ(Öѣɦ]-2ËEd¶)/4¦YLºXõ2É-°çR5©Ä"256b2b

Використання 1для -та 0для +.

Містить недруковані матеріали. Спробуйте в Інтернеті!

Це досить просто. Перетворює довгу послідовність з бази 256 в базу 2.


1

Python 3 , 236 232 байт

Завдяки Mego за збереження 4 байт

#coding:437
print(bin(int.from_bytes('ûKe▓╔L║[\rûO%2╣d▓▌,û╔eè±lr[\x1a┤KeÆ┘Ä.Y¡\x16K-ûiZû[*Tδ\r╩Yl░▌\rÆ╦eÆ╦d╝YÄû¥%│\x0bl69,╓╔m\x12┘ñ╢╔cûN9<il▓S3─╧#8⌡$»\x19d╢╦%Ü╒\x0eª╒(╓╤úû╔£ª]-2╦EÜìd╢¥)û/4ªYL║X⌡2╔-░τRì5⌐─'.encode('437'),'big'))[2:])

Спробуйте в Інтернеті!

Використовує кодування CP-437. Дякуємо Деннісу за те, що він вказав на помилку.


437- псевдонім для cp437, тому ви можете поголити 4 байти, позбувшись cpбітів у обидва рази.
Мего


0

C # , 385 байт


Дані

  • Введення немає
  • Вихідний String результат.

Гольф

()=>{var s="i´\u009aM6³E¤òi°ÚÍF\u009bM\"Ói6\u009au\u000e\u0093\u008d¤åK´\u009am&qѦRé´Òi\u0096¥i¤Õ«\u0014ò5¦\u0093O\"òm4\u009am4\u009bC¦qibÚLô\u0093ÉÆÓ)6\u0092í&[I6\u009ci±ÆÃ\u0096\u0093M¬Ì;0ÜÇ\nÛPæ\u009bI4Úe*ñY*×).\\i6cY¢ÒÍ4ºer\u009bIbÖiÐËY¦³E§\nÍ6ÒO\u0018­rÊV;";var o="";foreach(var c in s)foreach(var b in Convert.ToString(c,2).PadLeft(8,'0'))o+=(char)(43+(49-(int)b)*2);return o;};

Безумовно

() => {
    var s = "i´\u009aM6³E¤òi°ÚÍF\u009bM\"Ói6\u009au\u000e\u0093\u008d¤åK´\u009am&qѦRé´Òi\u0096¥i¤Õ«\u0014ò5¦\u0093O\"òm4\u009am4\u009bC¦qibÚLô\u0093ÉÆÓ)6\u0092í&[I6\u009ci±ÆÃ\u0096\u0093M¬Ì;0ÜÇ\nÛPæ\u009bI4Úe*ñY*×).\\i6cY¢ÒÍ4ºer\u009bIbÖiÐËY¦³E§\nÍ6ÒO\u0018­rÊV;";
    var o = "";

    foreach( var c in s )
        foreach( var b in Convert.ToString( c, 2 ).PadLeft( 8, '0' ) )
            o += (char) ( 43 + ( 49 - (int) b ) * 2 );

    return o;
};

Повний код

using System;

namespace Namespace {
   class Program {
      static void Main( String[] args ) {
        Func<String> f = () => {
            var s = "i´\u009aM6³E¤òi°ÚÍF\u009bM\"Ói6\u009au\u000e\u0093\u008d¤åK´\u009am&qѦRé´Òi\u0096¥i¤Õ«\u0014ò5¦\u0093O\"òm4\u009am4\u009bC¦qibÚLô\u0093ÉÆÓ)6\u0092í&[I6\u009ci±ÆÃ\u0096\u0093M¬Ì;0ÜÇ\nÛPæ\u009bI4Úe*ñY*×).\\i6cY¢ÒÍ4ºer\u009bIbÖiÐËY¦³E§\nÍ6ÒO\u0018­rÊV;";
            var o = "";

            foreach( var c in s )
                foreach( var b in Convert.ToString( c, 2 ).PadLeft( 8, '0' ) )
                    o += (char) ( 43 + ( 49 - (int) b ) * 2 );

            return o;
        };

        Console.WriteLine( $" Input: <none>\nOutput: {f()}\n" );

        Console.ReadLine();
      }
   }
}

Релізи

  • v1.0 - 385 bytes- Початкове рішення.

Примітки

  • Немає

0

05AB1E , 149 байт

•19GÈRÕŸ
pт6½÷Ü;вVåΔĀÈ₄¤Ü³Aʒм5[¦PŠÅøœ^‚₆賦ìóV“LÛ'ßq;αÎΩªî»(2∍©däf×5 V5Ú”gÜ/\^(Ã∊Ƶ!3šÍ3°(§A΄ǝ₂È₅ç£6óàÖCsa*zƒÚ¥Î\ªD¹,n∊ðˆ.ëçPαǝƒ.É∍¯ü₂³Λ‘g∍Θþ“‚œΔи‹•b

Супер нудно. Просто стиснене число. Використання 1для -і 0для +.

Спробуйте в Інтернеті!



0

Рубін , 245 байт

puts"%b"%"28x0lphxjx8ze4uuhtdzo0oebr25amtmuxm62cbit0ibdwjm2sf50clh2ejq0a73ndseo5tove8uqca6nf66bo4abbkg867woh2b435at0o3pddvqmsqp29b6as5bd4eo28xgwkkj607gp66icba1q4n9fc13dltp45j340mpzbc56wsrbb3oejnczsbzfgh82xdi8aku8m4wlmwuxkgy4yaew7pu4p1g".to_i(36)

Вихід 0 для + і 1 для -.

Спробуйте в Інтернеті!


0

Perl, 164 байти

print unpack'b*','-Y²lÍ¢%O
[³bÙ²DËlY®pɱ%§Ò-Y¶deJ-Ki¥%«Õ(O¬eÉòDO¶,Y¶,ÙÂeF[2/ÉcËlI·dÚl9cÃiɲ53Ü;ãPÛ
gÙ,[¦TTët:lÆEK³,]¦NÙFkÓeÍ¢åP³lKòµNSjÜ'

Hexdump:

00000000: 7072 696e 7420 756e 7061 636b 2762 2a27  print unpack'b*'
00000010: 2c27 962d 59b2 6ccd a225 4f96 0d5b b362  ,'.-Y.l..%O..[.b
00000020: d9b2 44cb 966c 59ae 70c9 b125 a7d2 2d59  ..D..lY.p..%..-Y
00000030: b664 8e8b 654a 972d 4b96 69a5 9625 abd5  .d..eJ.-K.i..%..
00000040: 284f ac65 c9f2 444f b62c 59b6 2cd9 c265  (O.e..DO.,Y.,..e
00000050: 8e96 465b 322f c993 63cb 946c 49b7 64da  ..F[2/..c..lI.d.
00000060: 926c 3996 8d63 c369 c9b2 3533 dc0c 3be3  .l9..c.i..53..;.
00000070: 50db 0a67 d992 2c5b a654 8f9a 54eb 9474  P..g..,[.T..T..t
00000080: 3a96 6cc6 9a45 4bb3 2c5d a64e d992 466b  :.l..EK.,].N..Fk
00000090: 960b d39a 65cd a2e5 50b3 6c4b f218 b54e  ....e...P.lK...N
000000a0: 536a dc27                                Sj.'

Очевидне, нудне рішення: просто покладіть всі біти в двійковий рядок, 8 біт на байт. Використовує 0 для - і 1 для +. Я спробую ще раз пограти в гольф.


0

Сітківка , 333 байт


ADG-RMCGHQFDLEM+-FAG-CADGPAKBBLHBCH-EGHJBORGEH-HB-FJOBPRCA+JAG-A+A+NJHQLIB-R+Q-OQPRAGP-HBEH-CGNCDGEH+BCCHQH-PDJCEGOGECDGCPK-FNH-EDLHCRIEELHDELEKE-HLJDDA+LHFGCFADJJBK+-JDCJBI+JCOOLGEDELMCGNAGKBEJKJEGCNCIF+BLECMMCAKLJDFDGCH+-E-JIQDJJNHD¶
R
GF
Q
+C
P
EA
O
CK
N
D-
M
I-A
L
--
K
D+
J
CB
I
A++
H
E+
G
AB
F
-AD
E
C+
D
B+
C
-B
B
-+
A
-++-+-

Спробуйте в Інтернеті!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.