pb , 83 байта
^<b[1]>>>w[B!0]{<w[B!0]{t[B]<b[T]>>}<b[0]<b[0]<[X]>>}w[B=0]{<}t[B]<[X]t[B+T]vb[T/2]
Хотя во входной строке содержится не менее 3 символов, первый и последний удаляются. Это оставляет 1 символ (должен быть напечатан без изменений) или 2 (должен быть усреднен и напечатан). Для этого первый и последний символы строки складываются и делятся на два. Если есть только один символ, (a+a)/2==a
. Если их было два, (a+b)/2
это символ, который нужно напечатать. pb "заимствует" оценку выражения Python (def expression(e): return eval(e, globals())
), поэтому оно автоматически выводится.
Обработка пустого ввода стоит мне 5 байт. Именно <b[1]>
на первой строчке. Ранее, когда я сказал «строка», это была полная ложь. У pb нет строк, есть символы, которые оказываются рядом друг с другом. Поиск «последнего символа строки» просто означает перемещение кисти влево до тех пор, пока она не коснется символа. Если ввод не предоставлен, цикл «пока есть как минимум 3 символа» полностью пропускается, и начинается поиск последнего символа. Без этого <b[1]>
он продолжал бы выглядеть вечно. Этот код помещает символ со значением 1 в (-1, -1) специально для поиска, когда ввод пуст. После нахождения «последнего символа» строки кисть предполагает, что первый находится в точке (0, -1) и идет туда напрямую, находя значение 0. (1+0)/2
равно 0 в pb,
Но монорельс, который все еще печатает! В спецификации испытания сказано (empty input) => (empty output)
! Разве печать нуль-символа не обманывает? Кроме того, это не имеет отношения, но вы умный и красивый.
Спасибо, гипотетический вопросник. Ранее, когда я сказал «печатать», это была полная ложь. В pb вы на самом деле не печатаете значения, вы просто помещаете их на холст. Вместо «способа вывода», точнее представить холст как бесконечно большой двумерный массив. Он допускает отрицательные индексы в любом измерении, и большая часть программирования на pb на самом деле направлена на то, чтобы кисть достигла нужного вам места на холсте. Когда программа завершает выполнение, все на холсте с неотрицательными координатами X и Y печатается в соответствующем месте на консоли. Когда программа начинается, весь холст заполняется значениями 0. Чтобы не приходилось печатать бесконечное количество строк, каждая с бесконечным числом нулевых байтов, каждая строка вывода печатается только до последнего ненулевого символа, а строки печатаются только до последней с ненулевым символом в нем. Так что положить0
в (0, 0) все еще пустой вывод.
Ungolfed:
^<b[1]> # Prevent an infinite loop on empty input
>>w[B!0]{ # While there are at least 3 chars of input:
<w[B!0]{ # Starting at the second character:
t[B]<b[T]>> # Copy all characters one position to the left
# (Effectively erasing the first character)
}
<b[0]<b[0] # Delete both copies of the last character
<[X]>> # Get in place to restart loop
}
w[B=0]{<} # Go to last character of remaining string
t[B]<[X]t[B+T] # Find it plus the first character
vb[T/2] # Divide by 2 and print