バランスのとれたゼロワンエンコーディング


12

仕事

A-Z独自のお気に入りのスキームを使用して、ゼロと1のみを使用して、大文字のアルファベット()のみで構成される文字列をエンコードします。しかし、ルールはそれほど単純ではありません!

ルール

  1. プログラム/関数は、長さ8の有効な入力文字列を正しく処理する必要があります。
  2. 結果は、すべての入力に対して同じ長さでなければなりません。
  3. 結果は、入力ごとに異なる必要があります。
  4. 結果はできるだけ短くする必要があります。
  5. 結果はゼロと1のバランスがとれている必要があります(ゼロの数と同様の数があります)。それらは等しくする必要はありません(つまり、完全にバランスが取れています)が、あなたのスコアはそのために罰せられます。

エンコードをデコードするプログラム/機能を提供する必要はありません。

入出力

  • の代わりに26個の異なる印刷可能なASCII文字のセットを受け入れることを決定できA-Zます。
  • およびの代わりに、異なる印刷可能なASCII文字の任意のペアを出力することを決定できます。01
  • ビット文字列の代わりに整数を出力することはできません。これは、先頭にゼロが含まれている可能性があり、実際にルール2を満たしているかどうかが不明だからです。
  • デフォルト(A-Z入力および01出力)から逸脱することに決めた場合は、サブミットで入力/出力文字セットを指定する必要があります。

得点

  • 基本スコア:コードサイズ、またはプログラムが空の場合は1。
  • 罰則
    • 長さのペナルティ:乗算 1.5 ** (encoded length - 42)
    • 短くしてもボーナスはありません。42は、アルファベットサイズ26の8長ストリングの完全にバランスの取れたエンコードの最小長です。
    • 不均衡の場合のペナルティ:乗算2 ** max(abs(ones - zeros) for every valid input of length 8)、ここでonesおよびzerosは、それぞれ各出力の1および0のカウントです。
    • 提出には、ペナルティ値に関する最悪の例(入力/出力)または理論的な説明を表示する必要があります。
  • 最も低いスコアが勝ちます。

提出例

架空のエソラン、0バイト、スコア74733.8906

空のプログラムが入力文字のすべてのASCIIコードをバイナリで出力する仮想のエゾランを次に示します。

 

たとえば、AAAAAAAA入力として指定すると、プログラムは1000001連続して8回印刷します10000011000001100000110000011000001100000110000011000001

入力アルファベットはに選択されますCEFGIJKLMNQRSTUVXYZabcdefh。この方法では、すべての文字はバイナリで7桁に変換され、ゼロから1までのカウントは文字ごとに1つだけ異なります(バイナリに変換すると、すべて3つの1と4つの0があります)。

出力の長さは常に56であり、最悪の場合の不均衡はのような入力で発生し、CCCCCCCCゼロは1より8倍多く出現します。

したがって、この提出のスコアは1.5 ** (56 - 42) * 2 ** 8 == 74733.8906です。



空のプログラムが文字エンコードされた26進数の数値Nを受け入れ、合計21のN番目の可能な42ビットシーケンスを出力する仮想のエゾランを使用できますか?
ngn

@ngn-あなたの仮想言語は私たちの受け入れられた基準を満たしていますか -編集ah入力は常に[AZ]-簡単だと思います... :)
ジョナサンアラン

1
1と0のリストを出力できますか、それとも文字列である必要がありますか?
デニス

1
全体の質問は、「アンバランスがなく、42桁でなければなりません。実際の実行時間に注意してください」
-l4m2

回答:


4

スタックス、11バイト、0ペナルティ、スコア11

このプログラムは[0-9A-P]、入力と[01]出力に使用します。

ö■▄←·ï↨≡⌐╠H

オンラインで実行およびデバッグします -実行ボタンをクリックして開始します。最初の4つのテストケースはミリ秒単位で実行されます。秒の5番目。ミレニアで6番目。

このプログラムの対応する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バイト、最大Diff:0、長さ:64、スコア:149636.5528 142154.7251 104745.5869

sm@S.{.p*`T4xG

オンラインでお試しください!

[a-z]大文字の代わりに小文字のアルファベット()を使用します。2バイトのコストで、に置き換えGて大文字を使用できrG1ます。

HyperNeutrino のPython 3の回答をより良いスコアに翻訳することもできましたが、率直に言って、実際に機能する回答が必要です。


2

パイソン2779 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を底とする)、またはその10進数に相当するものは382136276621246556626597379364678993894472503063952720559883124988542417847157286833446006767955087631166943136913765901237281892296575754126024183763829277879554548743231384272055945084065681774297483130020386641869860456147616177702938121538230311395513497506285733567467605871232294046704309941152721616618474501854355102646152223338484615876165254236449912858255665248186687952137487016925761633237335983620006273901509768720506129789443353730706676483647298576692613113269388239830925662977837917272690235355742330377154505179476767457756888107428475384947712227312747517748632498691058764154580934614231152483398774630508576533263098942260213967880819240793990219283490212843120923539516962682466148372296338428497778127570401190309339992457562121354271、5 0秒と5 1秒のすべての252個の順列をエンコードします。

アルゴリズムは、最初にそれをbase-26数に変換A-Z0-25て扱い、次にを追加し56*252**4ます。

次に、数値は252を底とする5桁の数値に変換され、対応する5 0秒と5 1秒の順列に置き換えられます。

その後、最初の2ビットを削除します01。次に、文字列を48ビット文字列にエンコードしました。これは、正確に24 0秒と24 1秒で構成されています。


ペナルティを掛ける必要があります(つまり、スコアは7346.953125)。
ハイパーニュートリノ

@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>

偶数の入力の場合、常にゼロと1の3.5 *を出力するため、1.5 ** 14のペナルティのみを支払います。サポートされる文字:'+-.3569:<GKMNSUVYZ\cefijlqrtx


2

ゼリー、16バイト

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

+,-./0123456789:;<=>?@ABCD入力に使用し、1と0のリストを返します。

これは、メモリ内に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の3985 135バイト、最大差分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

オンラインでお試しください!

バブラーの礼儀

ゴルフされていないコード:

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

他のアプローチは非常に効率が悪いように見えるので、時間的に最適なアプローチを作成しようとしました。これは、Nビットのエンコーディングでは明らかにO(N)であり、big-O最適です。

ヒント:パスカルの三角形を考えてみてください(この図からわかるように)

サンプル出力:

Input:  AAAAAAAA
Output: 000000000000000000000111111111111111111111

 

Input:  ZZZZZZZZ
Output: 011001000000011010011000111010110110111110

実行時間:<0.013 s(すべての入力でほぼ一定)



@Bubbler Incredible、私はこれを達成するためのスキルを所有していませんでした
リアル

ただし、スコアを最小化するための努力をする必要があります。すべての提出は、スコアを最適化するために真剣に努力する必要があります。そうでなければ、無効です。
user202729

@ user202729その後、バブラーのバージョンに変更しましたが、最小化されています。ただし、コードサイズだけでなく、スコアを最小化する努力をしました。
レアル

後者の点について...正しい。
user202729

2

Perl 5、55バイト、最大diff 0、長さ42、スコア56 55

これは機能しますが、時間がかかりますが実行可能です(ZZZZZZZZコンピューターで2.5日かかりました)メモリは問題ありません。

用途A-Z入力などと1し、A文字をコードとして。それらは常に完全にバランスが取れています。最初のスキップ26^7 = 80318101768つの文字より短い文字列を表すバランスの取れた組み合わせを、しかしのOKということがあるので、538257874440利用可能と私が使用208827064575して208827064575 + 8031810176 < 538257874440

ただし、実際には非常に長い時間がかかるターゲットの組み合わせまで「カウント」されます。そのため、TIOリンクでは、出力が正しいことを示すために短すぎる入力文字列(これもサポートされています)のみを使用しました。AAAAAATIOがタイムアウトする前よりも少しだけ機能します。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の(入力の基数26)の2進数に到達するまで、カウンターの各バイナリ表現を実行します。プログラムをいくぶんテストしたい場合ab+は、3番目の行を1n番目のバイナリ番号を1つだけで返すように置き換えることができます。オンライン1試してください!


1

Python 3、75バイト、最大差分0、長さ42、スコア112

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

オンラインでお試しください!

これは、メモリの制約のために理論的にのみ機能します。ある538257874440長さ42との異なるバランスゼロ・ワンストリング208827064575可能な出力の一部が使用されないように、可能な入力は、。

@recursiveにより-37バイト


入力文字セットを変更するのint(s,26)ではなく、インデックス値に使用できますsum(...)
再帰的

印刷できないものを必要とする@recursive。すでにそれを試みた
-HyperNeutrino

印刷できないもの?を使用[0-9A-P]しますか?私のマシンでは、int("123ABC",26) == 12855114
再帰的

@recursiveああ、そうだね。ありがとう!
ハイパーニュートリノ

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>
user202729

GCCが出力として特定のポインターの使用を停止することを決定したときに変更します
l4m2

...それが出力へのポインタですか?有効に見えます。ただし、入出力形式は明示的に言及する必要があります。
user202729
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.