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 ви не дуже друкуєте значення, ви просто розміщуєте їх на полотні. Замість того, щоб "спосіб вивести", точніше уявити полотно як нескінченно великий 2D масив. Це дозволяє негативні показники в будь-якому вимірі, і багато програмування в pb насправді полягає в тому, щоб кисть потрапила до місця на полотні, яке ви хочете. Коли програма закінчить виконання, все на полотні з негативними координатами X та Y надрукується у відповідному місці на консолі. Коли програма починається, все полотно заповнюється значеннями 0. Щоб не потрібно було друкувати нескінченну кількість рядків, кожен з яких має нескінченну кількість нульових байтів, кожен рядок виводу друкується лише до останнього ненульового символу, а рядки друкуються лише до останнього з ненульовим символом. Тож ставимо0 при (0, 0) все ще порожній вихід.
Безголівки:
^<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