Làm những việc cần thiết? [đóng cửa]


8

Mục tiêu

Thay thế tất cả các nhận xét trong C, C ++ hoặc Mã Java bằng nhận xét // Do the needful.

Cụ thể

Thử thách mã hóa này là một điều đơn giản. Lấy làm đầu vào tên của một tập tin. Tệp đầu vào phải chứa mã C, C ++ hoặc mã Java. Mã sẽ chứa một hoặc nhiều ý kiến. Các ý kiến ​​có thể là dòng đơn /* */hoặc //giới hạn, cũng như /* */phân cách nhiều dòng . Đầu ra của chương trình phải giống hệt với đầu vào ngoại trừ tất cả các ý kiến ​​nên được chuyển đổi thành // Do the needful.

Ví dụ: nếu tệp đầu vào là:

#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);
}

Đầu ra của chương trình nên đọc

#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);
}

Chấm điểm

Đây là một cuộc thi phổ biến. Bạn nhận được hai phiếu bầu bổ sung vào điểm số của mình nếu không có từ nào sau đây xuất hiện trong chương trình của bạn trong mọi trường hợp khác nhau : {"do", "the", "needful"}. Điểm là số phiếu cộng với tiền thưởng nếu có.

Phụ cấp

Nếu các bình luận xuất hiện theo chuỗi ký tự thì cũng có thể chuyển đổi chúng thành // Do the needfultốt. Rốt cuộc ... bạn không bao giờ có thể có đủ nhu cầu.


5
Bạn biết rằng tiền thưởng dễ dàng có được bằng cách sử dụng "d" + "o", "t" + "he""need" + "ful"? Ngoài ra, việc đệ trình có phải có khả năng xử lý bất kỳ mã C, C ++ hoặc Java hợp lệ nào không? Điều đó khá khắc nghiệt và có nghĩa là viết một từ vựng cho cả ba ngôn ngữ (Tôi đang nghĩ về những lời bình luận bằng chuỗi và ngược lại.) Nếu vậy, còn thư viện lexer của bên thứ 3 thì sao?
Martin Ender

2
Chương trình nên làm gì khi có /* ... */trước một bình luận trên một dòng?
Greg Hewgill

1
Chúng ta có cần phải xem xét các trường hợp như char str[]="/**///";hoặc một chuỗi bắt đầu bình luận /*xuất hiện trong một /*bình luận, hoặc một dấu gạch chéo ngược mới xuất hiện trong một //bình luận, hoặc một //bình luận trong một /**/bình luận?
dùng12205

3
Tại sao làm cho điều này một cuộc thi phổ biến và không mã golf? Nó hoạt động tốt như golf.
Aaronaught

2
cuối cùng rất nhiều giải pháp dựa trên cùng một sự thay thế regex. Điều gì về một số điểm thưởng cho các giải pháp không phải regex?
CousinCocaine

Câu trả lời:


4

CoffeeScript (66 byte)

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

Mã này sẽ phân tích các chuỗi, nhưng có một lý do tốt. Bạn thấy đấy, có khả năng có một bình luận trong một mẫu tạo ra các /**/bình luận C.

Đây được tiền thưởng, vì nó tránh được trường hợp chính xác các trận đấu nhạy cảm cho Do, theneedful. Nó cũng sử dụng [^]toán tử nến ES5 ( ) để làm công cụ. Tôi sẽ đưa ra một nhận xét Do the needfultrong chương trình này, nhưng điều đó sẽ loại bỏ phần thưởng.


6

Perl, 68 ký tự

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

Điều này có một số tự do với đặc điểm kỹ thuật, và giữ lại phong cách nhận xét ban đầu. Điều này tránh được vấn đề với các /* ... */bình luận xuất hiện trước khi kết thúc dòng.

Không có nỗ lực nào được thực hiện để tránh các bình luận trong chuỗi ký tự và không có yêu cầu nào được đưa ra cho các điểm thưởng.


Tôi đang có một quả bóng sử dụng điều này trên mã nguồn!
ojblass

2
Tôi muốn nói rằng nó cải thiện một số phong cách bình luận.
Greg Hewgill

Bạn có thể nhận được điểm thưởng như thế này
ojblass

perl -0pe 's / ((\ / \ /). *? (\ n) | (\ / *). *? (* \ /)) / \ 2 \ 4 D \ coo th \ coe Needfu \ Cul \ 3 \ 5 / sg '
ojblass

1
@FDinoff: Vâng, đó là một sự tự do mà tôi đã thực hiện để đơn giản hóa vấn đề, nếu không bạn phải tìm ra cách làm với các dòng mã trong đó một /* ... */nhận xét đi trước mã thực tế (bạn không thể biến nó thành một //nhận xét một cách ngây thơ ).
Greg Hewgill

5

Perl

Thế giới vô chính phủ! :)

"bạn không bao giờ có thể có đủ nhu cầu"

#!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, regex

Vì nó không phải là mã golf, tôi không quan tâm đến độ dài mã. Không có gì ấn tượng, nhưng tôi rất vui khi nhớ / học lại những điều cơ bản về regex.

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 ký tự

Có thể được cải tiến. Tôi đã học được rất nhiều về sed trong khi làm điều này.

Đọc từ đầu vào tiêu chuẩn, đầu ra đến đầu ra tiêu chuẩn. Giả sử đầu vào hợp lệ - nếu bạn có các bình luận bị hủy bỏ, nó sẽ không coi đó là một bình luận.

Đã thử nghiệm trên GNU sed v4.2.2.

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

Và giải thưởng cho khả năng đọc được ....?

Phiên bản một lớp lót:

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

Giải trình

Luồng điều khiển nhảy xung quanh rất nhiều, bằng các câu lệnh GOTO (vâng, sed có chúng!). sed không có bất kỳ vòng lặp hoặc câu lệnh điều kiện thuận tiện 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

Vâng, BrainFuck là một ngôn ngữ hoàn chỉnh.
Chúc may mắn cho việc hiểu mã này.

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

Về cơ bản, mã giả là:

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
}

Một số thông dịch viên trực tuyến bị hỏng.
Hãy thử ở đây với ví dụ được đưa ra bởi OP (kết thúc bằng null-char để phá vỡ vòng lặp đúng cách):

#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

Nổi loạn

Đó không phải là mã golf, vì vậy tôi sẽ nói dài dòng.

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
 ]

(Lưu ý: Vì lý do chính trị, tôi đang đẩy COMBINE ở đây, nhưng nó chưa chuẩn . Vì vậy, nếu bạn thực sự muốn chạy nó, hãy sử dụng REJOIN. Nhưng tôi ghét REJOIN. Hãy nói về một ngôn ngữ đẹp khác! dẫn đến lắng nghe tôi. Cảm ơn.)

PARSE là một phương ngữ, hoặc ngôn ngữ trong một ngôn ngữ, trong Rebol và Red. Nó xoắn mọi thứ lên, vì vậy, ví dụ, các loại ký hiệu được sử dụng để gán ( terminator:in terminator: newline) mang một ý nghĩa mới khi được sử dụng trong mô hình mã dưới dạng dữ liệu ... nó lưu vị trí phân tích cú pháp hiện tại vào một biến có tên đó . Bạn có thể đọc thêm về lý do tại sao nó mát mẻ ở đây .


CẬP NHẬT: Ồ được rồi, tôi cũng sẽ chơi golf. Trong Rebmu , 72 ký tự ... sử dụng rebmu / args mà tiêm A làm đối số:

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

Chính xác cùng một chương trình.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.