ジミーこれらの配列


23

同僚のジミーは、C / C ++の初心者です。彼は一種の遅い学習者でもあります。公平を期すために、彼のコードは常にコンパイルされますが、彼は本当にずさんな習慣を持っています。たとえば、次のように配列を定義できることは誰もが知っています。

int spam[] = {4, 8, 15, 16, 23, 42};

それは、ジミーを除く全員です。彼は、配列を作成する唯一の方法は次のようであると確信しています。

int spam[6];
spam[0] = 4;
spam[1] = 8;
spam[2] = 15;
spam[3] = 16;
spam[4] = 23;
spam[5] = 42;

私はコードレビューで彼のためにこれを修正し続けていますが、彼は学びません。そのため、彼がコミットしたときに自動的にこれを行うツールを作成する必要があります¹。

チャレンジ

完全なプログラムか、入力として複数行の文字列を取り込んで、よりコンパクトなバージョンのC配列を出力する関数のいずれかを作成してほしい。入力は常に空白を含むこの形式に従います。

identifier_one identifier_two[some_length];
identifier_two[0] = some_number;
identifier_two[1] = some_number;
identifier_two[2] = some_number;
...
identifier_two[some_length - 1] = some_number;

要するに、入力は常に有効で、明確に定義されたCです。詳細は次のとおりです。

すべての識別子は、文字とアンダースコアのみで構成されます。長さは常に少なくとも1つであり、欠落または境界外のインデックスはありません。また、インデックスが正しいと仮定することもできます。例えば:

foo bar[3];
bar[0] = 1
bar[2] = 9;

foo bar[1];
bar[0] = 1;
bar[1] = 3;

そして

foo bar[3];
bar[2] = 9;
bar[0] = 1
bar[1] = 3

入力はすべて無効であり、送信時に未定義の動作を引き起こす可能性があります。また、すべての数値が有効な10進数、負または正であると想定することもできます。入力に余分なスペースはありません。出力は常に空白を含むこの形式に従う必要があります。

identifier_one identifier_two[] = {n1, n2, n3, ...};

サンプルデータを次に示します。

Input:
spam eggs[10];
eggs[0] = 0;
eggs[1] = 4;
eggs[2] = 8;
eggs[3] = -3;
eggs[4] = 3;
eggs[5] = 7;
eggs[6] = 888;
eggs[7] = 555;
eggs[8] = 0;
eggs[9] = -2;

Output:
spam eggs[] = {0, 4, 8, -3, 3, 7, 888, 555, 0, -2};

Input:
char ans[2];
ans[0] = 52;
ans[1] = 50;

Output:
char ans[] = {52, 50};

Input:
blah_blah quux[1];
quux[0] = 105;

Output:
blah_blah quux[] = {105};

STDIN / STDOUT、関数の引数と戻り値、ファイルの読み取りと書き込みなど、合理的な形式で入出力を行うことができます。標準の抜け穴が適用されます。バイト単位の最短回答が勝ちです!


¹これは受動的で攻撃的で恐ろしいアイデアです。あなたはなかったではない私からこのアイデアを得ます。




@DLoscああ、それがジミーがコミット前スクリプトで使用しているものです!
ベルギ

9
もちろん、ジミーはコードゴルファーではありません。
jimmy23013

この挑戦は私のジミーを本当にざわめかせた
DanTheMan

回答:


8

Vim、 43 36バイト

ジミーに台本を渡す必要はありません。適切なテキストエディタを使用するように教えてください。(わかりやすくするためにリテラルリターン)

:%s/.*=//|%s/;\n/,/<cr><cr>
3wcf ] = {<esc>
$s};

いいね!この特定の例で<C-a>は、はよりも短くt]、これは楽しい小さなハックです。また、<cr>確認を求めるため、技術的には2が必要だと思います。
DJMcMayhem

Vimの標準的なコードとゴルフのチャレンジに対する回答は、バイト単位で記録
マーティンエンダー

また、norm df=より短いs/.*=//g
DJMcMayhem

1
また、3wC] = {<esc>はより短いです<C-a>di]$s = {<esc>
DJMcMayhem

1
@Geobits Emacsの答えはどこにありますか?
ニール

7

CJam、43 36バイト

qN/('[/~;"[] = {"@{S/W=W<}%", "*"};"

オンラインの例

説明:

qN/                                     |Read all lines to array
   ('[/~;                               |slice first line left of [
         "[] = {"                       |add formatting to stack
                 @                      |rotate to remaining lines
                  {      }%             |for each line in array
                   S/W=                 |split after last space
                       W<               |remove last character (;)
                           ", "*        |insert ", " to array
                                "};"    |add formatting

最初のCJamの回答の改善について、Martin Enderに感謝します。


6

JavaScript(ES6)、65 64 63バイト

s=>`${s.split`[`[0]}[] = {${s.match(/-?\d+(?=;)/g).join`, `}};`

5

網膜30 28バイト

バイトカウントはISO 8859-1エンコードを前提としています。

\d+];¶.+ 
] = {
;¶.+=
,
;
};

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

説明

例として次の入力を使用します。

spam eggs[4];
eggs[0] = 0;
eggs[1] = 4;
eggs[2] = 8;
eggs[3] = -3;

ステージ1

\d+];¶.+ 
] = {

最初の行の末尾にスペースがあることに注意してください。

の後に続く数字];と改行を照合し、次にすべてを次の行の最後のスペースまで照合します。この一致は、最初の行の終わりでのみ見つけることができます(ため];)。これはすべてに置き換えられ] = {ます。つまり、サンプル入力を次のように変換します。

spam eggs[] = {0;
eggs[1] = 4;
eggs[2] = 8;
eggs[3] = -3;

ステージ2

;¶.+=
,

ここで、aから次の行;までをすべて一致させ、=aに置き換え,ます。これにより、文字列は次のように変換されます。

spam eggs[] = {0, 4, 8, -3;

ステージ3

;
};

残っているのは終わりを修正することです。これを行うには、残りの部分のみ;};次のように置き換えます。

spam eggs[] = {0, 4, 8, -3};

5

ジュリア、112の 108の 105バイト

f(s)=string(split(s,'[')[1],"[] = {",join([m[1] for m in [eachmatch(r"= *(-?\d+)",s)...]],", "),"};")

説明

string(                                                         # build output string
split(s,'[')[1],                                                # get declaration (e.g. spam eggs)
"[] = {",                                                       # add [] = {
join(                                                           # collect numbers
    [m[1] for m in [eachmatch(r"= *(-?\d+)",s)...]],            # regex out (signed) numbers
    ", "),                                                      # and join comma separated
"};"                                                            # add };
)                                                               # close string(

collect(eachmatch())を[eachmatch()...]に置き換え、より短い正規表現でバイトを保存しました


こんにちは、PPCGへようこそ!これは素晴らしい最初の答えのように見えます。私から+1。チャレンジは「入力と出力を任意の適切な形式にすることができますeachmatchと記載しているため、関数呼び出しのカンマ区切り文字の後のスペースを削除して、出力を小さくし、-1バイトにすることができます。私は自分でジュリアをプログラミングしたことはありませんが、この投稿を読むのが面白いと思うかもしれません。ジュリアでのゴルフのヒント。再び歓迎し、あなたの滞在をお楽しみください。:)
ケビンクルーイッセン

1
あなたの親切な言葉にとても感謝します:) PPCGは調べるのが楽しいように思えたので、私はそれを試してみると思いました。この回答はまだ存在しなかったため、ジュリアを選択しました
nyro_0

使用matchallするのは、飛び散るよりも短いでしょうeachmatch
アレックスA.

最初にmatchallを使用してみましたが、各一致ではなく正規表現グループ(括弧内の特に興味のある部分)を使用できません。(または、ドキュメントでそれを見つけることができませんでした?)
nyro_0

3

Lua、121バイト。

function g(s)print(s:gmatch('.-%[')()..'] = {'..s:gsub('.-\n','',1):gsub('.-([%d.-]+);\n?','%1, '):gsub(',%s+$','};'))end

説明した

function g(s)
    print(                              -- Print, Self Explaintry.
        s:gmatch('.-%[')()..'] = {'     -- Find the 'header', match the first line's class and assignment name (everything up to the 'n]') and append that. Then, append ] = {.
                                        -- In the eggs example, this looks like; 'spam eggs[] = {' now
        ..                              -- concatenate...
        s:gsub('.-\n','',1)             -- the input, with the first line removed.
        :gsub('.-([%d.-]+);\n?','%1, ') -- Then that chunk is searched, quite boringly, a number followed by a semicolon, and the entire string is replaced with an array of those,
                                        -- EG, '1, 2, 3, 4, 5, 6, '
        :gsub(',%s+$','};')          -- Replace the final ', ' (if any) with a single '};', finishing our terrifying combination
    )
end

3

バッチ、160バイト

@echo off
set/ps=
set s=%s:[=[] = {&rem %
set r=
:l
set t=
set/pt=
if "%t%"=="" echo %r%};&exit/b
set t=%t:* =%
set r=%r%%s%%t:~2,-1%
set s=, 
goto l

注:行set s=,はスペースで終わります。STDINで入力を受け取ります。奇妙なライン3は、例えば(入力を取ることint spam[6];と変更[[] = {&rem結果としてset s=int spam[] = {&rem 6];、2つのステートメントとして解釈されますこれset s=int spam[] = {rem 6];コメントである後者は、。次に、各ラインのために、我々は最初のスペースまでのテキストを削除します(あなたができるので、=パターンでは使用せず、一致は貪欲ではない)、値を抽出する。


3

C、121バイト

n=2;main(i){for(;putchar(getchar())^91;);for(printf("] = {");~scanf("%*[^=]%*c%d",&i);n=0)printf(", %d"+n,i);puts("};");}

3

パイソン112 111

私にとって非常に簡単で、思いついた改善点を提案してください。

def f(l):
 a,*b=l.split('\n')
 return a[:a.index('[')]+'[] = {'+', '.join(r.split(' = ')[1][:-1]for r in b)+'};'


# TEST

lines = """spam eggs[10];
eggs[0] = 0;
eggs[1] = 4;
eggs[2] = 8;
eggs[3] = -3;
eggs[4] = 3;
eggs[5] = 7;
eggs[6] = 888;
eggs[7] = 555;
eggs[8] = 0;
eggs[9] = -2;"""
print (f(lines))
assert f(lines) == 'spam eggs[] = {0, 4, 8, -3, 3, 7, 888, 555, 0, -2};'

ざっと見てみると、に無駄な空白があることがわかり[:-1] forます。
Yytsi

2

05AB1E31 30 28バイト

žh-|vy#¤¨ˆ\}¨… = ¯ïžuDÀÀ‡';J

説明

žh-¨                            # remove numbers and ";" from first input
    |v      }                   # for each of the rest of the inputs
      y#                        # split on spaces
        ¤¨                      # take the last element (number) minus the last char (";") 
          ˆ\                    # store in global array and throw the rest of the list away
             … =                # push the string " = "
                 ¯ï             # push global array and convert to int
                   žuDÀÀ‡       # replace square brackets of array with curly ones
                         ';     # push ";"
                           J    # join everything and display

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

Adnanのおかげで1バイト節約


žuDÀÀ„[]„{}バイトを保存する代わりに:)。
アドナン

@アドナン:そうですね。
エミグナ

2

Java 7、159 158 149 154バイト

String c(String[]a){a[0]=a[0].split("\\d")[0]+"] = {\b";for(String i:a)a[0]+=i.split("= [{]*")[1];return a[0].replace(";",", ").replaceFirst("..$","};");}

@cliffrootのおかげで複数のバイトが節約されました。

未ゴルフ&テストコード:

ここで試してみてください。

class M{
  static String c(String[] a){
    a[0] = a[0].split("\\d")[0] + "] = {\b";
    for(String i : a){
      a[0] += i.split("= [{]*")[1];
    }
    return a[0].replace(";", ", ").replaceFirst("..$", "};");
  }

  public static void main(String[] a){
    System.out.println(c(new String[]{ "spam eggs[10];", "eggs[0] = 0;", "eggs[1] = 4;",
      "eggs[2] = 8;", "eggs[3] = -3;", "eggs[4] = 3;", "eggs[5] = 7;", "eggs[6] = 888;",
      "eggs[7] = 555;", "eggs[8] = 0;", "eggs[9] = -2;" }));
    System.out.println(c(new String[]{ "char ans[2]", "ans[0] = 52;", "ans[1] = 50;" }));
    System.out.println(c(new String[]{ "blah_blah quux[1];", "quux[0] = 105;" }));
  }
}

出力:

spam eggs[] = {0, 4, 8, -3, 3, 7, 888, 555, 0, -2};
char ans[] = {52, 50};
blah_blah quux[] = {105};

1
数バイトの節約String c(String[]a){a[0]=a[0].split("\\d")[0]+"]={ \b";for(String i:a)a[0]+=i.split("=[{]*")[1];return a[0].replace(';',',').replaceFirst(".$","};");}
クリフルート

@cliffrootありがとう!実際String、パラメータのinを再利用し、最後の文字をの"};");代わりに置き換えるなど、いくつかの素晴らしいトリックがあり"")+"};";ます。
ケビンクルイッセン

2

Perl、42 + 2(-0p)= 44バイト

s%\d+].*%] = {@{[join",",/(-?\d+);/g]}};%s

実行する必要性-p-0フラグ。例えば ​​:

perl -0pe 's%\d+].*%] = {@{[join",",/(-?\d+);/g]}};%s' <<< "blah_blah quux[1];
quux[0] = 105;"

1

ゼリー、27バイト

Ỵ©ḢḟØDṖ“ = {”®Ḳ€Ṫ€Ṗ€j⁾, ⁾};

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

説明

Ỵ         Split into lines
 ©Ḣ       Take the first one, store the others in ®
   ḟØD    Remove digits
      Ṗ   Remove trailing ;

“ = {”    Print a literal string

®         Recall the remaining lines
 Ḳ€       Split each into words
   Ṫ€     Keep each last word
     Ṗ€   Remove each trailing ;

j⁾,       Join by “, ”
    ⁾};   Literal “};”


1

Java、106バイト

Javaでの文字列操作は、いつものように地獄です。

a->a[0].join("",a).replaceAll(";\\w+\\[\\d+\\] = ",", ").replaceAll("\\d+\\], ","] = {").replace(";","};")

これは純粋な正規表現の答えです。単一の連結Stringを作成し、実行しますreplaceXxxなくなるまで。

テストと未使用:

import java.util.function.Function;

public class Main {

  public static void main(String[] args) {
    Function<String[], String> f = a ->
        String.join("", a)                          // I think this would join. Not sure, though. Golfed into a[0].join because static members are accessible from instances.
            .replaceAll(";\\w+\\[\\d+\\] = ", ", ") // replace with regex
            .replaceAll("\\d+\\], ", "] = {")       // replace with regex
            .replace(";", "};");                    // replace no regex

    String[] spam = {
      "int spam[6];",
      "spam[0] = 4;",
      "spam[1] = 8;",
      "spam[2] = 15;",
      "spam[3] = 16;",
      "spam[4] = 23;",
      "spam[5] = 42;"
    };
    test(f, spam, "int spam[] = {4, 8, 15, 16, 23, 42};");

    String[] eggs = {
      "spam eggs[10];",
      "eggs[0] = 0;",
      "eggs[1] = 4;",
      "eggs[2] = 8;",
      "eggs[3] = -3;",
      "eggs[4] = 3;",
      "eggs[5] = 7;",
      "eggs[6] = 888;",
      "eggs[7] = 555;",
      "eggs[8] = 0;",
      "eggs[9] = -2;"
    };
    test(f, eggs, "spam eggs[] = {0, 4, 8, -3, 3, 7, 888, 555, 0, -2};");

    String[] ans = {
      "char ans[2];",
      "ans[0] = 52;",
      "ans[1] = 50;"
    };
    test(f, ans, "char ans[] = {52, 50};");

    String[] quux = {
      "blah_blah quux[1];",
      "quux[0] = 105;"
    };
    test(f, quux, "blah_blah quux[] = {105};");

  }

  static void test(Function<String[], String> f, String[] input, String expected) {
    System.out.printf("Result:   %s%nExpected: %s%n", f.apply(input), expected);
  }
}

0

ゼリー、33 バイト

ỴḊḲ€Ṫ€K⁾;,yṖ“{“};”j
ỴḢḟØDṖ,⁾ =,ÇK

TryItOnline

どうやって?

ỴḊḲ€Ṫ€K⁾;,yṖ“{“};”j - Link 1, parse and reform the values, same input as the Main link
Ỵ                   - split on line feeds
 Ḋ                  - dequeue (remove the first line)
  Ḳ€                - split each on spaces
    Ṫ€              - tail each (get the numbers with trailing ';')
      K             - join on spaces
       ⁾;,          - ";,"
          y         - map (replace ';' with ',')
           Ṗ        - pop (remove the last ',')
            “{“};”  - list of strings ["{","};"]
                  j - join (making "{" + "n0, n1, ,n2, ..." + "};")

ỴḢḟØDṖ,⁾ =,ÇK - Main link, takes one argument, the multiline string
Ỵ             - split on line feeds
 Ḣ            - head (just the first line)
   ØD         - digits yield "0123456789"
  ḟ           - filter out
     Ṗ        - pop (remove the trailing ';')
      ,   ,   - pair
       ⁾ =    - the string " ="
           Ç  - call the previous Link (1)
            K - join on spaces (add the space after the '=')

ダウン投票者-何が問題なのですか?
ジョナサンアラン


0

JavaScript、125バイト

私はそれが他のものよりも長いことを知っていますが、私は本当に使用したかったevalです。ただ楽しみのために。

f=function(s){m=/^(\w+ )(\w+).*?(;.*)/.exec(s)
eval("var "+m[2]+"=new Array()"+m[3]+'alert(m[1]+m[2]+"={"+eval(m[2])+"};")')}

実行するには、次をここに貼り付けます

s='int spam[6];\
spam[0] = 4;\
spam[1] = 8;\
spam[2] = 15;\
spam[3] = 16;\
spam[4] = 23;\
spam[5] = 42;'
f=function(s){m=/^(\w+ )(\w+).*?(;.*)/.exec(s)
eval("var "+m[2]+"=new Array()"+m[3]+'alert(m[1]+m[2]+"={"+eval(m[2])+"};")')}
f(s)

0

Haxe、234バイト

function R(L:Array<String>){var S=L[0];var W=S.indexOf(" ");var T=S.substr(0,W),M=S.substring(W+1,S.indexOf("["));var r=[for(i in 1...L.length)L[i].substring(L[i].lastIndexOf(" ")+1,L[i].length-1)].join(', ');return'$T $M[] = {$r};';}

長い関数名はこれを殺しました:D

ここでテストケースをお試しください!


0

V25、24のバイト

3wC] = {òJd2f $s, òhC};

オンラインでお試しください! これには印刷できない<esc>文字が含まれているため、hexdumpを次に示します。

0000000: 3377 435d 203d 207b 1bf2 4a64 3266 2024  3wC] = {..Jd2f $
0000010: 732c 20f2 6843 7d3b                      s, .hC};

説明:

3w                              "Move forward 3 words
  C     <esc>                   "Delete everything until the end of the line, and enter this text:
   ] = {                        "'] = {'
             ò         ò        "Recursively:
              J                 "  Join these two lines (which enters a space)
               d                "  Delete everything until you
                2f              "  (f)ind the (2)nd space
                   $            "  Move to the end of this line
                    s           "  Delete a character, and enter:
                     ,          "  ', '
                                "
                        h       "Move one character to the left
                         C      "Delete everything until the end of the line, and enter this text:
                          };    "'};'
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.