いくつかの「enciph5r47g」をやろう


35

これは、「deciph4r4ng」を実行してみましょう。


このチャレンジでは、あなたの仕事は文字列を暗号化することです。幸いなことに、アルゴリズムは非常に単純です。左から右への読み取り、各典型的な書き込み文字(ASCIIの範囲32〜126)を数字N(0〜9)に置き換えて、文字N + 1と同じであることを示す必要がありますその前の位置。例外は、元の文字列の前の10桁以内に文字が表示されない場合です。その場合は、キャラクターをもう一度印刷するだけです。事実上、元のチャレンジの操作を元に戻すことができるはずです。

入力文字列"Programming"は次のようにエンコードされます。

例1

したがって、予想される出力は"Prog2am0in6"です。

明確化と規則

  • 入力文字列には、32〜126の範囲のASCII文字のみが含まれます。空になることはないと想定できます。
  • 元の文字列には数字が含まれないことが保証されています。
  • 文字がエンコードされると、次の数字で参照される場合があります。たとえば、"alpaca"としてエンコードする必要があります"alp2c1"
  • 参照は文字列をラップすることはありません。前の文字のみを参照できます。
  • 完全なプログラムまたは関数を作成して、結果を出力または出力できます。
  • これはコードゴルフであるため、バイト単位の最短回答が優先されます。
  • 標準的な抜け穴は禁止されています。

テストケース

Input : abcd
Output: abcd

Input : aaaa
Output: a000

Input : banana
Output: ban111

Input : Hello World!
Output: Hel0o W2r5d!

Input : this is a test
Output: this 222a19e52

Input : golfing is good for you
Output: golfin5 3s24o0d4f3r3y3u

Input : Programming Puzzles & Code Golf
Output: Prog2am0in6 Puz0les7&1Cod74G4lf

Input : Replicants are like any other machine. They're either a benefit or a hazard.
Output: Replicants 4re3lik448ny3oth8r5mac6in8.8T64y'r371it9376a1b5n1fit7or2a1h2z17d.

6
あなたのテストケースは、置換のために可能な限り低い数字を常に使用していることがわかります。複数の可能性がある場合、これは必須の動作ですか、それとも上位桁を使用できますか?
レオ

@Leo有効であれば、0〜9の任意の1桁を使用できます。
エンジニアトースト

これは、移動なしの場合を除いて、前方へ移動するエンコーダーに似ています:)
パイプ

回答:


6

05AB1E20 19 18バイト

-2 エミニャに感謝

õ¹vDyåiDykëy}?yìT£

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

õ                  # Push an empty string
 ¹v y              # For each character in input
   D               # Duplicate the string on the stack (call this S)
     åi            # If this character is in S
       Dyk         #   Push the index of that that character 
          ë }      # Else
           y       #   Push the character 
             ?     # Print without newline
              yì   # Prepend this character to S
                T£ # Remove all but the first 10 elements from S

)¹vDyåiDykëy}?y¸ìT£うまくいくと思う。
エミグナ

実際、あなたの答えを私のものと組み合わせるõIvDyåiDykëy}?yìT£と18 が得られます:)
エミグナ

@Emigna自由にそれを更新してください:)
ライリー

あなたの答えがなければ、私はそれを考えていなかったので、あなたはそれを持つべきです。よくやった!
エミグナ

@Emignaそれは公平だと思う。ありがとう!
ライリー

12

網膜24 23バイト

(.)(?<=\1(.{0,9}).)
$.2

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

かなり単純な正規表現の置換。各文字を照合し、その前の0〜9文字のコピーを見つけようとします。見つかった場合、その文字を、コピーを取得するために一致しなければならない文字数に置き換えます。

結果は、テストケースと完全には一致しません。これは、このテストケースが、可能な限り小さい数字ではなく、可能な限り大きい数字を使用しているためです。


4
可変長の後ろ
ダダ

8
@Dada可変長の後読みは、啓発の方法です。
マーティンエンダー

悲しいことに...退屈しているのなら、遠慮なくPerlに実装してください!
ダダ

元のタスクのOPのコメントあたりのように、「あなたは、それが有効だとして0-9をしたい任意の1桁の数字を使用することができます。」...そう可能な最大の有効である必要があり
ドクトルJ

@DoktorJはい、OPがその説明を追加した後に変更しました。
マーティンエンダー

8

JavaScript(ES6)、74 57 54バイト

ETHproductionsのおかげp=/./gで、p={}(Neilに触発された)代わりに華麗な3バイトを節約

s=>s.replace(p=/./g,(c,i)=>(i=p[c]-(p[c]=i))>-11?~i:c)

テストケース


文字列には数字が含まれないことが保証されているため、s代わりに使用できますpか?
ニール

(をfind使用して元のバージョンをアウトゴルフできましlastIndexOfたが、11文字の長さであるため、これは少し驚くべきことです。...)
ニール

@Neil今はコンピューターの前にいませんが、JSストリングは不変なので、それが機能するとは思いません。
アーナルド

2
文字列リテラルのプロパティ設定が機能しないことを確認できます。しかし...それは正規表現で動作するように見えるので、おそらくs=>s.replace(p=/./g,(c,i)=>(i=p[c]-(p[c]=i))>-10?~i:c)3バイトを節約することができると思います。
ETHproductions

1
@YOUここで何が起こったのか本当にわかりませんが、最後の編集ですべてのブラウザにバグを導入したことがわかりました。これは修正されました。気づいてくれてありがとう!
アーナルド

7

Haskell72 66バイト

6バイトのゴルフをしてくれたLaikoniに感謝します!

(a:r)%s=last(a:[n|(n,b)<-zip['0'..'9']s,b==a]):r%(a:s)
e%s=e
(%"")

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

この関数%は、2番目の引数で部分的に処理された文字列を逆に保持するため、この文字列の最初の10個の要素で、調べている文字の出現を検索できます。送信は(%"")、2番目の引数として空の文字列を使用して前の関数を呼び出す名前のない関数で構成されます。


f(a:s)=f s++(last$[a]:[show n|(n,b)<-zip[0..9]s,b==a])2バイト節約します。
ライコニ

待って、f(a:s)=f s++[last$a:[n|(n,b)<-zip['0'..'9']s,b==a]]さらに節約します。
ライコニ

使用する代わりに外出先で反転すると、reverseさらに1バイト節約されます。オンラインで試してみてください。
ライコニ

@ライコニありがとうございます、それは素晴らしいです!
レオ


3

Perl 5、36バイト

35バイトのコード+ -pフラグ。

s/(\D)(.{0,9})\K\1/length$2/e&&redo

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

いくつかの説明:
目標は、(数字以外の文字を置き換えることです\Dが、それは後方参照に対応して\1、私の正規表現で)10文字未満(が先行している.{0,9})と同じ文字((\D)... \1の長さによって).{0,9}(グループlength$2)。そしてredo、文字が置き換えられます。


どうやら.*必須ではありませんが、置換された数字の前の範囲にある有効な文字は問題ありません。
-colsw

@ConnorLSWうん、チャレンジの更新を見ただけで答えを修正しました。指摘してくれてありがとう。
ダダ


3

Japt、18バイト

£¯Y w bX s r"..+"X

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

説明

£   ¯  Y w bX s r"..+"X
mXY{s0,Y w bX s r"..+"X}
                          // Implicit: U = input string
mXY{                   }  // Replace each char X and index Y in U by this function:
    s0,Y                  //   Take U.slice(0,Y), the part of U before this char.
         w bX             //   Reverse, and find the first index of X in the result.
                          //   This gives how far back this char last appeared, -1 if never.
              s           //   Convert the result to a string.
                r"..+"X   //   Replace all matches of /..+/ in the result with X.
                          //   If the index is -1 or greater than 9, this will revert to X.
                          // Implicit: output result of last expression


2

05AB1E、20バイト

õIv¹N£RT£©yåi®ykëy}J

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

説明

õ                     # push an empty string
 Iv                   # for each [index,char] [N,y] in input
   ¹N£                # push the first N characters of input
      R               # reverse
       T£             # take the first 10 characters of this string
         ©            # save a copy in register
          yåi         # if y is in this string
             ®yk      #   push the index of y in the string in register
                ë     # else 
                 y    #   push y
                  }   # end if
                   J  # join stack as one string


2

C(tcc)、113バイト

この関数は入力文字列のコピーを作成するため、入力の最大サイズは98文字(最長のテスト入力に適合するのに十分な長さ)です。もちろん、これは他の値に変更できます。

i,j;f(char*s){char n[99];strcpy(n,s);for(i=1;s[i];i++)for(j=i-1;j>-1&&i-j<11;j--)if(n[i]==n[j])s[i]=47+i-j;j=-1;}

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

編集

-15バイト。Johan du Toitに感謝します。


ああ!入力を98文字に制限し、1バイト節約してください!
パイプ

ニースのソリューションは、しかし、あなたは別の15のバイトを保存することができます: i,j;f(char*s){char n[99];strcpy(n,s);for(i=1;s[i];i++)for(j=i-1;j>-1&&i-j<11;j--)if(n[i]==n[j])s[i]=47+i-j,j=-1;}
ヨハン・デュToit

@JohanduToitありがとう!一つの質問があります。s [i]はforループの条件としてどのくらい正確に機能しますか?私はこのウェブサイトの他の人の回答で何度もそれを見てきました。
マキシムミハイロフ

@マックス・ローンボーイ。元々、次のものがありました: 's [i] ^' \ 0 ''これは、 's [i]!=' \ 0 ''の短縮形です。「\ 0」文字リテラルはゼロに等しいため、「s [i]!= 0」のように記述できます。Cのifステートメントは、値がゼロまたはゼロ以外に評価されるかどうかのみをテストするため、「!= 0」は不要です。
ヨハンデュトワ


2

Java 7、102 101バイト

void a(char[]a){for(int b=a.length,c;--b>0;)for(c=b;c-->0&c+11>b;)if(a[c]==a[b])a[b]=(char)(b-c+47);}

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

-1バイト、Kevin Cruijssenに感謝します。gos-to演算子を使用する言い訳をいつも楽しんでいます。


なぜ--c>=0?で置き換えてc-->0、バイトを保存できます。
ケビンCruijssen

@KevinCruijssenどういうわけか、頭の中で事前にデクリメントする必要があると思っていました。さもないと、実際の計算が間違ってしまいます。
ポケ

1

MATL、31 30バイト

&=R"X@@f-t10<)l_)t?qV}xGX@)]&h

MATL Online試しください

説明

        % Implicitly grab input as a string
&=      % Perform element-wise comparison with automatic broadcasting.
R       % Take the upper-triangular part of the matrix and set everything else to zero
"       % For each column in this matrix
X@      % Push the index of the row to the stack
@f      % Find the indices of the 1's in the row. The indices are always sorted in
        % increasing order
-       % Subtract the index of the row. This result in an array that is [..., 0] where
        % there is always a 0 because each letter is equal to itself and then the ...
        % indicates the index distances to the same letters
t10<)   % Discard the index differences that are > 9
l_)     % Grab the next to last index which is going to be the smallest value. If the index
        % array only contains [0], then modular indexing will grab that zero
t?      % See if this is non-zero...
  qV    % Subtract 1 and convert to a string
}       % If there were no previous matching values
  x     % Delete the item from the stack
  GX@)  % Push the current character
]       % End of if statement
&h      % Horizontally concatenate the entire stack
        % Implicit end of for loop and implicit display

あなたはビットオフになる場合もありますが、私はスーパー場所を伝えることはできません。入力this is a testはのthis 222a1te52代わりに生成されthis 222a19e52ます。2番目tはに変換されません9
エンジニアトースト

@EngineerToastハハありがとう。見てみましょう。
-Suever

1

PHP、104バイト

フォワードソリューション

for($i=0;$i<strlen($a=&$argn);$f[$l]=$i++)$a[$i]=is_int($f[$l=$a[$i]])&($c=$i-$f[$l]-1)<10?$c:$l;echo$a;

後方ソリューション

オンライン版

PHP、111バイト

for(;++$i<$l=strlen($a=&$argn);)!is_int($t=strrpos($argn,$a[-$i],-$i-1))?:($p=$l-$i-$t-1)>9?:$a[-$i]=$p;echo$a;

PHP、112バイト

for(;++$i<$l=strlen($a=&$argn);)if(false!==$t=strrpos($argn,$a[-$i],-$i-1))($p=$l-$i-$t-1)>9?:$a[-$i]=$p;echo$a;

オンライン版


1

REXX、124の 125バイト

a=arg(1)
b=a
do n=1 to length(a)
  m=n-1
  c=substr(a,n,1)
  s=lastpos(c,left(a,m))
  if s>0&m-s<=9 then b=overlay(m-s,b,n)
  end
say b

少し離れているかもしれません。私はREXXを知らないが、私はエラーがそれが持っている7行目にあると推測s<9代わりのs<10s<=9。入力this is a testはのthis 222a1te52代わりに生成されthis 222a19e52ます。2番目tはに変換されません9オンラインで試してください
エンジニアトースト

ありがとう、それは1バイトを削る愚かな試みでした。コードが修正されました。
idrougge

1

C(gcc)117 103バイト

i,j;f(char*s){for(i=strlen(s)-1;s[i];i--)for(j=i-1;s[j]&&i-j<11;j--)if(s[i]==s[j]){s[i]=47+i-j;break;}}

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

string.hインポートなしで103バイト、警告付きで動作します。これがルールに反する場合は、プルします

きれいなコード:

i,j;
f(char *s) {
    // Chomp backwards down the string
    for(i=strlen(s)-1; s[i]; i--)
        // for every char, try to match the previous 10
        for(j=i-1; s[j] && i-j < 11; j--)
            // If there's a match, encode it ('0' + (i-j))
            if (s[i] == s[j]) {
                s[i] = 47+i-j;
                break;
            }
}

編集:

  • LLVMからgccに変更して、暗黙的なi、j宣言を許可し、libインポートを削除しました。
  • コンプライアンスのための関数ラッパーを追加

提案する(i=strlen(s);s[--i];)代わりに(i=strlen(s)-1;s[i];i--)
ceilingcat
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.