Melakukan yg diperlukan? [Tutup]


8

Tujuan

Ganti semua komentar dalam C, C ++, atau Java Code dengan komentar // Do the needful.

Spesifik

Tantangan pengkodean ini sederhana. Ambil sebagai masukan nama file. File input harus berisi C, C ++, atau kode Java. Kode harus memuat satu atau lebih komentar. Komentar dapat berupa satu baris /* */atau //dibatasi, serta beberapa baris /* */dibatasi. Output dari program harus identik dengan input kecuali semua komentar harus dikonversi // Do the needful.

Misalnya jika file inputnya adalah:

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

Output dari program harus dibaca

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

Mencetak gol

Ini adalah kontes popularitas. Anda mendapatkan dua orang ekstra ditambahkan ke skor Anda jika tidak ada kata-kata berikut muncul dalam program Anda dalam variasi kasus: {"do", "the", "needful"}. Skor adalah jumlah suara ditambah bonus jika berlaku.

Tunjangan

Jika komentar muncul dalam string literal, Anda dapat mengubahnya // Do the needfuljuga. Lagi pula ... Anda tidak akan pernah memiliki cukup kebutuhan.


5
Anda tahu bahwa bonus mudah diperoleh dengan menggunakan "d" + "o", "t" + "he"dan "need" + "ful"? Juga, apakah pengajuan harus dapat menangani setiap C valid, C ++ atau kode Java? Itu cukup keras dan sama dengan menulis lexer untuk ketiga bahasa (saya sedang memikirkan literal komentar dalam string dan sebaliknya.) Jika demikian, bagaimana dengan perpustakaan lexer pihak ketiga?
Martin Ender

2
Apa yang harus dilakukan program ketika /* ... */mendahului non-komentar pada suatu baris?
Greg Hewgill

1
Apakah kita perlu mempertimbangkan kasus seperti char str[]="/**///";atau urutan komentar mulai /*muncul dalam /*komentar, atau garis miring terbalik muncul dalam //komentar, atau //komentar dalam /**/komentar?
user12205

3
Mengapa menjadikan ini kontes popularitas dan bukan kode golf? Ini berfungsi dengan baik seperti golf.
Aaronaught

2
akhirnya banyak solusi didasarkan pada penggantian regex yang sama. Bagaimana dengan beberapa poin bonus untuk solusi non regex?
SepupuCocaine

Jawaban:


4

CoffeeScript (66 byte)

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

Kode ini akan menguraikan string, tetapi ada alasan bagus. Anda lihat, ada kemungkinan bahwa ada komentar di templat yang menghasilkan /**/komentar C.

Ini mendapat bonus, karena menghindari kasus yang sebenarnya pertandingan sensitif untuk Do, the, dan needful. Ini juga menggunakan ES5 candle ( [^]) operator untuk melakukan hal-hal. Saya akan memberikan komentar Do the needfuldalam program ini, tetapi itu akan menghapus bonus.


6

Perl, 68 karakter

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

Ini memerlukan beberapa kebebasan dengan spesifikasi, dan mempertahankan gaya komentar asli. Ini menghindari masalah dengan /* ... */komentar yang muncul sebelum akhir baris.

Tidak ada upaya yang dilakukan untuk menghindari komentar dalam string literal, dan tidak ada klaim yang dibuat untuk poin bonus.


Saya memiliki bola menggunakan ini pada kode sumber!
ojblass

2
Saya akan mengatakan itu meningkatkan beberapa gaya komentar.
Greg Hewgill

Anda bisa mendapatkan poin bonus seperti ini
ojblass

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

1
@FDinoff: Ya, itu adalah kebebasan yang saya ambil untuk menyederhanakan masalah, jika tidak Anda harus mencari tahu apa yang harus dilakukan dengan baris kode di mana /* ... */komentar mendahului kode aktual (Anda tidak dapat secara naif mengubahnya menjadi //komentar).
Greg Hewgill

5

Perl

Anarki dunia pertama! :)

"Kamu tidak akan pernah merasa cukup membutuhkan"

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

Karena ini bukan kode golf, saya tidak meributkan panjang kode. Tidak ada yang mengesankan, tapi saya senang mengingat / mempelajari kembali dasar-dasar 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 karakter

Dapat ditingkatkan. Saya belajar banyak tentang sed saat membuat ini.

Membaca dari input standar, output ke output standar. Mengasumsikan input yang valid - jika Anda memiliki komentar yang tidak ditentukan, itu tidak akan memperlakukannya sebagai komentar.

Diuji pada GNU sed v4.2.2.

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

Dan hadiah untuk dibaca adalah ....?

Versi satu-baris:

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

Penjelasan

Aliran kontrol melompati banyak, melalui pernyataan GOTO (ya, begitu juga mereka!). sed tidak memiliki loop atau pernyataan kondisional AFAIK yang mudah.

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

Ya, BrainFuck adalah bahasa lengkap Turing.
Semoga berhasil memahami kode ini.

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

Pada dasarnya, pseudo-code adalah:

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
}

Beberapa penerjemah online rusak.
Coba di sini dengan contoh yang diberikan oleh OP (diakhiri dengan null-char untuk memutus loop dengan benar):

#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

Rebol

Ini bukan kode golf, jadi saya akan bertele-tele.

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
 ]

(Catatan: Untuk alasan politis, saya mendorong GABUNGAN di sini, tetapi belum standar . Jadi jika Anda benar-benar ingin menjalankan ini, gunakan REJOIN. Tapi saya benci REJOIN. Kutil pada bahasa yang indah! Ceritakan lingkungan Anda yang ramah Red dev mengarah untuk mendengarkan saya. Terima kasih.)

PARSE adalah dialek, atau bahasa-dalam-bahasa, di Rebol dan Merah. Itu memutar hal-hal, jadi misalnya jenis simbol yang digunakan untuk penugasan ( terminator:dalam terminator: newline) mengambil makna baru ketika digunakan dalam paradigma kode-sebagai-data ... itu menyimpan posisi parse saat ini menjadi variabel dengan nama itu . Anda dapat membaca lebih lanjut tentang mengapa ini keren di sini .


UPDATE: Oh baiklah, saya akan golf juga. Di Rebmu , 72 karakter ... menggunakan rebmu / args yang menyuntikkan A sebagai argumen:

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

Program yang sama persis.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.