Збалансоване кодування нуля-одного


12

Завдання

Кодуйте рядок, який повністю складається з великих алфавітів ( A-Z), використовуючи лише нулі та ті, використовуючи власну улюблену схему. Але правило не таке просте!

Правила

  1. Ваша програма / функція повинна правильно обробляти будь-який дійсний рядок вводу довжиною 8 .
  2. Результати повинні мати однакову довжину для всіх входів.
  3. Результати повинні бути чіткими для різних вхідних даних.
  4. Результати повинні бути максимально короткими.
  5. Результати повинні бути врівноважені нулем один (мати кількість подібних до нулів). Вони не повинні бути рівними (тобто ідеально збалансованими), але ваш рахунок буде за це накладений штраф.

Вам не потрібно надавати програму / функцію, яка декодує ваше кодування.

Вхід і вихід

  • Ви можете прийняти будь-який набір з 26 різних символів для друку ASCII замість A-Z.
  • Ви можете вирішити вивести будь-яку пару різних символів ASCII для друку замість 0та 1.
  • Вам не дозволяється виводити ціле число замість бітового рядка, оскільки воно може мати провідні нулі і незрозуміло, чи дійсно ви виконали правило 2.
  • Якщо ви вирішили відхилитися від типових ( A-Zвведення та 01виведення), вам слід вказати набори символів введення / виводу у вашому поданні.

Оцінка балів

  • Базова оцінка: розмір коду або 1, якщо ваша програма порожня.
  • Штрафні санкції
    • Штраф на довжину: помножити 1.5 ** (encoded length - 42)
    • Не існує бонусу за коротший термін; 42 - мінімальна довжина для ідеально збалансованого кодування 8-довжинних рядків з розміром 26 алфавіту.
    • Штраф за незбалансованість: помножити 2 ** max(abs(ones - zeros) for every valid input of length 8), де onesі zerosє рахунки 1 і 0 на кожному виході відповідно.
    • У вашій заяві має бути показаний найгірший приклад (введення / виведення) або теоретичне пояснення значення штрафу.
  • Виграє найнижчий бал.

Приклад подання

Гіпотетичний езоланг, 0 байт, оцінка 74733.8906

Ось гіпотетичний езоланг, де порожня програма виводить усі ASCII коди вхідних символів у двійковій формі.

 

Наприклад, якщо ви подаєте AAAAAAAAв якості введення, програма буде друкувати 10000018 разів поспіль, тобто 10000011000001100000110000011000001100000110000011000001.

Введений алфавіт вибрано таким, щоб бути CEFGIJKLMNQRSTUVXYZabcdefh. Таким чином, всі знаки перетворюються на сім цифр у двійковій формі, а значення нуля-один відрізняються лише одиницею на char (усі вони мають три 1-х і чотири 0-ти або навпаки при перетворенні на двійкові).

Довжина виходу завжди 56, і найгірший дисбаланс виникає на входах CCCCCCCC, де нулі з’являються в 8 разів більше, ніж одиниці.

Тому оцінка цього подання є 1.5 ** (56 - 42) * 2 ** 8 == 74733.8906.



чи можу я використовувати свій гіпотетичний езоланг, в якому порожня програма приймає число N у кодованому буквою 26-арі та виводить N-ту можливу 42-бітну послідовність суми 21?
ngn

@ngn - чи відповідає ваша гіпотетична мова нашим прийнятим критеріям ? - EDIT ах завжди є [AZ] - Я думаю, що це досить просто ... :)
Джонатан Аллан

1
Чи можемо ми вивести список одиниць і нулів або це повинен бути рядок?
Денніс

1
Ціле запитання ведеться до того, що "не повинно мати незбалансованість, повинно бути 42 цифри, яким
важливий

Відповіді:


4

Стакс , 11 байт, 0 пенальті, оцінка 11

Ця програма використовується [0-9A-P]для введення та [01]виводу.

ö■▄←·ï↨≡⌐╠H

Запустіть і налагоджуйте його в Інтернеті - натисніть кнопку запустити, щоб почати. Перші чотири тестові справи працюють в мілісекундах. П'ятий за секунди. Шостий за тисячоліття.

Відповідне представлення цієї програми є таким.

A$21*,26|bD|N

Він сильно спирається на |Nінструкцію, яка отримує наступну перестановку масиву.

A$21*           "10" repeated 21 times
     ,26|b      get input and decode it as a base 26 number
          D|N    ... that many times get the next lexicographic permutation

Всі виходи - перестановки початкового рядка. Він має 21 нуль і 21. Тому всі виходи мають 42 символи та ідеально врівноважені.


3

Желе , 19 байт

O_65ḅ26ị2Ḷ¤x21¤Œ!Q¤

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

Пояснення

O_65ḅ26ị2Ḷ¤x21¤Œ!Q¤  Main Link
O                    Take the character code of each character
 _65                 Subtract 65 (the code of "A")
    ḅ26              Convert to base 26
       ị             Get the <left-arg>th element of:
        2Ḷ¤x21¤Œ!Q¤  All balanced strings of length 42:
        2Ḷ           range(2) == [0, 1]
           x21       stretch 21 ([0, 0, ..., 0, 1, 1, ..., 1])
               Œ!    all permutations
                 Q   deduplicate

E x p l a n a t i o n?
Esolanging Fruit

@EsolangingFruit додано
HyperNeutrino

3

Pyth, 20 19 14 байт, Макс. Різниця: 0, Довжина: 64, Оцінка: 149636.5528 142154.7251 104745.5869

sm@S.{.p*`T4xG

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

Використовується алфавіт нижнього регістру ( [a-z]) замість великих букв . Можна використовувати великі регістри, замінившиG на rG1, за вартістю 2 байти.

Я міг би перекласти відповідь Python 3 HyperNeutrino для кращої оцінки, але, чесно кажучи, я хочу відповідь, яка насправді працює.


2

Python 2 , 779 645 байт, Макс (різниця) = 0, довжина = 48, оцінка = 7346,95

def f(s):
 a,b=0,""
 for i in s:a=a*26+ord(i)-65
 a+=56*252**4
 for i in range(5):b=bin((int("4lnk28t9vtqgfrpfda9uyfrjhcjwjvno6aec2nwegi0g4mnublc05dher8fjm4s5gh55lu87a4itmc74t6tozcsfdbxkg82frwljy0wam1jht98g2j0bma021v5d48pwq0fklv0n1ltrxft1fpk5gt5mx5fj4p2mjqqpvcylt1xayxf1iwdmyoxgfvl7oui1oo6147bm9rqpqut9ns8hhjc77t3pqy48otovrsm1t4mmleumspkuef66ma1vi0l4mtkwaeeizuvvds9fro3vhc0mrn6ox17rdpk7xw747qf28934u5jci5q1qj81i7dyf7rf0x7hb19xm93xhxsgh4w8ifs6fhynsddbo9j938ewfvhjlbpiz50n5hanmno6c89blyx50e89z7vjq2ho2r2u2wwyu4q18kv4fi1nhmfbgjbnkdayr5kblaped4fo5u97bi9a67d89irxa0r9cinmnohfgjmh5fhkcr33",36)>>a%252*10)&1023)[2:].rjust(10,"0")+b;a/=252
 return b[2:]

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

Магічне число 4lnk28t9vtqgfrpfda9uyfrjhcjwjvno6aec2nwegi0g4mnublc05dher8fjm4s5gh55lu87a4itmc74t6tozcsfdbxkg82frwljy0wam1jht98g2j0bma021v5d48pwq0fklv0n1ltrxft1fpk5gt5mx5fj4p2mjqqpvcylt1xayxf1iwdmyoxgfvl7oui1oo6147bm9rqpqut9ns8hhjc77t3pqy48otovrsm1t4mmleumspkuef66ma1vi0l4mtkwaeeizuvvds9fro3vhc0mrn6ox17rdpk7xw747qf28934u5jci5q1qj81i7dyf7rf0x7hb19xm93xhxsgh4w8ifs6fhynsddbo9j938ewfvhjlbpiz50n5hanmno6c89blyx50e89z7vjq2ho2r2u2wwyu4q18kv4fi1nhmfbgjbnkdayr5kblaped4fo5u97bi9a67d89irxa0r9cinmnohfgjmh5fhkcr33(в основі 36) або його десятковий еквівалент 382136276621246556626597379364678993894472503063952720559883124988542417847157286833446006767955087631166943136913765901237281892296575754126024183763829277879554548743231384272055945084065681774297483130020386641869860456147616177702938121538230311395513497506285733567467605871232294046704309941152721616618474501854355102646152223338484615876165254236449912858255665248186687952137487016925761633237335983620006273901509768720506129789443353730706676483647298576692613113269388239830925662977837917272690235355742330377154505179476767457756888107428475384947712227312747517748632498691058764154580934614231152483398774630508576533263098942260213967880819240793990219283490212843120923539516962682466148372296338428497778127570401190309339992457562121354271кодує всі 252 перестановки 5 0s і 51 с.

Алгоритм спочатку перетворює A-Zв 0-25і трактує його як число-26, а потім додає56*252**4 .

Потім число перетворюється на 5-значне число бази-252 і підміняється відповідною перестановкою 5 0с і 5 1с.

Після цього видаліть перші 2 біти, які гарантовано є 01. Тоді ми зашифрували рядок до 48-бітної рядки, яка складається рівно з 24 0с і 24 1с.


Досить впевнений, що штрафні санкції потрібно помножити (тобто ваш рахунок 7346.953125).
HyperNeutrino

@HyperNeutrino О, я хоч це доповнення; P Редаговано
Шиеру Асакото

2

JavaScript (ES8), оцінка 22186.623779296875

f=
s=>s.replace(/./g,(c,i)=>(i%2*127^c.charCodeAt()).toString(2).padStart(7,0))
<input oninput=o.textContent=f(this.value)><pre id=o>

За введення рівномірної довжини завжди виводиться 3,5 * нулів і одиниць, тому він сплачує лише 1,5 ** 14 штрафу. Підтримувані символи: '+-.3569:<GKMNSUVYZ\cefijlqrtx.


2

Желе , 16 байт

42ɠO%ḅ26ịœcH$ạ‘Ṭ

Використання +,-./0123456789:;<=>?@ABCD для введення та повертає список одиниць та нулів.

Це намагається скласти список з 538,257,874,440 комбінацій у пам'яті, тому вам знадобиться велика кількість оперативної пам’яті, щоб запустити її як зараз ...

Спробуйте в Інтернеті!(перевіряється; довжина входу 3, довжина виходу 18)

Як це працює

42ɠO%ḅ26ịœcH$ạ‘Ṭ  Main link. No arguments.

42                Set the argument and the return value to 42.
  ɠ               Read one line from STDIN.
   O              Ordinal; map ['+', ..., 'D'] to [43, ..., 69].
    %             Take the code points modulo 42, mapping [43, ..., 69] to
                  [1, ..., 26].
     ḅ26          Convert the result from base 26 to integer.
            $     Combine the two links to the left into a monadic chain.
           H          Halve; yield 21.
         œc           Generate all 21-combinations of [1, ..., 42].
                  There are 538,257,874,440 of these combinations. The first
                  269,128,937,220 begin with a 1.
        ị         Retrieve the combination at the index to the left.
                  [26, 26, 26, 26, 26, 26, 26, 26] in bijective base 26 equals
                  217,180,147,158 in decimal, so the retrieved combination will
                  begin with a 1.
              ‘   Increment; yield 43.
             ạ    Absolute difference; map [1, ..., 42] to [42, ..., 1].
                  The combination now begins with a 42.
               Ṭ  Untruth; turn the combination into a Boolean list, with 1's
                  at the specified indices and 0's elsewhere.
                  Since the maximum of the combination is 42, this list will have
                  exactly 42 items, 21 of which will be 1's.

2

Python 3 , 985 135 байт, Max Diff 0, довжина 42, оцінка 135

lambda s:C(int(s,26),21,20)
B=lambda x,y:y<1or-~x*B(x+1,y-1)//y
def C(n,o,z):p=B(o,z);x=n>=p;return z+1and[x]+C(n-p*x,o-x,z-1+x)or[1]*o

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

Люб’язність Bubbler

Невикористаний код:

import math

def binomial(x, y):
    return math.factorial(x) // math.factorial(y) // math.factorial(x - y)

def string_to_int(input_str):
    result = 0
    for i in range(0,8):
        result += (ord(input_str[i])-65)%26 * pow(26,i)
    return result

def counting_function(target, ones, zeros):
    if zeros > 0:
        position = binomial(ones+zeros-1,zeros-1)
    else:
        position = 1
    if target > position:
        if ones > 0:
            print("1", end='')
            ones -= 1
            counting_function(target-position,ones,zeros)
    else:
        if zeros > 0:
            print("0", end='')
            zeros -= 1
            counting_function(target,ones,zeros)
        elif ones > 0:
            print("1", end='')
            ones -= 1
            counting_function(target,ones,zeros)

input_str = input("Input string (A-Z): ")
input_int = string_to_int(input_str)+1
target = input_int
ones = 21
zeros = 21
counting_function(target, ones, zeros)
print("")

Оскільки інші підходи здаються досить неефективними, я спробував зробити оптимальний час. Це чітко O (N) в N бітах кодування, що є оптимальним для великих.

Підказка: спробуйте придумати трикутник Паскаля для цього ( ця діаграма виявляє це)

Приклади виходів:

Input:  AAAAAAAA
Output: 000000000000000000000111111111111111111111

 

Input:  ZZZZZZZZ
Output: 011001000000011010011000111010110110111110

Час виконання: <0,013 с (приблизно постійний для всіх входів)



@Bubbler Неймовірно, я не володів навичками для досягнення цього
Реал

Але вам слід докласти певних зусиль, щоб мінімізувати свій рахунок. Усі матеріали повинні докласти серйозних зусиль для оптимізації оцінки, інакше вона недійсна.
користувач202729

@ user202729 Тоді я змінив версію Bubbler, яка зведена до мінімуму. Я доклав максимум зусиль, щоб мінімізувати свою оцінку, але тільки не через розмір коду.
Реальний

Про останній пункт ... правильно.
користувач202729

2

Perl 5 , 55 байт, макс. Різниця 0, довжина 42, оцінка 56 55

Це працює, але займе довгий, але виконаний час (ZZZZZZZZ на моєму комп’ютері зайняло 2,5 дня). Пам'ять - це не проблема.

Використовується A-Zяк вхідні дані 1і Aяк кодування символів. Вони завжди ідеально врівноважені. Пропускає перші 26^7 = 8031810176збалансовані комбінації, що представляють собою рядки, коротші за 8 символів, але це нормально, оскільки є 538257874440доступні, і я використовую 208827064575і208827064575 + 8031810176 < 538257874440 .

Однак насправді "рахується" до цільової комбінації, яка займе дуже багато часу. Ось чому в посиланні TIO я використовував лише занадто короткий рядок введення (які також підтримуються), щоб продемонструвати, що вихідний результат правильний. Буде працювати трохи більше, ніж AAAAAAраніше, ніж TIO. ZZZZZZZZповинно бути приблизно в 26^3 = 17576рази повільніше.

#!/usr/bin/perl -ap
$_=1x21 .($i=A)x21;s/(A*)(1*)1A/$2$1A1/ until"@F"eq$i++

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

Дешифратор майже однаковий:

#!/usr/bin/perl -ap
$_=1x21 .($\=A)x21;s/(A*)(1*)1A/$2$1A1/,$\++until"@F"eq$_}{

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


1

> <> , 75 байт, Макс. Різниця 0, Довжина 42, оцінка 75

0i:0(?v'A'-$dd+*+!
.")1+.\1+:0$:2%:}:@-2,@+$bl"
[ab+-?\$:?vv~3
~~]>n<v$-1<>

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

Справедливе попередження, це займе дуже- дуже багато часу, щоб завершити навіть тривіальну AAAAAAAAсправу. Проходить через кожне двійкове представлення лічильника, поки не буде досягнуто (базове представлення входу) 'бінарного числа з 21 1с. Якщо ви хочете дещо перевірити програму, ви можете замінити ab+третій рядок, 1який поверне n-й двійковий номер лише одним 1, спробуйте в Інтернеті!


1

Python 3 , 75 байт, Max Diff 0, Довжина 42, Оцінка 112

lambda s:sorted({*permutations("01"*21)})[int(s,26)]
from itertools import*

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

Це працює лише в теорії через обмеження пам'яті. Існують 538257874440чіткі врівноважені нульові рядки довжиною 42 та 208827064575можливі входи, тому деякі можливі виходи не використовуватимуться.

-37 байт завдяки @recursive


Ви можете використовувати int(s,26)для значення свого індексу замість того, sum(...)щоб змінити набір символів.
рекурсивна

@recursive, які потребують недрукованих друкованих видань. спробував це вже
HyperNeutrino

Недруковані? Він використовує [0-9A-P], чи не так? На моїй машині,int("123ABC",26) == 12855114
рекурсивна

@ рекурсивний о, так, ти маєш рацію, що я думав, хаха. Дякую!
HyperNeutrino

1

C ++, 146 байт, 42 максимальна довжина, 0 незбалансованість, оцінка 146

#include<algorithm>
long long i,s;int f(char*I,char*O){for(O[i=42]=s=0;i--;i<8?s=s*26+I[i]:0)O[i]=i%2|48;for(;s--;)std::next_permutation(O,O+42);}

Працює для будь-яких безперервних 26 знаків, але попередження проходить неприйнятно


Виглядає так, що вам потрібно додатково передавати порожній масив. Я не думаю, що це справедливо. / Якщо ви використовуєте GCC ви можете замінити #include<algorithm>з #import<regex>.
користувач202729

Я зміню це, коли GCC вирішить припинити використовувати заданий покажчик як вихід
l4m2

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