文字列の長さエンコード


18

以下のルールを使用して、ASCII印刷可能文字のみを含み、*-string と呼ばれる別の文字列から単一の文字列をプルするとします。プロセスが停止する前に文字列がなくなった場合、それはエラーであり、その場合のプロセスの結果は未定義です。

  1. 皮切りに d=1, s=""
  2. a *に出会うたびにd、2を掛けます。別の文字に出会うたびに、それを最後に連結し、sから1を引きdます。今ならd=0、停止して戻るs

定義された例

d->d
769->7
abcd56->a
*abcd56->ab
**abcd56->abcd
*7*690->769
***abcdefghij->abcdefgh

未定義の例:(空の文字列もこれらの1つになることに注意してください)

*7
**769
*7*
*a*b
*

あなたの仕事は、文字列を*取得し、その文字列を生成する最短の文字列を返すことです。

プログラム例

7->7
a->a
ab->*ab
abcd->**abcd
769->*7*69

プログラムは、少なくとも1文字と非*ASCII印刷可能文字のみを含む文字列を処理する必要があります。定義上、どの文字列も生成できないため、プロセスが未定義の文字列を返すことはできません。

標準の抜け穴とI / Oルールが適用されます。


入力に含まれないものと想定できます*か?
ルイスメンドー

3
@DonMuesli 「のみ非* ASCII印刷可能文字」
FryAmTheEggman

回答:


3

Pyth(36 27バイト)

9バイト改善されたJakubeに感謝します!現在、muddyfishの答えほどではありませんが、何でも

KlzJ1VzWgKyJp\*=yJ)pN=tK=tJ

テストスイート

Pythonへの翻訳:

                            | z=input() #occurs by default
Klz                         | K=len(z)
   J1                       | J=1
     Vz                     | for N in z:
       WgKyJ                |   while K >= J*2:
            p\*             |     print("*", end="")
               =yJ          |     J=J*2
                  )         |     #end inside while
                   pN       |   print(N, end="")
                     =tK    |   K=K-1
                        =tJ |   J=J-1

1
Muddyfishのは...死亡しているようだ
Rɪᴋᴇʀ

5

JavaScript(ES6)、61バイト

f=(s,d=2)=>s?d>s.length?s[0]+f(s.slice(1),d-2):'*'+f(s,d*2):s

以下を行う再帰関数:

  • d残りの文字列の長さを2で割った値以下の場合

    *出力に追加しd、2 を掛けます

  • そうしないと:

    文字列をシフトして出力に追加し、から1を引きdます。

実際にご覧ください:

f=(s,d=2)=>s?d>s.length?s[0]+f(s.slice(1),d-2):'*'+f(s,d*2):s

input.oninput = e => output.innerHTML = f(input.value);
<input id="input" type="text"/>
<p id="output"></p>


1
dの値の2倍と条件を逆にしてさらに1バイトを処理して、2バイトを節約します。– f=(s,d=2)=>s?d>s.length?s[0]+f(s.slice(1),d-2):'*'+f(s,d*2):s
ニール


2

C、125バイト

main(int q,char**v){++v;int i=1,n=strlen(*v);while(n>(i*=2))putchar(42);for(i-=n;**v;--i,++*v)!i&&putchar(42),putchar(**v);}

これは、星の位置の非常に規則的なパターンを利用して、正しいエンコードを出力します。最初はブルートフォースの再帰的解法を試しましたが、振り返ってみると、より単純な数学的解法があることは明らかでした。

基本的2^floor(log_2(length))に、出力の先頭には常に星があり、2^ceil(log_2(length)) - length文字の後に最後の星があります(少なくとも1文字になった場合)。

(わずかに)改変されていないバージョンは次のとおりです。

main(int q,char**v){
   ++v;                         // refer to the first command line argument
   int i=1, n=strlen(*v);       // set up iteration variables

   while(n > (i*=2))            // print the first floor(log2(n)) '*'s
      putchar(42);

   for(i-=n;  **v;  --i, ++*v)  // print the string, and the final '*'
      !i&&putchar(42),putchar(**v);
}

1

JavaScript(ES6)、88 77バイト

f=(s,l=s.length,p=2)=>l<2?s:p<l?"*"+f(s,l,p*2):s.slice(0,p-=l)+"*"+s.slice(p)

最初はそれがabcde必要*a**bcdeだと思っていましたが、**abc*de同じように機能することがわかりました。つまり、出力はfloor(log₂(s.length))の先頭の星と、長さが2のべき乗ではない文字列の追加の星を使用して簡単に構築されます。

編集:先行星の数を再帰的に計算して8バイトを保存しました。長さ1の特殊ケーシング文字列によってさらに3バイトを節約したので、長さが2の累乗である文字列を余分な先行星を持つものとして扱うことができます。


0

Haskell、68バイト

f d[]=""
f d xs|length xs>=d*2='*':f(d*2)xs
f d(x:xs)=x:f(d-1)xs

本当に他の答えと同じです。EOFの場合、空の文字列を出力します。残りの長さが2回を超える場合はd、スターとダブルを出力しdます。それ以外の場合は、次の文字を出力し、から1を引きdます。

ゴルフをしていない:

f d (  [])                    = ""
f d (  xs) | length xs >= d*2 = '*' : f (d*2) xs
f d (x:xs)                    =  x  : f (d-1) xs
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.