Рецензент Кода Python

  • Автор темы Vikotop987
  • Обновлено
  • 23, Oct 2024
  • #1

Задача

Ваша миссия — создать программу, которая проверяет код Python. Решение можно написать на любом языке!

Он должен принимать входные данные, содержащие код Python. В программу необходимо добавить

 
 
 # This is not pythonic!
from os.path import abspath

# This is not pythonic!
lines = []
with open(__file__, 'r') as f:

for line in f:

lines.append(line)

# This is not pythonic!
if lines is not None:

# This is not pythonic!

newLines = []

hasReviewedBlock = False

# This is not pythonic!

for line in lines:

if len(line) > 1: # \n

if hasReviewedBlock == False:

newLines.append("# This is not pythonic!\n")

hasReviewedBlock = True

else:

hasReviewedBlock = False

# This is not pythonic!

newLines.append(line)

with open("d:/test.py", 'w') as f:

for line in newLines:

f.write(line);
 
before each block of non-whitespace lines.

Вход

  • Данные можно вводить через стандартный ввод.
  • Данные будут содержать как минимум 3 строки с одной пустой между ними.

их.

from os.path import abspath lines = [] with open(__file__, 'r') as f: for line in f: lines.append(line) if lines is not None: newLines = [] hasReviewedBlock = False for line in lines: if len(line) > 1: # \n if hasReviewedBlock == False: newLines.append("# This is not pythonic!\n") hasReviewedBlock = True else: hasReviewedBlock = False newLines.append(line) with open("d:/test.py", 'w') as f: for line in newLines: f.write(line);

Пример минимального ввода.

print "Hello World!" Print "Bye World!"

Пример ввода

Выход

Вывод должен быть записан в STDOUT или ближайший альтернативный формат.

# This is not pythonic!

Пример вывода

Оценка:

Выигрывает наименьшее количество байтов. -5 байт, если ваша программа может использоваться в качестве допустимого ввода.

Vikotop987


Рег
28 Jun, 2015

Тем
85

Постов
208

Баллов
633
  • 26, Oct 2024
  • #2

awk, 64 56 54 байта

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 p=''

for c in open(0).read().splitlines():print("# This is not pythonic!\n"*(p==''!=c)+c);p=c
 

Тест:

import re print(re.sub(r"(^\n*|\n\n+)",r"\1# This is not pythonic\n",open(0).read()))

Объяснение:

f=p=>alert((r='# This is not pythonic!\n')+p.replace(/\n\n+/g,x=>x+r)) //// TEST CASES ///// t1=`print "Hello World!" Print "Bye World!"` f(t1) t2=`from os.path import abspath lines = [] with open(__file__, 'r') as f: for line in f: lines.append(line) if lines is not None: newLines = [] hasReviewedBlock = False for line in lines: if len(line) > 1: # \n if hasReviewedBlock == False: newLines.append("# This is not pythonic!\n") hasReviewedBlock = True else: hasReviewedBlock = False newLines.append(line) with open("d:/test.py", 'w') as f: for line in newLines: f.write(line);` f(t2) - matches empty line,

qN/{_L!e&{"# This is not pythonic!"\}&:L}%N* - matches non-empty line,

"# This is not pythonic!":TNqN/{_{T}|}%N* - matches each line. No body is equivalent to {S:g/ / /} # Substitute all instances of ^ # The start of the string |" " # or two newlines <( # But don't actually replace, just append ... # With the given string - печатается каждая строка ввода.

 

Daniana


Рег
18 Oct, 2009

Тем
64

Постов
192

Баллов
532
  • 26, Oct 2024
  • #3

АвтоИт - 139

{S:g/^|" "<(/# This is not pythonic! /}

Я предполагаю, что первая строка не может быть пустой, как указано в вашей спецификации:

Данные будут содержать как минимум 3 строки с одной пустой между ними.

Эта программа называется так:

Fn.new{|i| // In this case we define a new // anonymous function with the operand i (" "+i) // We prepend the input with 2 newlines .split(" ") // Split the input by newlines, // including the preceding newlines // that we first prepended .join(" # This is not pythonic! ") // Join the input with 2 newlines // , the comment, and another trailing newline [2..-1]} // Slice the input so that the preceding // 2 newlines are not present in the final output ```

RegEx наверняка можно оптимизировать. Работает для Fn.new{|i|(" "+i).split(" ").join(" # This is not pythonic! ")[2..-1]} only.

 

Firlast


Рег
18 Feb, 2004

Тем
80

Постов
191

Баллов
621
  • 26, Oct 2024
  • #4

Пиф, 39 38 37 байт

jbtsm?dd,d"# This is not pythonic!"+k.z

Живая демонстрация.

Объяснение

tjbm?dd+b"# This is not pythonic!"+k.z

38-байтовая версия

tjbm|d+b"# This is not pythonic!"+k.z +k.z Prepend the empty line to the string m For each line |d If it's non-empty, return the same line +b"# This is not pythonic!" Else, return a line break followed by the required text jb Join via line breaks t Remove the unneeded preceding line break

39-байтовая версия

tjbm|d+b"# This is not pythonic!"+k.z

Без сомнения, нам еще предстоит заняться гольфом.

 

Bambinos


Рег
18 May, 2008

Тем
72

Постов
186

Баллов
566
  • 26, Oct 2024
  • #5

Крапивник, 73-5 = 68 байт

К счастью, у Рена есть автоматический WYSIWYG, который дает бонус.

CRLF

Попробуйте онлайн!

Объяснение

compiled.exe pycode.py > output.txt ||answer||

Перл 6, 40 - 5 = 35 байт

$1='# This is not pythonic!' ConsoleWrite($1&@CRLF&StringRegExpReplace(FileRead($CmdLine[1]),'(*BSR_ANYCRLF)(^\R|\R(?=\R))',"\0"&@CRLF&$1))

Попробуйте онлайн!

Бонус довольно странный, но его добавление не стоило мне никаких байтов.

Объяснение

{print;} ||answer||

CJam, 41 байт

1

Попробуйте онлайн

Альтернативное решение, которое обрабатывает несколько пустых строк подряд, а также пустые строки в начале. Это 44 байта, и оно станет моим решением в зависимости от того, какими окажутся ожидающие разъяснения:

/./ ||answer||

JavaScript (ES6), 70

Проверьте выполнение приведенного ниже фрагмента.

/^$/ ||answer||

Питон 3, 86 байт - 5 = 81

echo '/^$/{i=0}/./{if(!i++)print"# This is not pythonic!"}1' > solution.awk awk -f solution.awk < pyth.py awk -f solution.awk < pyth.py

Попробуйте онлайн!


Питон 3, 94 байта - 5 = 89

/^$/{i=0}/./{if(!i++)print"# This is not pythonic!"}1

Попробуйте онлайн!

 

OnlyWhat


Рег
27 Apr, 2014

Тем
78

Постов
196

Баллов
596
Тем
403,760
Комментарии
400,028
Опыт
2,418,908

Интересно