Objetivo
Substitua todos os comentários em C, C ++ ou Java Code pelo comentário // Do the needful
.
Específicos
Esse desafio de codificação é simples. Tome como entrada o nome de um arquivo. O arquivo de entrada deve conter código C, C ++ ou Java. O código deve conter um ou mais comentários. Os comentários podem ser delimitados por uma única linha /* */
ou //
delimitados por várias linhas /* */
. A saída do programa deve ser idêntica à entrada, exceto que todos os comentários devem ser convertidos em // Do the needful
.
Por exemplo, se o arquivo de entrada for:
#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);
}
A saída do programa deve ler
#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);
}
Pontuação
Este é um concurso de popularidade. Você ganha dois votos extras adicionados a sua pontuação se nenhuma das seguintes palavras aparece em seu programa em qualquer variação caso: {"do", "the", "needful"}
. Pontuação é o número de votos mais bônus, se aplicável.
Subsídios
Se os comentários aparecerem em literais de string, é aceitável convertê-los // Do the needful
também. Afinal ... você nunca pode ter o suficiente necessário.
fonte
"d" + "o"
,"t" + "he"
e"need" + "ful"
? Além disso, o envio precisa ser capaz de lidar com qualquer código C, C ++ ou Java válido ? Isso é bastante duro e equivale a escrever um lexer para os três idiomas (estou pensando em literais de comentários em strings e vice-versa.) Se sim, o que dizer das bibliotecas lexer de terceiros?/* ... */
precede um não comentário em uma linha?char str[]="/**///";
ou uma sequência de início de comentário/*
aparece em um/*
comentário ou uma nova barra invertida aparece em um//
comentário ou um//
comentário em um/**/
comentário?Respostas:
CoffeeScript (66 bytes)
Esse código analisará as strings, mas há um bom motivo. Veja bem, existe a possibilidade de haver um comentário em um modelo que gera
/**/
comentários em C.Este recebe o bônus, pois evita casos exata partidas insensíveis para
Do
,the
, eneedful
. Ele também usa o[^]
operador vela do ES5 ( ) para fazer as coisas. Eu colocaria um comentárioDo the needful
neste programa, mas isso removeria o bônus.fonte
Perl, 68 caracteres
Isso requer algumas liberdades com a especificação e mantém o estilo de comentário original. Isso evita o problema com
/* ... */
comentários que aparecem antes do final da linha.Nenhuma tentativa é feita para evitar comentários dentro de literais de string e nenhuma reivindicação é feita para os pontos de bônus.
fonte
/* ... */
comentário precede o código real (você não pode transformá-lo ingenuamente em um//
comentário).Perl
Anarquia do primeiro mundo! :)
"você nunca pode ter o suficiente necessário"
fonte
Python 3.x, regex
Como não é um código de golfe, não me preocupei com o tamanho do código. Nada impressionante, mas eu me diverti lembrando / reaprendendo noções básicas sobre regex.
fonte
sed, 90 caracteres
Poderia ser melhorado. Eu aprendi muito sobre sed enquanto fazia isso.
Lê da entrada padrão, saídas para saída padrão. Pressupõe entrada válida - se você tiver comentários não terminados, não será tratado como um comentário.
Testado no GNU sed v4.2.2.
E o prêmio de legibilidade vai para ....?
Versão de uma linha:
Explicação
O fluxo de controle salta bastante, por meio de instruções GOTO (sim, o sed as possui!). O sed não possui loops ou declarações condicionais convenientes AFAIK.
fonte
BrainFuck
Sim, o BrainFuck é uma linguagem completa de Turing.
Boa sorte para entender este código.
Basicamente, o pseudocódigo é:
Algum intérprete online está quebrado.
Tente aqui com o exemplo dado pelo OP (terminado com null-char para interromper o loop corretamente):
fonte
Rebol
Não é código de golfe, então eu vou ser prolixo.
(Nota: Por razões políticas, estou pressionando COMBINE aqui, mas ainda não é padrão . Portanto, se você realmente deseja executar isso, use REJOIN. Mas eu odeio REJOIN. Uma verruga em uma linguagem de outra maneira bonita! leva a me ouvir. Obrigado.)
PARSE é um dialeto, ou idioma dentro de um idioma, em Rebol e Red. Ele torce as coisas, por isso, por exemplo, os tipos de símbolos que são usados para atribuição (o
terminator:
noterminator: newline
) assume um novo significado quando utilizados no código-as-dados paradigma ... ele salva a posição de análise atual em uma variável com esse nome . Você pode ler mais sobre por que é legal aqui .ATUALIZAÇÃO: Ah, tudo bem, eu também vou jogar golfe. No Rebmu , 72 caracteres ... usando rebmu / args, que injeta A como argumento:
pa DtsRDa[anTO["/*"(T"*/")|"//"(Tlf)]SthT F(chpS"// Do the needful^/"f)]d
Exatamente o mesmo programa.
fonte