การเข้ารหัส Zero-One ที่สมดุล


13

งาน

เข้ารหัสสตริงที่ประกอบด้วยตัวอักษรตัวพิมพ์ใหญ่ทั้งหมด ( A-Z) โดยใช้ศูนย์และคนโดยใช้รูปแบบที่คุณชื่นชอบ แต่กฎนั้นไม่ง่ายเลย!

กฎระเบียบ

  1. โปรแกรมของคุณ / ฟังก์ชั่นได้อย่างถูกต้องจะต้องจัดการกับสายป้อนถูกต้องใด ๆ ของความยาว 8
  2. ผลลัพธ์จะต้องมีความยาวเท่ากันสำหรับอินพุตทั้งหมด
  3. ผลลัพธ์จะต้องแตกต่างกันสำหรับอินพุตที่แตกต่างกัน
  4. ผลลัพธ์จะต้องสั้นที่สุด
  5. ผลลัพธ์จะต้องมีศูนย์ที่สมดุลหนึ่งศูนย์ (มีจำนวนที่ใกล้เคียงกับศูนย์) พวกเขาไม่จำเป็นต้องเท่ากัน (เช่นสมดุลอย่างสมบูรณ์) แต่คะแนนของคุณจะถูกลงโทษสำหรับสิ่งนั้น

คุณไม่จำเป็นต้องจัดเตรียมโปรแกรม / ฟังก์ชั่นที่ถอดรหัสการเข้ารหัสของคุณ

อินพุตและเอาต์พุต

  • คุณสามารถตัดสินใจที่จะยอมรับชุดของ 26 ที่แตกต่างใด ๆตัวอักขระ ASCIIA-Zแทน
  • คุณสามารถตัดสินใจที่จะส่งออกคู่ที่แตกต่างใด ๆตัวอักขระ ASCIIแทนและ01
  • คุณไม่ได้รับอนุญาตให้ส่งออกจำนวนเต็มแทนที่จะเป็นบิตสตริงเนื่องจากมันอาจมีศูนย์นำหน้าและไม่มีความชัดเจนหากคุณปฏิบัติตามกฎ 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 ในแต่ละเอาต์พุตตามลำดับ
    • การส่งของคุณจะต้องแสดงตัวอย่างกรณีที่เลวร้ายที่สุด (อินพุต / เอาต์พุต) หรือคำอธิบายทางทฤษฎีเกี่ยวกับค่าปรับ
  • คะแนนต่ำสุดชนะ

ส่งตัวอย่าง

esolang สมมุติฐาน, 0 ไบต์, คะแนน 74733.8906

นี่คือ esolang สมมุติโดยที่โปรแกรมเปล่าพิมพ์รหัส ASCII ทั้งหมดของอักขระอินพุตในไบนารี

 

ตัวอย่างเช่นถ้าคุณให้AAAAAAAAเป็น input โปรแกรมจะพิมพ์1000001ครั้งที่ 8 10000011000001100000110000011000001100000110000011000001ในแถวคือ

CEFGIJKLMNQRSTUVXYZabcdefhตัวอักษรอินพุตรับเลือกให้เป็น ด้วยวิธีนี้ตัวอักษรทั้งหมดจะถูกแปลงเป็นเลขเจ็ดหลักในไบนารีและจำนวนศูนย์หนึ่งแตกต่างกันเพียงหนึ่งต่อถ่าน (พวกเขาทั้งหมดมีสาม 1 และสี่ 0 หรือในทางกลับกันเมื่อแปลงเป็นไบนารี)

ความยาวของเอาต์พุตอยู่ที่ 56 และความไม่สมดุลของกรณีที่เลวร้ายที่สุดเกิดขึ้นกับอินพุตเช่นCCCCCCCCซึ่งค่าศูนย์จะปรากฏขึ้น 8 ครั้งมากกว่าที่เป็นอยู่

1.5 ** (56 - 42) * 2 ** 8 == 74733.8906ดังนั้นคะแนนของการส่งนี้



ฉันสามารถใช้ esolang สมมุติของฉันซึ่งโปรแกรมเปล่ายอมรับหมายเลข N ในการเข้ารหัสตัวอักษร 26-ary และส่งออกลำดับ 42 บิตแบบ N-th ที่เป็นไปได้ของ N 21
ngn

@ngn - ภาษาสมมุติของคุณตรงตามเกณฑ์ที่เรายอมรับหรือไม่ - แก้ไขอาป้อนข้อมูลอยู่เสมอ [AZ] - ฉันเดาว่าง่ายพอ ... :)
Jonathan Allan

1
เราสามารถส่งออกรายการของคนและศูนย์หรือมันจะต้องเป็นสตริง?
Dennis

1
คำถามทั้งหมดนั้นนำไปสู่ ​​"ต้องไม่มีความไม่สมดุลต้องเป็นตัวเลข 42 หลักซึ่งเป็นผู้ดูแลเวลาทำงานจริง"
l4m2

คำตอบ:


4

Stax , 11 ไบต์, 0 โทษ, คะแนน 11

โปรแกรมนี้ใช้[0-9A-P]สำหรับอินพุตและ[01]เอาต์พุต

ö■▄←·ï↨≡⌐╠H

เรียกใช้และแก้ไขข้อบกพร่องแบบออนไลน์ - คลิกปุ่มเรียกใช้เพื่อเริ่ม เคสทดสอบสี่ชุดแรกทำงานเป็นมิลลิวินาที ที่ห้าในไม่กี่วินาที ที่หกในพันปี

การแสดง ascii ที่สอดคล้องกันของโปรแกรมนี้คือสิ่งนี้

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

ฉันจะเป็นอย่างไร
ผลไม้แยกแยะ

@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 0วินาทีและ 5 1วินาที

ขั้นตอนวิธีการแปลงแรกA-Zเข้า0-25และรักษามันเป็นจำนวนฐาน-26 56*252**4แล้วเพิ่ม

จากนั้นตัวเลขจะถูกแปลงเป็นตัวเลข 5 หลัก -252 และแทนที่ด้วยการเปลี่ยนแปลงที่สอดคล้องกันของ 5 0วินาทีและ 5 1วินาที

หลังจากนั้นลบ 2 01บิตแรกซึ่งรับประกันได้ว่าจะ จากนั้นเราเข้ารหัสสตริงเป็นสตริง 48 บิตซึ่งประกอบด้วย 24 0s และ 24 1s


ค่อนข้างแน่ใจว่าการลงโทษจะต้องมีการคูณ (นั่นคือคะแนนของคุณคือ7346.953125)
HyperNeutrino

@HyperNeutrino โอ้ฉันถึงแม้ว่ามันจะเพิ่ม; P แก้ไข
Shieru Asakoto

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 ชุดดังนั้นคุณจะต้องใช้ RAM จำนวนมากเพื่อที่จะเรียกใช้ ...

ลองออนไลน์! (ทดสอบได้; ความยาวอินพุต 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("")

เนื่องจากวิธีการอื่นดูค่อนข้างไม่มีประสิทธิภาพฉันจึงพยายามทำให้ได้เวลาที่เหมาะสมที่สุด มันคือ Clealy O (N) ในการเข้ารหัส N บิตซึ่งดีที่สุดสำหรับ O

คำแนะนำ: ลองคิดถึงสามเหลี่ยมของ Pascal สำหรับอันนี้ ( แผนภาพนี้แสดงให้เห็น)

ตัวอย่างผลลัพธ์:

Input:  AAAAAAAA
Output: 000000000000000000000111111111111111111111

 

Input:  ZZZZZZZZ
Output: 011001000000011010011000111010110110111110

เวลาดำเนินการ: <0.013 วินาที (ค่าคงที่ประมาณสำหรับอินพุตทั้งหมด)



@Bubler Incredible ฉันไม่ได้มีทักษะในการทำสิ่งนี้
Real

แต่คุณควรใช้ความพยายามเพื่อลดคะแนนของคุณ การส่งทั้งหมดควรใช้ความพยายามอย่างจริงจังเพื่อเพิ่มประสิทธิภาพของคะแนนมิฉะนั้นจะไม่ถูกต้อง
user202729

@ user202729 ฉันได้แก้ไขเป็น Bubbler แล้วซึ่งย่อเล็กสุด ฉันพยายามอย่างเต็มที่เพื่อลดคะแนนของฉันแม้ว่าจะไม่ผ่านขนาดโค้ด
จริง

เกี่ยวกับจุดหลัง ... ถูกต้อง
user202729

2

Perl 5 , 55 ไบต์, สูงสุดต่าง 0, ความยาว 42, คะแนน56 55

ใช้งานได้ แต่จะใช้เวลานาน แต่สามารถทำได้ ( ZZZZZZZZใช้เวลา 2.5 วันในคอมพิวเตอร์ของฉัน) หน่วยความจำไม่มีปัญหา

ใช้A-Zเป็นอินพุตและ1และสำหรับการAเข้ารหัสอักขระ พวกเขามีความสมดุลอย่างสมบูรณ์แบบเสมอ Skips แรก26^7 = 8031810176รวมกันเป็นตัวแทนของความสมดุลสตริงสั้นกว่า 8 ตัวอักษร แต่ที่ตกลงมาตั้งแต่มี538257874440อยู่และผมใช้และ208827064575208827064575 + 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กรณี วิ่งผ่านการแทนเลขฐานสองแต่ละตัวของตัวนับจนกว่าจะถึงเลขฐานสอง (ฐาน 26 การแทนค่าอินพุต) ด้วย 21 1วินาที หากคุณต้องการที่จะทดสอบโปรแกรมค่อนข้างคุณสามารถแทนที่ab+ในบรรทัดที่สาม1ซึ่งจะกลับเลขฐานสองที่ n ที่มีเพียงหนึ่งเดียว1, ลองออนไลน์!


1

Python 3 , 75 ไบต์, ส่วนต่างสูงสุด 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 ที่ต้องการ unprintables ได้ลองแล้ว
HyperNeutrino

Unprintables? มันใช้[0-9A-P]ใช่มั้ย บนเครื่องของฉันint("123ABC",26) == 12855114
เรียกซ้ำ

@ recursive โอ้ใช่คุณพูดถูก IDK สิ่งที่ฉันคิดฮ่า ๆ ขอบคุณ!
HyperNeutrino

1

C ++, 146 Bytes, 42 maxlength, 0 unbalance, 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>
user202729

ฉันจะเปลี่ยนเมื่อ GCC ตัดสินใจหยุดใช้ตัวชี้ที่กำหนดเป็นเอาต์พุต
l4m2

... นั่นคือตัวชี้ไปยังเอาต์พุตหรือไม่ ดูแล้วถูกต้องแล้ว แต่คุณควรพูดถึงรูปแบบอินพุต / เอาต์พุตอย่างชัดเจน
user202729
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.