Dengeli Sıfır Bir Kodlama


13

Görev

Tamamen büyük harfli alfabelerden ( A-Z) oluşan bir dizeyi, yalnızca favori şemalarınızı kullanarak sıfır ve bir harf kullanarak kodlayın . Ama kural o kadar basit değil!

kurallar

  1. Programınız / işleviniz, 8 uzunluklu geçerli giriş dizelerini doğru şekilde işlemelidir .
  2. Sonuçlar tüm girdiler için aynı uzunlukta olmalıdır.
  3. Sonuçlar farklı girdiler için farklı olmalıdır.
  4. Sonuçlar mümkün olduğunca kısa olmalıdır.
  5. Sonuçlar sıfır-dengeli olmalıdır (sıfırlara benzer sonuçlara sahip olmalıdır ). Eşit olmak zorunda değiller (yani mükemmel dengelenmiş), ancak puanınız cezalandırılacaktır.

Kodlamanızın kodunu çözen bir program / işlev sağlamanız gerekmez.

Giriş ve çıkış

  • Bunun yerine 26 farklı yazdırılabilir ASCII karakter kümesini kabul etmeye karar verebilirsiniz A-Z.
  • Ve yerine herhangi bir çift basılabilir ASCII karakteri çıkarmaya karar verebilirsiniz .01
  • Sen edilmektedir çıkışına bir tamsayı izin verilmez o baştaki sıfırları olabilir çünkü yerine biraz dizesi ve aslında kural 2 buluştu eğer belirsiz.
  • Varsayılandan ( A-Zgiriş ve 01çıkış) sapmaya karar verirseniz , gönderiminizdeki giriş / çıkış karakter kümelerini belirtmeniz gerekir.

puanlama

  • Temel puan: Kod boyutu veya programınız boşsa 1.
  • cezalar
    • Uzunluk cezası: çarpın 1.5 ** (encoded length - 42)
    • Daha kısa olmanın bir bonusu yoktur; 42, alfabe boyutu 26 olan 8 uzunluklu dizelerin mükemmel dengelenmiş kodlaması için minimum uzunluktur.
    • Dengesizlik cezası: çarpın 2 ** max(abs(ones - zeros) for every valid input of length 8), burada onesve zerosher bir çıktıda sırasıyla 1 ve 0 sayımları vardır.
    • Gönderiniz ya en kötü durum örneğini (giriş / çıkış) ya da ceza değerine ilişkin teorik bir açıklama göstermelidir.
  • En düşük puan kazanır.

Örnek Gönderme

Varsayımsal esolang, 0 Bayt, Puan 74733.8906

Burada, boş bir programın giriş karakterlerinin tüm ASCII kodlarını ikili olarak yazdırdığı varsayımsal bir esolang.

 

Örneğin, AAAAAAAAgirdi olarak verirseniz , program 1000001art arda 8 kez yazdıracaktır 10000011000001100000110000011000001100000110000011000001.

Giriş alfabesi CEFGIJKLMNQRSTUVXYZabcdefh . Bu şekilde, tüm karakterlerin ikili sayıdaki yedi basamağa dönüştürülmesi ve sıfır-sayı sayılarının karakter başına sadece bir tane farklı olması gerekir (hepsinin üç 1 ve dört 0 değeri vardır veya ikiye dönüştürüldüğünde tam tersi).

Çıkış uzunluğu her zaman 56'dır ve en kötü durum dengesizliği CCCCCCCC, sıfırlarınkinden 8 kat daha fazla göründüğü gibi girişlerde meydana gelir .

Bu nedenle, bu sunumun puanı 1.5 ** (56 - 42) * 2 ** 8 == 74733.8906.



boş programın harf kodlu 26-ary'de N sayısını kabul ettiği ve toplam 21'in N-th olası 42-bit dizisini çıkardığı varsayımsal esolang'ımı kullanabilir miyim?
ngn

@ngn - varsayımsal diliniz kabul edilen ölçütlerimizi karşılıyor mu? - EDIT ah girişi her zaman [AZ] - Sanırım bu yeterince kolay ... :)
Jonathan Allan

1
Bunların ve sıfırların bir listesini çıkarabilir miyiz veya bir dize mi olmalı?
Dennis

1
Tüm soru "dengesizlik olmamalı, 42 basamaklı olmalı, gerçek çalışma süresi
önemseyen

Yanıtlar:


4

Stax , 11 bayt, 0 ceza, Puan 11

Bu program [0-9A-P]girdi ve [01]çıktı için kullanır .

ö■▄←·ï↨≡⌐╠H

Çevrimiçi çalıştırın ve hata ayıklayın - başlatmak için çalıştır düğmesine tıklayın. İlk dört test vakası milisaniye cinsinden çalışır. Saniyeler içinde beşinci. Milenyumda altıncı.

Bu programın karşılık gelen ascii temsili budur.

A$21*,26|bD|N

|NBir dizinin sonraki permütasyonunu alan talimatlara büyük ölçüde eğilir .

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

Tüm çıkışlar ilk dizginin permütasyonudur. 21 sıfır ve 21 sıfır vardır. Bu nedenle, tüm çıktılar 42 karakterdir ve mükemmel dengelidir.


3

Jöle , 19 bayt

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

Çevrimiçi deneyin!

açıklama

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 ekledi
HyperNeutrino

3

Pyth, 20 19 14 bayt, Maksimum Fark: 0, Uzunluk: 64, Puan: 149636.5528 142154.7251 104745.5869

sm@S.{.p*`T4xG

Çevrimiçi deneyin!

[a-z]Büyük harf yerine küçük harfli alfabeyi ( ) kullanır. Değiştirerek büyük kullanabilir miyim Gile rG12 byte pahasına.

Daha iyi bir puan için HyperNeutrino'nun Python 3 cevabını tercüme edebilirdim , ama açıkçası, gerçekten işe yarayan bir cevap istiyorum.


2

Piton 2 , 779 645 bayt, azami (Diff) = 0, Uzunluğu = 48, Puanı = 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:]

Çevrimiçi deneyin!

Sihirli sayı 4lnk28t9vtqgfrpfda9uyfrjhcjwjvno6aec2nwegi0g4mnublc05dher8fjm4s5gh55lu87a4itmc74t6tozcsfdbxkg82frwljy0wam1jht98g2j0bma021v5d48pwq0fklv0n1ltrxft1fpk5gt5mx5fj4p2mjqqpvcylt1xayxf1iwdmyoxgfvl7oui1oo6147bm9rqpqut9ns8hhjc77t3pqy48otovrsm1t4mmleumspkuef66ma1vi0l4mtkwaeeizuvvds9fro3vhc0mrn6ox17rdpk7xw747qf28934u5jci5q1qj81i7dyf7rf0x7hb19xm93xhxsgh4w8ifs6fhynsddbo9j938ewfvhjlbpiz50n5hanmno6c89blyx50e89z7vjq2ho2r2u2wwyu4q18kv4fi1nhmfbgjbnkdayr5kblaped4fo5u97bi9a67d89irxa0r9cinmnohfgjmh5fhkcr33(taban 36'da) veya ondalık eşdeğeri 382136276621246556626597379364678993894472503063952720559883124988542417847157286833446006767955087631166943136913765901237281892296575754126024183763829277879554548743231384272055945084065681774297483130020386641869860456147616177702938121538230311395513497506285733567467605871232294046704309941152721616618474501854355102646152223338484615876165254236449912858255665248186687952137487016925761633237335983620006273901509768720506129789443353730706676483647298576692613113269388239830925662977837917272690235355742330377154505179476767457756888107428475384947712227312747517748632498691058764154580934614231152483398774630508576533263098942260213967880819240793990219283490212843120923539516962682466148372296338428497778127570401190309339992457562121354271, 5 0s ve 5 1s'nin 252 permütasyonunun tümünü kodlar .

Algoritma, ilk önce dönüştürür A-Ziçine 0-25eklenir, ardından bir baz-26 numara olarak tedavi 56*252**4.

Daha sonra, sayı 5 basamaklı bir taban-252 numarasına dönüştürülür ve karşılık gelen 5 0s ve 5 1s permütasyon ile değiştirilir .

Bundan sonra, olması garanti edilen ilk 2 biti silin 01. Daha sonra dizeyi tam olarak 24 0s ve 24 1s'den oluşan 48 bit bir dizeye kodladık.


Cezaların çarpılması gerektiğinden oldukça emin (yani puanınız 7346.953125).
HyperNeutrino

@HyperNeutrino Oh Ben buna ek olarak olsa da; P Düzenlendi
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>

Eşit uzunluk girişi için, daima 3.5 * sıfır ve bir çıkış verir, bu nedenle yalnızca 1.5 ** 14 cezasını öder. Desteklenen karakterler: '+-.3569:<GKMNSUVYZ\cefijlqrtx.


2

Jöle , 16 bayt

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

+,-./0123456789:;<=>?@ABCDGirdi için kullanır ve bir ve sıfırların listesini döndürür.

Bu, bellekte 538.257.874.440 kombinasyonunun bir listesini oluşturmaya çalışır, bu nedenle onu çalıştırmak için çok miktarda RAM'e ihtiyacınız olacaktır ...

Çevrimiçi deneyin! (test edilebilir; giriş uzunluğu 3, çıkış uzunluğu 18)

Nasıl çalışır

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 , 985135 bayt, Max Diff 0, Uzunluk 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

Çevrimiçi deneyin!

Bubbler'ın izniyle

Kod çözülmemiş kod:

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

Diğer yaklaşımlar oldukça verimsiz göründüğü için, zaman açısından uygun olanı yapmaya çalıştım. Büyük-O optimal olan kodlamanın N bitlerinde açıkça O (N) 'dir.

İpucu: Pascal'ın üçgeni bunun için düşünmeye çalışın ( bu diyagram bunu ortaya koymaktadır)

Örnek çıktılar:

Input:  AAAAAAAA
Output: 000000000000000000000111111111111111111111

 

Input:  ZZZZZZZZ
Output: 011001000000011010011000111010110110111110

Yürütme süresi: <0,013 s (tüm girişler için kabaca sabit)



@Bubbler İnanılmaz, bunu başarmak için becerilere sahip değildim
Real

Ancak puanınızı en aza indirmek için biraz çaba sarf etmelisiniz. Tüm başvurular puanı optimize etmek için ciddi bir çaba göstermelidir, aksi takdirde geçersizdir.
user202729

@ user202729 Bubbler'ın sürümüne değiştirdim, o da minimize edildi. Ben sadece kod boyutu aracılığıyla değil, olsa, benim puan en aza indirmek için bir çaba.
Gerçek

İkinci nokta hakkında ... doğru.
user202729

2

Perl 5 , 55 bayt, maksimum fark 0, uzunluk 42, puan 56 55

Bu işe yarıyor ama uzun ama yapılabilir bir zaman alacak ( ZZZZZZZZbilgisayarımda 2,5 gün sürdü). Bellek sorun değil.

Kullanımları A-Zgiriş ve olarak 1ve Akodlama karakterleri olarak. Her zaman mükemmel dengelidirler. 26^7 = 80318101768 karakterden daha kısa dizeyi temsil eden ilk dengeli kombinasyonları atlar , ancak 538257874440kullanılabilir ve kullandığımdan beri sorun yok208827064575 ve 208827064575 + 8031810176 < 538257874440.

Ancak, aslında çok uzun sürecek olan hedef kombinasyonuna kadar "sayar". Bu yüzden TIO bağlantısında, çıkışın doğru olduğunu göstermek için sadece çok kısa bir giriş dizesi kullandım (bunlar da destekleniyor). AAAAAATIO zaman aşımına uğramadan biraz daha fazla çalışacaktır . ZZZZZZZZyaklaşık iki 26^3 = 17576kat daha yavaş olmalıdır .

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

Çevrimiçi deneyin!

Kod çözücü neredeyse aynıdır:

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

Çevrimiçi deneyin!


1

> <> , 75 bayt Max Diff 0, Uzunluk 42, 75 puanı

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

Çevrimiçi deneyin!

Adil uyarı, bu önemsiz dava için bile tamamlanması çok çok uzun zaman alacaktır AAAAAAAA. Bir sayacın her ikili gösteriminden (girişin taban 26 gösterimi) 21 1saniye ile ikili sayıya ulaşılana kadar çalışır. Programı test etmek istiyorsanız biraz sen yerini alabilir ab+üçüncü satırda 1sadece tek olan inci ikili sayı döndürür hangi 1, çevrimiçi deneyin!


1

Python 3 , 75 bayt, Maksimum Fark 0, Uzunluk 42, Puan 112

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

Çevrimiçi deneyin!

Bu sadece teoride teorik olarak çalışır, çünkü bellek kısıtlamaları. Var 538257874440uzunluğu 42 ve belirgin dengeli sıfır-on dizeleri 208827064575olası çıkıştan bazı kullanılabilir olmayacak şekilde olası girişler.

@Recursive sayesinde -37 bayt


Girdi karakter kümenizi değiştirmek int(s,26)yerine dizin değeriniz için kullanabilirsiniz sum(...).
tekrarlayan

@recursive yazdırılamaz gerektirir. bunu zaten denedim
HyperNeutrino

Unprintables? Kullanıyor [0-9A-P], değil mi? int("123ABC",26) == 12855114
özyinelemeli

@recursive oh evet haklısın ne düşünüyordum lol. Teşekkürler!
HyperNeutrino

1

C ++, 146 Bayt, 42 maksimum uzunluk, 0 dengesizlik, puan 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);}

Sürekli 26 karakter için çalışır, ancak kabul edilemez bir süre çalıştığına dair uyarı


Ek olarak boş bir dizi geçirmeniz gerekiyor gibi görünüyor. Bunun geçerli olduğunu düşünmüyorum. / GCC kullanıyorsanız #include<algorithm>bununla değiştirebilirsiniz #import<regex>.
user202729

GCC belirli bir işaretçiyi çıktı olarak kullanmayı bırakmaya karar verdiğinde değiştireceğim
l4m2

... yani çıktı için bir işaretçi mi? O zaman geçerli görünüyor. Ancak, girdi / çıktı biçimini açıkça belirtmelisiniz.
user202729
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.