Pengodean Nol-Satu Seimbang

12

Tugas

Encode string yang seluruhnya terdiri dari huruf besar ( A-Z) hanya menggunakan nol dan yang, menggunakan skema favorit Anda sendiri. Tapi aturannya tidak sesederhana itu!

Aturan

  1. Program / fungsi Anda harus menangani dengan benar setiap string input dengan panjang 8 .
  2. Hasilnya harus memiliki panjang yang sama untuk semua input.
  3. Hasilnya harus berbeda untuk input yang berbeda.
  4. Hasilnya harus sesingkat mungkin.
  5. Hasilnya harus nol-satu seimbang (memiliki jumlah yang mirip dengan nol). Mereka tidak harus sama (yaitu seimbang sempurna), tetapi skor Anda akan dikenakan sanksi untuk itu.

Anda tidak harus menyediakan program / fungsi yang menerjemahkan sandi Anda.

Masukan dan keluaran

  • Anda dapat memutuskan untuk menerima serangkaian 26 karakter ASCII yang dapat dicetak dan bukan A-Z.
  • Anda dapat memutuskan untuk mengeluarkan pasangan karakter ASCII yang dapat dicetak dan bukan 0dan 1.
  • Anda tidak diizinkan untuk mengeluarkan bilangan bulat alih-alih string bit, karena mungkin memiliki nol di depan dan tidak jelas apakah Anda benar-benar memenuhi aturan 2.
  • Jika Anda memutuskan untuk menyimpang dari default ( A-Zinput dan 01output), Anda harus menentukan set karakter input / output dalam kiriman Anda.

Mencetak gol

  • Skor dasar: Ukuran kode, atau 1 jika program Anda kosong.
  • Hukuman
    • Hukuman panjang: dikalikan 1.5 ** (encoded length - 42)
    • Tidak ada bonus untuk menjadi lebih pendek; 42 adalah panjang minimal untuk penyandian string 8-panjang yang seimbang dengan ukuran alfabet 26.
    • Hukuman karena tidak seimbang: gandakan 2 ** max(abs(ones - zeros) for every valid input of length 8), di mana onesdan zerosadalah jumlah 1 dan 0 dalam setiap output, masing-masing.
    • Kiriman Anda harus menunjukkan contoh kasus terburuk (input / output) atau penjelasan teoritis tentang nilai penalti.
  • Skor terendah menang.

Contoh Pengiriman

Hipotesis esolang, 0 Bytes, Skor 74733.8906

Berikut ini adalah esolang hipotetis, di mana program kosong mencetak semua kode ASCII karakter input dalam biner.

 

Misalnya, jika Anda memberikan AAAAAAAAinput, program akan mencetak 10000018 kali berturut-turut, yaitu 10000011000001100000110000011000001100000110000011000001.

Input alfabet dipilih menjadi CEFGIJKLMNQRSTUVXYZabcdefh. Dengan cara ini, semua karakter dikonversikan ke tujuh digit dalam biner, dan jumlah nol-satu berbeda hanya dengan satu per karakter (mereka semua memiliki tiga 1 dan empat 0 atau sebaliknya ketika dikonversi ke biner).

Panjang output selalu 56, dan ketidakseimbangan kasus terburuk terjadi pada input seperti CCCCCCCC, di mana nol muncul 8 kali lebih banyak daripada yang.

Oleh karena itu, skor pengajuan ini adalah 1.5 ** (56 - 42) * 2 ** 8 == 74733.8906.

Bubbler
sumber
dapatkah saya menggunakan esolang hipotetis saya di mana program kosong menerima angka N dalam 26-ar-kode-huruf dan menghasilkan urutan ke-42 42-bit dari jumlah 21?
ngn
@ ngn - apakah bahasa hipotetis Anda memenuhi kriteria yang kami terima ? - Masukan ah EDIT selalu [AZ] - Saya kira itu cukup mudah ... :)
Jonathan Allan
1
Bisakah kita menampilkan daftar yang dan nol atau harus berupa string?
Dennis
1
Seluruh pertanyaan mengarah ke "tidak harus memiliki ketidakseimbangan, harus dalam 42 digit, yang peduli waktu berjalan nyata"
14m2

Jawaban:

4

Stax , 11 byte, 0 penalti, Skor 11

Program ini digunakan [0-9A-P]untuk input dan [01]untuk output.

ö■▄←·ï↨≡⌐╠H

Jalankan dan debug secara online - klik tombol run untuk memulai. Empat kasus uji pertama berjalan dalam milidetik. Kelima dalam hitungan detik. Keenam dalam milenia.

Representasi ascii yang sesuai dari program ini adalah ini.

A$21*,26|bD|N

Ini sangat bergantung pada |Ninstruksi, yang mendapatkan permutasi array selanjutnya.

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

Semua output adalah permutasi dari string awal. Ini memiliki 21 nol dan 21 yang. Karena itu, semua output adalah 42 karakter, dan sangat seimbang.

rekursif
sumber
3

Jelly , 19 byte

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

Cobalah online!

Penjelasan

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
HyperNeutrino
sumber
E x p l a n a t i o n?
Buah Esolanging
@EsolangingFruit menambahkan
HyperNeutrino
3

Pyth, 20 19 14 byte, Max Diff: 0, Panjang: 64, Nilai: 149636.5528 142154.7251 104745.5869

sm@S.{.p*`T4xG

Cobalah online!

Menggunakan huruf kecil ( [a-z]) bukan huruf besar. Dapat menggunakan huruf besar dengan mengganti Gdengan rG1, dengan biaya 2 byte.

Saya bisa menerjemahkan jawaban Python 3 HyperNeutrino untuk skor yang lebih baik, tetapi terus terang, saya ingin jawaban yang benar-benar berfungsi.

hakr14
sumber
2

Python 2 , 779 645 byte, Max (Diff) = 0, Panjang = 48, Nilai = 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:]

Cobalah online!

Angka ajaib 4lnk28t9vtqgfrpfda9uyfrjhcjwjvno6aec2nwegi0g4mnublc05dher8fjm4s5gh55lu87a4itmc74t6tozcsfdbxkg82frwljy0wam1jht98g2j0bma021v5d48pwq0fklv0n1ltrxft1fpk5gt5mx5fj4p2mjqqpvcylt1xayxf1iwdmyoxgfvl7oui1oo6147bm9rqpqut9ns8hhjc77t3pqy48otovrsm1t4mmleumspkuef66ma1vi0l4mtkwaeeizuvvds9fro3vhc0mrn6ox17rdpk7xw747qf28934u5jci5q1qj81i7dyf7rf0x7hb19xm93xhxsgh4w8ifs6fhynsddbo9j938ewfvhjlbpiz50n5hanmno6c89blyx50e89z7vjq2ho2r2u2wwyu4q18kv4fi1nhmfbgjbnkdayr5kblaped4fo5u97bi9a67d89irxa0r9cinmnohfgjmh5fhkcr33(dalam basis 36), atau setara desimalnya 382136276621246556626597379364678993894472503063952720559883124988542417847157286833446006767955087631166943136913765901237281892296575754126024183763829277879554548743231384272055945084065681774297483130020386641869860456147616177702938121538230311395513497506285733567467605871232294046704309941152721616618474501854355102646152223338484615876165254236449912858255665248186687952137487016925761633237335983620006273901509768720506129789443353730706676483647298576692613113269388239830925662977837917272690235355742330377154505179476767457756888107428475384947712227312747517748632498691058764154580934614231152483398774630508576533263098942260213967880819240793990219283490212843120923539516962682466148372296338428497778127570401190309339992457562121354271, mengkodekan semua 252 permutasi dari 5 0s dan 5 1s.

Algoritma pertama mengkonversi A-Zmenjadi 0-25dan memperlakukannya sebagai nomor basis-26, kemudian tambahkan 56*252**4.

Kemudian, nomor tersebut dikonversi ke nomor basis-252 5-digit, dan gantikan dengan permutasi yang sesuai dari 5 0s dan 5 1s.

Setelah itu, hapus 2 bit pertama, yang dijamin 01. Kemudian kita telah menyandikan string ke string 48-bit, yang terdiri dari 24 0detik dan 24 1detik.

Shieru Asakoto
sumber
Cukup yakin hukuman harus dikalikan (yaitu, skor Anda 7346.953125).
HyperNeutrino
@HyperNeutrino Oh saya pikir itu tambahan; P Diedit
Shieru Asakoto
2

JavaScript (ES8), skor 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>

Untuk input panjang yang sama, selalu menghasilkan 3,5 * nol dan yang, sehingga hanya membayar penalti 1,5 ** 14. Karakter yang didukung: '+-.3569:<GKMNSUVYZ\cefijlqrtx.

Neil
sumber
2

Jelly , 16 byte

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

Menggunakan +,-./0123456789:;<=>?@ABCDinput dan mengembalikan daftar angka dan angka nol.

Upaya ini untuk membangun daftar 538.257.874.440 kombinasi dalam memori, jadi Anda akan memerlukan sejumlah besar RAM untuk menjalankannya seperti ...

Cobalah online! (dapat diuji; panjang input 3, panjang output 18)

Bagaimana itu bekerja

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.
Dennis
sumber
2

Python 3 , 985 135 byte, Max Diff 0, Panjang 42, skor 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

Cobalah online!

Atas perkenan Bubbler

Kode tidak dikunci:

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("")

Karena pendekatan lain tampaknya tidak efisien, saya sudah mencoba membuat yang optimal waktu. Ini clealy O (N) dalam N bit encoding, yang merupakan O-optimal besar.

Petunjuk: coba pikirkan segitiga Pascal untuk yang satu ini ( diagram ini mengungkapkannya)

Output sampel:

Input:  AAAAAAAA
Output: 000000000000000000000111111111111111111111

 

Input:  ZZZZZZZZ
Output: 011001000000011010011000111010110110111110

Waktu pelaksanaan: <0,013 dtk (kira-kira konstan untuk semua input)

Nyata
sumber
@Bblbler Incredible, saya tidak memiliki keterampilan untuk mencapai ini
Real
Tetapi Anda harus berusaha meminimalkan skor Anda. Semua pengiriman harus melakukan upaya serius untuk mengoptimalkan skor, jika tidak maka tidak valid.
user202729
@ user202729 Saya telah memodifikasi ke versi Bubbler, yang diminimalkan. Saya memang berusaha meminimalkan skor saya, hanya saja tidak melalui ukuran kode.
Nyata
Tentang poin terakhir ... benar.
user202729
2

Perl 5 , 55 byte, maks. Diff 0, panjang 42, skor 56 55

Ini berfungsi tetapi akan memakan waktu lama tapi bisa dilakukan ( ZZZZZZZZbutuh 2,5 hari di komputer saya). Memori tidak masalah.

Digunakan A-Zsebagai input dan 1dan Asebagai karakter penyandian. Mereka selalu seimbang sempurna. Melewati 26^7 = 8031810176kombinasi seimbang pertama yang mewakili string yang lebih pendek dari 8 karakter, tapi tidak apa-apa karena ada 538257874440tersedia dan saya menggunakan 208827064575dan 208827064575 + 8031810176 < 538257874440.

Namun sebenarnya "menghitung" hingga kombinasi target yang akan memakan waktu sangat lama. Itu sebabnya di tautan TIO saya hanya menggunakan string input yang terlalu pendek (yang juga didukung) untuk menunjukkan bahwa output sudah benar. Akan bekerja hingga sedikit lebih banyak daripada AAAAAAsebelum TIO habis. ZZZZZZZZharus sekitar 26^3 = 17576kali lebih lambat.

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

Cobalah online!

Dekoder hampir sama:

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

Cobalah online!

Ton Hospel
sumber
1

> <> , 75 byte, Max Diff 0, Panjang 42, skor 75

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

Cobalah online!

Peringatan yang adil, ini akan memakan waktu yang sangat sangat sangat lama untuk diselesaikan bahkan untuk AAAAAAAAkasus sepele . Berjalan melalui setiap representasi biner dari penghitung sampai (nomor 26 representasi dari input) ke nomor biner dengan 21 1detik tercapai. Jika Anda ingin menguji program ini, Anda dapat mengganti ab+pada baris ketiga dengan 1yang akan mengembalikan nomor biner ke-n dengan hanya satu 1, Coba online!

Jo King
sumber
1

Python 3 , 75 byte, Max Diff 0, Panjang 42, Skor 112

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

Cobalah online!

Ini hanya berfungsi secara teori karena keterbatasan memori. Ada 538257874440nol nol satu string panjang 42 dan 208827064575input yang mungkin seimbang , sehingga beberapa output yang mungkin tidak akan digunakan.

-37 byte berkat @recursive

HyperNeutrino
sumber
Anda dapat menggunakan int(s,26)untuk nilai indeks Anda daripada sum(...)jika Anda mengubah set karakter input Anda.
rekursif
@recursive yang membutuhkan unsintables. sudah
mencobanya
Tidak dapat dicetak? Itu menggunakan [0-9A-P], bukan? Di mesin saya,int("123ABC",26) == 12855114
rekursif
@recursive oh yeah kau benar, idk, apa yang kupikirkan lol. Terima kasih!
HyperNeutrino
1

C ++, 146 Bytes, 42 maxlength, 0 unbalance, skor 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);}

Berfungsi untuk 26 char yang terus-menerus, tetapi peringatan itu menjalankan waktu yang tidak dapat diterima

l4m2
sumber
Sepertinya Anda memerlukan array kosong yang diteruskan sebagai tambahan. Saya pikir itu tidak valid. / Jika Anda menggunakan GCC, Anda dapat menggantinya #include<algorithm>dengan #import<regex>.
user202729
Saya akan mengubahnya ketika GCC memutuskan untuk berhenti menggunakan pointer yang diberikan sebagai output
l4m2
... jadi itu pointer ke output? Terlihat valid kalau begitu. Tetapi Anda harus menyebutkan format input / output secara eksplisit.
user202729