自己修正による乗算


33

...少なくとも「自己修正」の定義については。

タスク

この課題では、あなたのタスクは、3つの文字列を記述することでABそしてCその次の性質を満たします。

  • 文字列のB長さは少なくとも1です。

  • すべてn ≥ 0について、文字列は、選択したプログラミング言語の有効なプログラム(完全に実行可能なプログラムまたは関数の定義を意味します)です。これは、文字列のように、上付き文字は、繰り返しを表し、、、各プログラムは、一つの入力として文字列、および出力として戻って1つの文字列を取るなど。ABnCACABCABBCABBBC

  • いずれm, n ≥ 0にせよ、プログラムが入力付きで実行される場合、それは戻ります。この形式ではない入力の場合、プログラムはクラッシュを含む何でもできます。ABmCABnCABm*n+1C

形式のいくつかの例program(input) -> output

AC(AC) -> ABC
ABC(AC) -> ABC
ABBBBBC(AC) -> ABC
AC(ABC) -> ABC
AC(ABBBBC) -> ABC
ABC(ABC) -> ABBC
ABBC(ABC) -> ABBBC
ABBBBC(ABBBC) -> ABBBBBBBBBBBBBC
ABBBC(ABBBBBBC) -> ABBBBBBBBBBBBBBBBBBBC

ルールとスコアリング

あなたのスコアは、との合計の長さでACスコアが低いほど良くなります。Bスコアにはカウントされませんが、最初の例AC同様に作成する必要があることに注意してください。

標準の抜け穴は許可されていません。プログラムは、直接または間接的に独自のソースコードにアクセスすることはできません(入力として与えられた場合を除く)。あなたは、文字列を識別するために必要とされているABCいくつかの方法で、あなたの答えであり、あなたのソリューションを説明することを奨励しました。

回答:


16

CJam、9 8バイト

A: 1
B: 0
C:  r,(#0q

CJamインタープリターでオンラインで試してください。

使い方

(ABcode) e# Push the integer 10 ** len(Bcode).
<SP>     e# Noop. Separates (AB) and C for input reading.
r        e# Read the first whitespace-separated token from STDIN (ABinput).
,(       e# Push the string length minus 1: len(Binput)
#        e# Power operator: 10 ** len(Bcode) len(Binput) # ->
         e#   (10 ** len(Bcode)) ** len(Binput) = 10 ** (len(Bcode) * len(Binput))
0        e# Push an additional 0 to complete len(Bcode) * len(Binput) + 1 zeroes.
q        e# Read the remaining input (C).

12

CJam、15 13 11バイト

A: rl"
B: <SP>
C: <LF>",(*SNq

CJamインタープリターでオンラインで試してください。

使い方

e# A

r     e# Read a whitespace-separated token from STDIN.
      e# This reads the input up to the first space, but does not consume it.
l     e# Read the rest of the first line from STDIN.
      e# This reads up to the first linefeed and consumes it.

"     e# Initiate a string.

e# B

<SP>  e# Fill the string with as many spaces as there are copies of B.

e# C

<LF>" e# Terminate the string with a linefeed.
      e# This serves as a delimiter for the `l' command.
,(    e# Compute the length of the string minus 1 (to account for the LF).
*     e# Repeat the string read by `l' that many times.
SN    e# Push a space and a linefeed.
q     e# Read the remaining input (i.e., the second line) from STDIN.

最後に、スタックには次によって読み取られたトークンが含まれます。 r生成される*スペース、によってプッシュされるスペースとラインフィード、SNおよびによって読み取られる行が含まれqます。CJamはこれらすべてを自動的に印刷します。


ああ、引用符の良い使用:D-
オプティマイザー

9

Pyth、10

A: w*\0hl*w[<newline>
B: 0
C: <empty>

ソースを2行に分割します。最初の行はA、2番目の行はBです。Aは最初の行にあるので、最初の行はwAを印刷するだけです-簡単です。

Pythでは、先行ゼロは個別のトークンであるため、[00)実際には[0, 0]です。最初の行はで終わりl[、2番目の行はで構成されることに注意してください0000...。したがって、l[実際にはこのプログラムのBの数をカウントします。2番目wは、入力の2行目を読み取ります-これは、入力のBの数です。ここからは、単純な乗算、インクリメント、およびその数のゼロの出力です。


9

網膜25 19バイト

A: ]\]<LF>
B: ]]
C: <LF>m`^]*$<LF>]$0]

<LF> stands for newline

サンプルABCコード:

]\]
]]
m`^]*$
]$0]

コードには2つの代替手順があります。

  • すべてを次のように変更して、入力AB^mCAB^(m*n)Cに変更BB^nます。

    • ]\]B入力内のすべてに一致し、パターン行にエスケープされているため、他には何もありません
    • ]]...]]B^n
  • 変更B^(m*n)するB^(m*n+1)ことにより、

    • m`^]*$のみ]の行を取得
    • ]$0]]]この行が最初の正規表現と一致しないように追加のペアを追加する

-sRetinaコード全体を1つのファイルにするために必要な複数行フラグのスコアに3バイトを追加しました。

@MartinBüttnerのおかげで2バイト節約されました。


8

Python 3、51バイト

A: lambda s:s[:28]+"x"*(1+len("
B: x
C: ")*(len(s)-51))+s[-23:]

使用例:

>>> f=lambda s:s[:28]+"x"*(1+len("xx")*(len(s)-51))+s[-23:]
>>> f('lambda s:s[:28]+"x"*(1+len("xxx")*(len(s)-51))+s[-23:]')
'lambda s:s[:28]+"x"*(1+len("xxxxxxx")*(len(s)-51))+s[-23:]'

この関数は、文字列内にが存在する場所で計算n*m+1します(一部はです)。文字列を掛ける。この数にはなりますし、関数が取ると、入力のうちおよび取得するためにこれらのすべてを連結します。(1+len("xxx")*(len(s)-51))m xxxxB^m"x"B^(n*m+1)ACAB^(n*m+1)C

Jでの同じアプローチ:

J、35バイト

A: (19{.]),('x'#~1+(#'
B: x
C: ')*35-~#),_16{.]

5

CJam、22

A:<empty>
B:{])`\,q,K/(*))*"_~"}
C:{])`\,q,K/(*))*"_~"}_~

実行例:

ABBC(ABC) -> ABBBC

に変換します

{])`\,q,K/(*))*"_~"}{])`\,q,K/(*))*"_~"}{])`\,q,K/(*))*"_~"}_~

入力として

{])`\,q,K/(*))*"_~"}{])`\,q,K/(*))*"_~"}_~

次の出力が得られます。

{])`\,q,K/(*))*"_~"}{])`\,q,K/(*))*"_~"}{])`\,q,K/(*))*"_~"}{])`\,q,K/(*))*"_~"}_~

仕組み

プログラムACABC見てみましょう。

AC :{])`\,q,K/(*))*"_~"}_~
ABC:{])`\,q,K/(*))*"_~"}{])`\,q,K/(*))*"_~"}_~

気づく C =B_~

Bをしているか見てみましょう:

{])`\,q,K/(*))*"_~"}

{                  }    e# This is a code block. Alone, this does nothing except
                        e# pushing this block to stack as is
 ]                      e# Wrap everything on stack in an array
  )`                    e# Take out the last part and convert it to its string representation
    \,                  e# Take length of remaining array
      q,K/              e# Read the input, take its length and int divide by K (i.e. 20)
          (*            e# Decrement and multiply by the array length on stack
            ))          e# Add two to the product
              *         e# Repeat the string representation on stack that many times
               "_~"     e# Put this string on stack

ここでAC、入力なしで実行すると何が起こるかを見てみましょう。

{])`\,q,K/(*))*"_~"}_~                      e# Copy the block and run it
{])`\,q,K/(*))*"_~"}{])`\,q,K/(*))*"_~"}~   e# Block is copied, run it
{      ...         } ])                     e# Wrapped array has the block in it.
                       `\,                  e# Stringify it and take length of remaining = 0
                          q,K/              e# No input so 0
                              (*))          e# 0 * -1 = 0. 0 + 2 = 2
                                  *         e# Repeat the stringified block 2 times:
                                            e# "{])`\,q,K/(*))*"_~"}{])`\,q,K/(*))*"_~"}"
                                   "_~"     e# Put this string. Program ends, so print stack:
                                            e# {])`\,q,K/(*))*"_~"}{])`\,q,K/(*))*"_~"}_~

うわー、出力はABCです。

基本的Bに、コード内にいくつあるかをカウントします。次に、入力内の数(長さを使用)。それらを掛けて、2回インクリメントし(CもあるためB)、追加_~して取得しますC

こちらからオンラインでお試しください


3

Haskell、50バイト

fは、を取得して返す関数Stringです。

文字列Bは1つのスペースで、Cは1つのスペースで始まります。

A:_:b="
B: 
C: ";f s|a:c<-words s=unwords$a:(drop 50s>>b):c

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

  • _:b=" "は、文字列リテラルの最初のスペース以外のすべてをに割り当てb、プログラムのm Bコピーに等しくします。
  • s入力文字列です。a:c<-words sスペースで区切られた単語に分割し、aAにcなり、Cを構成する単語のリストになります。words複数のスペースを圧縮するため、Bのコピーは無視されます(プログラムの残りの部分では回避されます)。
  • drop 50s入力のBコピーの数nに等しい長さの文字列です。drop 50s>>bの多くのコピーを連結してbmn個のスペースを与えます。
  • unwords$a:(drop 50s>>b):cすべての文字列をスペースで結合します。(drop 50s>>b)リストには余分な「単語」が挿入されているため、余分な結合スペースもあり、乗算に+1が自動的に追加されます。

2

Matlab、85

このような抽象的な挑戦をするのは初めてなので、私にとってはコードゴルフの挑戦というよりもコーディングの挑戦でした!

3つの文字列は、引用符なしです。

A:    "X=strsplit(input('','s'));m=0 "
B:    "+1 "
C:    ";[X{1},32,repmat(['+1',32],1,m*(length(X)-2)+1),X{end}]"

仕組み:入力引数を空白で分割しているためn、文字列部分の数から判断できます。Bはを取得するための一種のカウンターとして機能しますm。答えを再構築するには、スプリットからAとCを使用し、B m * n + 1回繰り返し、ASCII値を使用してスペースを挿入します。これにより、Cで不要なスプリットが発生しません。

編集:おっと、誤ってA + Bをカウント


1

C(gcc)、81バイト

文字列を識別するための要件は、違法な入力に対するarbitrary意的な動作が許可されていることと矛盾しているように見えます。当然、私はほとんどのバイトを流す解釈をしました。

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

A: m;f(char*s){m=strrchr(s+66,32)-s-65;printf("%.66s%*s",s,m*strlen("
B: <SPACE>
C: ")+16,s+m+66);}

識別によって、私はあなたの答えからどのコードスニペットがABCであるかを明確にする必要があることを意味しました。プログラムの要件ではありません。
-Zgarb

1

TI-Basic(83シリーズ)、65バイト

セグメントA(33バイト):

Input Str1:sub(Str1,1,27:For(I,0,(length(Str1)-55)(length("

セグメントB:

X

セグメントC(32バイト):

Y")-1:Ans+"X":End:Ans+sub(Str1,length(Str1)-27,28

私はこの馬のような挑戦を見つけることに本当に興奮しています!ほとんどのクインは、"シンボルをエスケープする方法がないため、少なくとも少しの不正行為がなければTI-Basicでは機能しません。(「エスケープ」という言葉の両方の意味で。)しかし、ここでは、Inputコマンドを介して入力文字列を取得し、"そこに入力することはまったく問題ありません。

ここで対処するTI-Basicの愚かさはまだあります。空の文字列は無効です。そのため、"XXX...XX"n = 0の場合、ループに文字列を挿入する単純なソリューションは機能しません。代わりに、mn + 1の値を手動で計算し、"X"その回数だけ文字列を挿入します。

魔法の定数2728プログラムでは、わずかバイトカウント33及び32から離れているためStr1sub(length(だけ文字列の長さに1を貢献する2バイトのトークンです。

の代わりに改行を使用すると:、終了引用符を省略することで数バイトを節約できるように見えますが、実際には機能しません。まず、文字列に改行文字を追加する前に、16進エディターが必要Inputです。コマンド中にEnterキーを押すと入力を送信するため、単に入力することはできません。16進エディターのアプローチを試みたとき、プログラムの内容を変更する奇妙なバッファーオーバーフローエラーが発生したため、自宅で高価な計算機でこれを試さないでください。


0

Java 11、135 65 + 26 = 91バイト

A

s->{var p=s.split("\\(\"|\"\\.");return p[0]+"(\"B"+p[1].repeat("

B

B

C

".length())+'"'+'.'+p[2];}

ここでオンライン試してください(TIOにはまだJava 11がないため、これはの代わりにヘルパーメソッドに依存していString::repeat()ます)。

ゴルフをしていない:

s -> { // lambda taking and returning a String
    var p = s.split("\\(\"|\"\\."); // split input into parts A, B^n, C (where n may be 0) at the "(\"" and "\"."
    return p[0] + "(\"B" + // put it back together: A plus the part the split shaved off, plus an extra B ...
    p[1].repeat("BBB".length()) + // ... plus B^(n*m)
    '"' + '.' + p[2]; // plus C, with the part the split shaved off reattached
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.