Створити / * коментарі до рядків * /


12

Ваше завдання - написати програму (або функцію), яка буде приймати рядок як введення та додавати текст до початку кожного рядка, який відповідає таким правилам:

  • Доданий текст повинен містити номер рядка. Ви можете використовувати індексацію на основі 0 або 1.
  • Текст повинен бути коментарем на вашій мові. Коментар визначається як синтаксично дійсний фрагмент коду, який не вносить змін у стан програми. Видалення коментаря не повинно змінювати програму.
  • Коментар може містити лише нові рядки в кінці.
  • Не потрібно ставити номери рядків для рядків, що містять просто пробіли та коментарі.

Технічні умови

  • Ви можете припустити, що вхід буде дійсною програмою для вашої мови.
  • На чутливих до відступу мовах, таких як Python, ви можете розмістити коментар до номера рядка після всіх відступів. Ви можете вибрати вкладки або пробіли для позначення відступу, але ви повинні вказати у своїй публікації.
  • Ви можете припустити, що кожне твердження в коді займе максимум 1 рядок; тобто немає рядкових рядків або продовження зворотної косої риси

Випробування

Пітон:

#0
a = int(input())
#1
while a:
    #2
    print(a)

C: (Чесно кажучи, я здивований цій компіляції)

/*0 */#include <stdio.h>
/*1 */int main()
/*2 */{
/*3 */    char c;
/*4 */    c = getchar();
/*5 */    do
/*6 */    {
/*7 */        putchar(c);
/*8 */    }
/*9 */    while (c);
/*10*/}

Це , тому найкоротша відповідь (у байтах) виграє.


7
Створення коментарів залежно від мови ускладнює ситуацію. Вам вже довелося створити спеціальне правило для Python. Що з усіма іншими мовами, які не мають багаторядкових коментарів? Як щодо мов, які взагалі не мають коментарів. Що з багаторядкових рядків, де коментарі не можна розміщувати без побічних ефектів?
Денніс

4
Приємний факт: правило "видалення коментаря не повинно змінювати програму" негайно дискваліфікує будь-яку відповідь Python, оскільки код, включаючи коментарі, може бути інтроспекцією під час виконання. Я бачив це, граючи у виробничій системі: фрагмент коду призведе до того, що, AssertionErrorякщо слід стека не міститиме фразу foo.py, яка, як очікується, походить від імені файлу, але також може з'являтися як коментар до рядка в контексті.
wchargin

2
" Коментар може містити лише нові рядки в кінці ", що не відповідає "С" тестовому випадку ".
Пітер Тейлор

2
А що з лонгами без коментарів?
NoOneIsHere

4
Редагування не виправляє непослідовність.
Пітер Тейлор

Відповіді:


5

Пайк, 7 байт

o\Kz++r

Спробуйте тут!

o       -  o++
 \K     -  "K"
   z    -  input()
    ++  - sum(^)
      r - while no errors: GOTO start

Я оголошую цілі коментарі цілим числом, за яким слідує символ, Kа потім рядок. Додатковий байт використовується для того, щоб запобігти введенню нового рядка коду і надрукувати додаткову річ.


16

Perl, 8 + 1 = 9 байт

say"#$."

Виконати з -p(1 байт). (Зверніть увагу на людей, незнайомих з правилами PPCG; вам також потрібно вказати сучасну версію синтаксису Perl, використовуючи -M5.010, але ми вирішили, що варіанти вибору мовних версій є безкоштовними і не несуть байтового штрафу, тому я не згадував це в оригінальна версія цієї публікації.)

-pрозміщує програму в неявному циклі; це в основному призводить до того, що програма стає фільтром, який обробляє кожен рядок окремо (тобто вся програма запускається на першому рядку, потім на другому, потім на третьому тощо). Perl також відстежує номер рядка, який називається $., який записує, скільки рядків вводу було прочитано. Отже, все, що робить програма, - це дозволити -pпрочитати рядок введення; виведіть a #, номер поточного рядка ( $.) і новий рядок ( sayдодає новий рядок за замовчуванням, що корисно в цьому випадку, а також коротше, ніж частіше зустрічається print); а потім -pвипускати вихідний рядок коду, який він читав (як правило, програма, що використовує-pзробили б якусь обробку на вході, але, оскільки ми цього не зробили, це просто вихід без змін). Коментарі в Perl запускаються з #нового рядка ( #в самій програмі коментар не починається, тому що це всередині рядкового літералу), тому те, що ми в основному робимо, - це скористатися можливістю записувати рядки коментарів у файл під час його обробки. , не порушуючи "природного" циклу читання і запису -p.


Чи можете ви пояснити, як це працює?
Адам

Звичайно. Я пояснював роботу відповідних функцій мови Perl у стилі підручника, враховуючи, що це дуже проста програма Perl, яка насправді не дуже сильно використовує силу мови. Мені потрібно пам’ятати, що не всі знають, як працює -pцикл або автоматично оновлений номер рядка.

Зверніть увагу, що say"$.;"це також спрацювало б, оскільки в питанні було вказано, що "Ви можете припустити, що кожне твердження в коді займе не більше 1 рядка".
msh210

Це насправді не коментар; Хоча це не робить нічого корисного, він опиняється в AST (і тому, що оптимізатор Perl є начебто вдалим, я думаю, що насправді це призведе до уповільнення роботи програми, що ви насправді не хотіли б зробити коментар).

Не працює для правила. Не потрібно вводити номери рядків для рядків, що містять просто пробіли та коментарі.
Денис Ібаєв

9

Javascript, 43 39 байт

a=>a.replace(/^/gm,_=>`/*${++b}*/`,b=0)

Завдяки ETH та Conor за збереження 4 байтів.


41 байт: a => (b = 0, a.replace (/ ^ / gm, _ => /*${++b}*/)) (використовуйте рядок для форматування)
Conor O'Brien

1
39 байт:a=>a.replace(/^/gm,_=>`/*${++b}*/`,b=0)
ETHproductions


3

Пакет, 91 байт

@set n=
@for /f "delims= tokens=*" %%a in (%1) do @set/an+=1&call echo @rem %%n%%&echo %%a

Пакет не має способу зчитування STDIN до EOF, тому натомість ім'я файлу має бути передано як параметр командного рядка.


3

Луа, 80 75 байт

Збережено кілька байт, зловживаючи мовою.

x=1print("--[[1]]"..(...):gsub("\n",load('x=x+1return"\\n--[["..x.."]]"')))

Досить проста відповідь для початківців.

Безголів, +

x=1                                                     -- Assign x to 1...
print(                                                  -- Print...
      "--[[1]]"                                         -- The first line number comment...
      ..                                                -- With...
      (...):gsub(                                       -- The input, replacing all...
                 "\n",                                  -- Newlines...
                    load                                -- with a string compiled function...
                    (' \
                    x=x+1                               --Increment x by one... \
                    return"\\n--[["..x.."]]"            -- And return the new linecomment. \
                    ')
                 )
      )

Я не знаю Луа, але ви впевнені, що вона завжди створюватиме коментарі однакової довжини? Наприклад, якщо програма довжиною на 10 рядків, то останній коментар буде на --[[10]]1 символ довший, --[[9]]якщо ви правильно не зафіксували пробіли.
Esolanging Fruit

1
О, я цього правила не помітив. Це здається ... Трохи зайвим ...
Атако

1
Так. Можливо, я його зніму ... [EDIT]: видалено.
Esolanging Fruit

3

Гема, 16 15 символів

*\n=\!@line\n$0

У Gema є лише рядкові коментарі, починаючи з !.

Проба зразка:

bash-4.3$ cat l33t.gema 
e=3
g=9
i=1
o=0
t=7

bash-4.3$ gema -f l33t.gema <<< 'Hello World!'
H3ll0 W0rld!

bash-4.3$ gema '*\n=\!@line\n$0' < l33t.gema > l33t-nr.gema

bash-4.3$ cat l33t-nr.gema
!1
e=3
!2
g=9
!3
i=1
!4
o=0
!5
t=7

bash-4.3$ gema -f l33t-nr.gema <<< 'Hello World!'
H3ll0 W0rld!

Далі слід відповісти на питання Адама , чи можна додати номер рядка на зразок ігнорованого коду.

Код Gema по суті є сукупністю від = до правил перетворення, або шаблон = дія в термінах Gema. Я не бачу способу визначення шаблону, який ніколи ні з чим не збігається, це одне, мабуть, не є способом.

Гема, 18 символів

*\n=c:\=@line\;:$0

Перетворюється e=3в c:=1;:e=3.

На щастя в Gema є домени , види просторів імен. Вищевказаний код визначає фіктивні правила в просторі імен c, які ми ніколи не використовуємо. На жаль, згаданий домен залишається чинним до кінця рядка, тому нам доведеться явно повернутися до домену за замовчуванням.

Гема, 18 символів

*\n=@line\=\$0\;$0

Перетворюється e=3в 1=$0;e=3.

Менш складною альтернативою є використання безефективного коду замість ігнорованого. Я маю на увазі повернути саме те, що відповідало.


Але ви не можете вставити рядок і мати якийсь код навколо нього, який робить його ігнорованим?
Adám

Ви маєте на увазі вид e=3трансформованого if (false) { 1 }; e=3замість струму !1␤e=3? Так, було б вирішення довгих 19 символів.
манатура

2

Qbasic, 91 89 байт

OPEN"I",1,"i"
OPEN"O",2,"o"
DO UNTIL EOF(1)
i=i+1
INPUT#1,a$
PRINT#2,STR$(i)+"'"+a$
LOOP

Вхід:

CLS
PRINT "Hello!"
a$="Welcome"
INPUT "Type your name: ", b$
PRINT a$; ", "; b$
END

Вихід:

 1'CLS
 2'PRINT "Hello!"
 3'a$="Welcome"
 4'INPUT "Type your name: ", b$
 5'PRINT a$; ", "; b$
 6'END

1
Колись я використовував QBasic, але чи не це робить текст програми коментарем, а не номерами рядків? Або я щось спогадую?

Дякую за вклад! Насправді, 'справедливі коментарі до того, що випливає з лінії.
анонімний2

4
Так, саме тому я думаю, що це перетворює програму на коментарі. Замість того, щоб просто додавати номери рядків, він змінює значення на програму, яка нічого не робить. (Чесно кажучи, було б здорово для запису в діалекті BASIC додати реальні номери рядків і перенумерувати програму, якщо вона вже має номери, але це, мабуть, не дуже потрібно.)

2

BASH (+ GNU sed) 27 байт

sed 'i#
='|sed 'N;s/\n//;N'

Перша частина ( i# \n =) майже працює в sed GNU (на 4 байти), але вона ставить новий рядок після #.


2

awk ( 19 13 байт)

19 байт : Цей вставте "#" + номер рядка над кожним рядком коду

{print"#"NR"\n"$0}

13 байт : Кредит і подяка @manatwork за два 13-байтні рішення

Як 1налаштування за замовчуванням print $0:

{print"#"NR}1

Або замінивши $0вміст

$0="#"NR RS$0

{print"#"NR}1або $0="#"NR RS$0?
манантська робота

@manatwork Мені дуже соромно і вдячно відкрити для себе ці допоміжні програми
Адам,

2

Функція розширення Котліна, 69 60 байт

fun String.a()=lines().mapIndexed{i,s->"/*$i*/$s"}.joinToString("\n")

fun String.a(){lines().mapIndexed{i,s->println("/*$i*/$s")}}

Приклад використання:

fun main(args: Array<String>) {
  //language=kotlin
  val code = """fun main(args: Array<String>) {
  println("Hello world!")
}"""
  code.a()
}

Вихід:

/*0*/fun main(args: Array<String>) {
/*1*/  println("Hello world!")
/*2*/}

1

CJam, 21 байт

Я взагалі не в курсі CJam, але я знав, що в ньому є коментарі :)

qN%ee{"e#"o(oNo(oNo}/

Пояснення найближчим часом.


oNoможна замінити nна TIO.
Esolanging Fruit

1

Математика, 58 байт

i = 1; StringReplace[#, StartOfLine :> "(*" <> ToString@i++ <> "*)"] &

1

jq, 31 символ

(Код 27 символів + параметри командного рядка з 4 символами.)

"#\(input_line_number)\n"+.

У jq є лише рядкові коментарі, починаючи з #.

Проба зразка:

bash-4.3$ cat l33t.jq 
gsub("e";"3")|
gsub("g";"9")|
gsub("i";"1")|
gsub("o";"0")|
gsub("t";"7")

bash-4.3$ jq -Rr -f l33t.jq <<< 'Hello World!'
H3ll0 W0rld!

bash-4.3$ jq -Rr '"#\(input_line_number)\n"+.' l33t.jq > l33t-nr.jq

bash-4.3$ cat l33t-nr.jq 
#1
gsub("e";"3")|
#2
gsub("g";"9")|
#3
gsub("i";"1")|
#4
gsub("o";"0")|
#5
gsub("t";"7")

bash-4.3$ jq -Rr -f l33t-nr.jq <<< 'Hello World!'
H3ll0 W0rld!

Шановні кодери Perl і Ruby, будь ласка, дотримуйтесь jq input_line_number. Будучи Днем подяки, якесь особливе почуття висловити $.?
манатура

1

GolfScript, 23 байти

n/0:i;{"#"i):i+n+\+}%n*

Є лише рядкові коментарі, що починаються з "#".

Необережений і пояснив:

           # the input is pushed on the stack automatically
n          # n is a predefined variable for "\n"
/          # splits the input string with the previously pushed "\n" as delimiter
0:i;       # i = 0
{          # A code block: It is used for map here (going through the input)
    "#"    # push a "#" onto the stack
    i):i  # save i + 1 in i, the value is again not popped from the stack
    +      # implicitly converts the number i to a string and concatenates "#" with it
    n      # newline
    +      # add a newline (# introduces a *line* comment)
    \      # switch the top to elements (-> yields the comment as the bottom, and the line as the top element on the stack)
    +      # concatenate them
}          # end of the code block
%          # map
n          # newline
*          # join the list with newlines between them
           # outputs are done implicitly

Я майже впевнений, що це може бути ще більше спрощено, особливо це iможе бути залишено.

Ви можете перевірити його тут: https://golfscript.apphb.com/ Оскільки цей сайт не підтримує додавання входів, вам доведеться поставити рядок, оточений подвійними лапки перед кодом. '\n'буде новий рядок. Будьте в курсі, що є й інші послідовності втечі. Користувач, '\\'якщо ви не впевнені.


1

C # 6, 66 61 байт

Завдяки CSharpie

(666, код чортів ^^) вже не ...

Це працює для всіх мов, використовуючи "коментарі у стилі C" (C, C ++, C #, Java, ....)

Він просто розбиває рядок на рядки, попередньо додає кожен рядок до свого індексу та знову приєднується до редагуваних рядків із новими символами рядків.

s=>string.Join("\n",s.Split('\n').Select((l,i)=>$"/*{i}*/"+l));

стара версія:

s=>string.Join("\n",s.Split('\n').Select((l,i)=>$"/*{i,3}*/{l}"));

1
Технічно 64 з тих пір, як оп не згадували про будь-яку прокладку з нулями. Також ви можете зберегти ще 1 байт, wirting: $ "/ * {i} * /" + l. (
Виведення

Ви маєте рацію ^^ але це знищує мій "злий рахунок" hehe
Стефан

0

Python 2, 82 байти

Працює для відступу лише для місця

for i,l in enumerate(input().split('\n')):print l.split(l.lstrip())[0]+'#%d\n'%i+l

Версія без відступу на 56 байт

for x in enumerate(input().split('\n')):print'#%d\n%s'%x
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.