必要なことを行います?[閉まっている]


8

ゴール

C、C ++、またはJavaコード内のすべてのコメントをコメントに置き換えます// Do the needful

詳細

このコーディングの課題は簡単です。ファイルの名前を入力として受け取ります。入力ファイルには、C、C ++、またはJavaコードが含まれます。コードには、1つ以上のコメントが含まれます。コメントは、単一行/* */または//区切り、および複数行で/* */区切ることができます。プログラムの出力は、すべてのコメントがに変換されることを除いて、入力と同じでなければなりません// Do the needful

たとえば、入力ファイルが次の場合:

#include <iostream.h>

int   result;    // the result of the calculations 
char  oper_char; // the user-specified operator 
int   value;     // value specified after the operator

/* standard main function */     
int main()
{
    result = 0; // initialize the result 

    // Loop forever (or till we hit the break statement) 
    while (1) {
        cout << "Result: " << result << '\n';

        /* This code outputs display and requests
           input from the user */
        cout << "Enter operator and number: ";
        cin >> oper_char;
        cin >> value;

        if (oper_char = '+') {
            result += value;
        } else {
            cout << "Unknown operator " << oper_char << '\n';
        }
    }
    return (0);
}

プログラムの出力を読む必要があります

#include <iostream.h>

int   result;    // Do the needful
char  oper_char; // Do the needful
int   value;     // Do the needful

// Do the needful
int main()
{
    result = 0; // Do the needful

    // Do the needful
    while (1) {
        cout << "Result: " << result << '\n';

        // Do the needful
        cout << "Enter operator and number: ";
        cin >> oper_char;
        cin >> value;

        if (oper_char = '+') {
            result += value;
        } else {
            cout << "Unknown operator " << oper_char << '\n';
        }
    }
    return (0);
}

得点

これは人気コンテストです。次の単語がいずれの場合でもプログラムに表示されない場合、スコアに2票追加されます{"do", "the", "needful"}。スコアは、投票数とボーナス(該当する場合)です。

手当

コメントが文字列リテラルに含まれている場合は、コメントに変換すること// Do the needfulもできます。結局のところ...あなたは十分な必要性を持つことはできません。


5
あなたはボーナスを簡単に使用することによって取得されたことを知っている"d" + "o""t" + "he""need" + "ful"?また、提出は対処することができなければならないの任意の有効なC、C ++ Javaのコード?これはかなり厳しく、3つの言語すべてのレクサーを作成することになります(文字列内のコメントリテラルを考えています(逆も同様です)。もしそうなら、サードパーティのレクサーライブラリについてはどうですか?
マーティンエンダー2014年

2
/* ... */が行の非コメントに先行する場合、プログラムは何をすべきですか?
グレッグ・ヒューギル2014年

1
char str[]="/**///";コメント開始シーケンス/*/*コメントに表示される、またはバックスラッシュ改行が//コメントに表示される、または//コメント内の/**/コメントのようなケースを考慮する必要がありますか?
user12205 2014年

3
なぜこれを人気のコンテストにして、ゴルフをコーディングしないのですか?それはゴルフとしてうまく動作します。
アーロンノート、2014年

2
最終的には、多くのソリューションが同じ正規表現の置き換えに基づいています。非正規表現ソリューションのいくつかのボーナスポイントはどうですか?
CousinCocaine 2014年

回答:


4

CoffeeScript(66バイト)

(c)->c.replace /\/\/.*\n?|\/\*[^]*?\*\//g,"// D\o t\he needfu\l\n"

このコードは文字列を解析しますが、それには十分な理由があります。ご覧のとおり、C /**/コメントを生成するテンプレートにコメントがある可能性があります。

これは、それがために、正確な大文字小文字を区別しないマッチを避けるように、ボーナスを取得しDotheneedful。また、ES5キャンドル([^])演算子を使用して処理を行います。私はDo the needfulこのプログラムにコメントを入れますが、それはボーナスを削除します。


6

Perl、68文字

perl -0pe's@((//).*?(\n)|(/\*).*?(\*/))@\2\4 Do the needful \3\5@sg'

これは仕様にいくつかの自由を取り、元のコメントスタイルを保持します。これ/* ... */により、行の終わりの前にコメントが表示される問題が回避されます。

文字列リテラル内のコメントを回避する試みは行われず、ボーナスポイントに対する請求も行われません。


私はこれをソースコードで使用しているボールを持っています!
ojblass 2014年

2
いくつかのコメントスタイルが改善されたと思います。
グレッグヒューギル2014年

このようなボーナスポイントを得ることができます
ojblass 2014年

perl -0pe 's /((\ / \ /)。*?(\ n)|(\ / *)。*?(* \ /))/ \ 2 \ 4 D \ coo th \ coe needfu \ cul \ 3 \ 5 / sg '
ojblass '27年

1
@FDinoff:はい、それは私が問題を単純化するために取った自由でした。そうでなければ、/* ... */コメントが実際のコードの前にあるコード行をどうするかを理解する必要があります(単純にコメントに変えることはできません//)。
グレッグ・ヒューギル2014年

5

Perl

最初の世界無政府状態!:)

「あなたは十分な必要性を決して持つことができない」

#!perl -p0
sub the { s,(?<=\w)(.*)(\n),$1 // do the needful$2,g }
sub needful { s,//.*\n,\n,g,s,/\*.*?\*/,,msg }

do not do the needful

4

Python 3.x、正規表現

それはコードゴルフではないので、コードの長さについて大したことはありませんでした。印象的なことは何もありませんでしたが、正規表現の基本を覚えたり、再学習したりして楽しかったです。

import re
import urllib.request as r
def dTN(filename):
    dtn = re.search(r"(?<=question-hyperlink\">)([A-Za-z \n]*)(?=[?]<)", r.urlopen("http://codegolf.stackexchange.com/questions/28625/").read().decode("utf8")).group(0)
    with open(filename) as f:
        return re.sub(r"//{1}.*", "//{0}".format(dtn), re.sub(r"/\*[A-Za-z \n]*\*/", "// {0}".format(dtn), f.read()))

2

sed、90文字

改善される可能性があります。これを作っている間私はsedについて多くを学びました。

標準入力から読み取り、標準出力に出力します。有効な入力であると見なします-コメントが終了していない場合、コメントとして扱われません。

GNU sed v4.2.2でテスト済み。

s_/\*.*\*/_//_
tg
s_/\*.*$_//_
tl
:g
s_//.*$_// Do the needful_
P
d
:l
s_.*\*/_//_
tg
N
bl

そして、読みやすさの賞金は...に行きます...?

ワンライナーバージョン:

s_/\*.*\*/_//_;tg;s_/\*.*$_//_;tl;:g;s_//.*$_// Do the needful_;P;d;:l;s_.*\*/_//_;tg;N;bl

説明

制御フローは、GOTOステートメントを使用して、非常に頻繁にジャンプします(そうです、sedにはそれがあります!)。sedには、ループや便利な条件ステートメントAFAIKがありません。

s_/\*.*\*/_//_              # Substitute /* ... */ with //
tg                          # GOTO g if the substitution occured
s_/\*.*$_//_                # Substitute /*...<ENDOFLINE> with //
tl                          # GOTO l if the substitution occured
:g                          # GOTO-LABEL g
s_//.*$_// Do the needful_  # Replace //...<ENDOFLINE> with // Do the needful
P                           # Print the pattern space (current line with substitutions)
d                           # empty the pattern space and move on to the next line
:l                          # GOTO-LABEL l
s_.*\*/_//_                 # Replace ... */ with //
tg                          # GOTO g if the substitution occured
N                           # take another line from input and add it to the pattern space
bl                          # GOTO l

2

BrainFuck

はい、BrainFuckはチューリング完全な言語です。
このコードを理解するために頑張ってください。

,[.-----------------------------------------------[>+>+<<-]>
>[-<<+>>][-]+<[[-]>-<]>[>,----------------------------------
-------------[>+>+<<-]>>[-<<+>>]<>[-]+<[>-<+++++[>+>+<<-]>>[
-<<+>>]<>[-]+<[>-<++++++++++++++++++++++++++++++++++++++++++
.[-]]>[<+++++++++++++++++++++++++++++++++++++++++++++++.----
-----------.++++++++++++++++++++++++++++++++++++.+++++++++++
++++++++++++++++++++++++++++++++.---------------------------
----------------------------------------------------.+++++++
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+++++++++++++++++.------------.---.-------------------------
--------------------------------------------.+++++++++++++++
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+++.---------..-.++.+++++++++++++++.---------.[+++++[,------
------------------------------------],----------------------
-------------------------]>-]<<[-]]>[<++++++++++++++++++++++
+++++++++++++++++++++++++.---------------.++++++++++++++++++
++++++++++++++++++.+++++++++++++++++++++++++++++++++++++++++
++.---------------------------------------------------------
----------------------.+++++++++++++++++++++++++++++++++++++
+++++++++++++++++++++++++++++++++++++++++++++++.------------
.---.-------------------------------------------------------
--------------.+++++++++++++++++++++++++++++++++++++++++++++
+++++++++++++++++++++++++++++++++.---------..-.++.++++++++++
+++++.---------.[,----------]++++++++++.[-]>-]<<[-]<<>-]<<,]

基本的に、疑似コードは次のとおりです。

get input_char
while (input_char is not null)
{
  print input_char
  if (input_char is '/')
  {
    get input_char
    if (input_char is '/')
    {
      print '/ Do the needful'
      get input_char until input_char is '\n'
    }
    else
    {
      if (input_char is '*')
      {
        print '/ Do the needful'
        get input_char until input_char is '*' followed by '/'
      }
      else
      {
        print input_char
      }
    }
  }
  get input_char
}

一部のオンライン通訳が壊れています。OPによって与えられた例
でここ試してください(ループを適切に解除するためにnull-charで終了します):

#include <iostream.h>\n\nint   result;    // the result of the calculations \nchar  oper_char; // the user-specified operator \nint   value;     // value specified after the operator\n\n/* standard main function */     \nint main()\n{\n    result = 0; // initialize the result \n\n    // Loop forever (or till we hit the break statement) \n    while (1) {\n        cout << "Result: " << result << '\\n';\n\n        /* This code outputs display and requests\n           input from the user */\n        cout << "Enter operator and number: ";\n        cin >> oper_char;\n        cin >> value;\n\n        if (oper_char = '+') {\n            result += value;\n        } else {\n            cout << "Unknown operator " << oper_char << '\\n';\n        }\n    }\n    return (0);\n}\0

2

リボル

それはゴルフをコード化しないので、私は冗長になります。

do-the-needful: function [filename [file!]] [
    parse (data: to-string read filename) [
        ; match the pattern in brackets ANY number of times (zero okay)
        any [
            ; seek the parse position up TO one of the following matches
            ; if a match is hit, following code in parentheses is executed normally
            to [
                "/*" (terminator: "*/")
            | 
                "//" (terminator: newline)
            ]

            ; save parse position in start, seek up THRU terminator and leave parse
            ; position at the end of the terminator match (not the beginning as w/TO)
            start:
            thru terminator
            finish:

            ; Do partial replacement within the input; starting at START
            ; but limited to FINISH.  Again, structure in parentheses is exec'd as code
            (
                change/part start combine ["// Do the needful" newline] finish
            )
        ]
    ]
    return data
 ]

(注:政治的な理由から、ここではCOMBINEをプッシュしていますが、まだ標準ではありません。したがって、これを実際に実行したい場合は、REJOINを使用してください。ただし、REJOINは嫌いです。それ以外の場合は美しい言語のいぼ!友好的な近所に知らせてくださいRed dev私の言うことに耳を傾けます。ありがとう。)

PARSEは、方言、またはRebolとRedの言語内の言語です。これはひねりを加えたものです。たとえば、割り当てに使用されるシンボルタイプ(terminator:in terminator: newline)は、コードとしてのデータパラダイムで使用されると新しい意味を持ちます...現在の解析位置をその名前の変数に保存します。クールな理由について詳しくは、こちらをご覧ください


更新:よし、ゴルフもするよ。ではRebmu、72の文字...引数としてAを注入rebmu / argsを使用しました:

pa DtsRDa[anTO["/*"(T"*/")|"//"(Tlf)]SthT F(chpS"// Do the needful^/"f)]d

まったく同じプログラム。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.