Знайдіть центр


24

Давши рядок символів ASCII, виведіть символ, який знаходиться посередині. Якщо середнього символу немає (коли рядок має рівну довжину), виведіть символ ASCII, порядковий розмір якого є середнім значенням двох центральних символів. Якщо рядок порожній, слід вивести порожній рядок.

Тестові приклади:

12345 => 3

Hello => l

Hiya => q

(empty input) => (empty output)

Виграє найкоротша програма в символах. (Не байт.)

Таблиця лідерів

Фрагмент стека внизу цієї публікації генерує таблицю лідерів з відповідей а) як список найкоротших варіантів для кожної мови та б) як загальну таблицю лідерів.

Щоб переконатися, що ваша відповідь відображається, будь ласка, почніть свою відповідь із заголовка, використовуючи наступний шаблон Markdown:

## Language Name, N characters 

де Nрозмір вашого подання. Якщо ви покращите свій рахунок, ви можете зберегти старі бали у заголовку, прокресливши їх. Наприклад:

## Ruby, <s>104</s> <s>101</s> 96 characters 

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

## Perl, 43 + 2 (-p flag) = 45 characters 

Ви також можете зробити ім'я мови посиланням, яке з’явиться у фрагменті:

## [><>](http://esolangs.org/wiki/Fish), 121 characters 


15
Зазвичай ми набираємо байти, щоб люди не могли стиснути весь код, оскільки це призводить до нудних рішень. Ви впевнені, що цього хочете?
Вниз

1
@ Vɪʜᴀɴ Я не думаю, що це буде проблемою, оскільки рішення все одно буде дуже коротким, тому стискати його не варто.
Ypnypn

9
Ласкаво просимо до PPCG! Чудовий перший виклик!
Conor O'Brien

2
Чи можемо ми записати функції?
Вниз

10
Порада: кодуйте свої відповіді в UTF-32. 4 байти на символ. А може ОП просто позбудеться балів персонажів.
Мего

Відповіді:


9

Pyth, 15 байт

Cs.O@R/lz2_BCMz

Демонстрація

Починаючи з "Hiya" як вхід:

              z    "Hiya"                                      Input
            CM     [72, 105, 121, 97]                          Character values
          _B       [[72, 105, 121, 97], [97, 121, 105, 72]]    Pair with reversal
      /lz2         2                                           Halfway index
    @R             [121, 105]                                  That element in each
  .O               113.0                                       Average
 s                 113                                         Floor
C                  "q"                                         Cast to character
                   q                                           Print implicitly

Зауважте, що це виходить з помилки на порожньому вході, і нічого не друкує до STDOUT, що є коректним способом виведення порожньої рядка за замовчуванням у код-golf.


Bifurcate знову показує свою корисність.
lirtosiast

Whoa bifurcate - це дивовижно.
Малтісен

@KenanRhoton У відповідь на запропоновану редакцію перегляньте документ, який додав Cфункціонал настилу: github.com/isaacg1/pyth/commit/0baf23ec Зверніть увагу на день його додавання, того ж дня було задано це питання. Це тому, що це питання надихнуло мене додати цю функціональність, зробивши її непридатною для використання в цьому питанні.
isaacg

8

Brainf ***, 61 байт

Китайська , 16 символів

Для цього потрібно, щоб вхід знаходився в діапазоні 1-127 ASCII і закінчується нулем. Він видаляє пари символів з початку і в кінці рядка, поки не залишиться один або два символи. Якщо є два, він додає їх разом, потім ділить на 2, округлюючи вниз. Решта символу друкується.

,[>,]<<<[[<]>[-]>[>]<[-]<<<]>[[->+<]>[-[-<+<]>>]<[>]<[>]<<]>.

Спробуйте на цьому перекладачі .

Розсічення:

,[>,]         Get the null terminated input
<<<           Move to the second last character
[             While there are at least 3 characters
  [<]>           Move to the first character
  [-]            Delete it
  >[>]<          Move to the last character
  [-]            Delete it
  <<<            Move the the third last character
]
>              Move to the second last character
[              If there are two characters remaining
  [->+<]         Add the two characters together
  >[-[-<+<]>>]   Divide the character by 2 rounding down
  <[>]<[>]<<     Move to before the character to exit the if loop
]
>.             Print the remaining character

* Враховуючи, що кожну інструкцію можна було стиснути до 3 біт і закодувати в UTF-32, вся програма технічно може бути виражена в 6 символів.

EDIT: А завдяки Ян Дворак для введення мене в китайському , який стискає це в 16 символів, на одному рівні з Денніса CJam відповідь .

蜐蕈帑聿纂胯箩悚衅鹊颂鹛拮拮氰人

5
Given each instruction could be compressed to 3 bits and encoded in UTF64, the whole program could technically be expressed in 3 characters.Ти виграв. Інтернет. І все інше.
кіт

1
Я не думаю, що це справедливо. Вихідним кодом Brainfuck є символи +-<>,.[] в будь-якому кодуванні, а не їх бінарні зображення. Ми маємо єдину думку про те, що кодування, яке не може бути використано існуючим інтерпретатором, є недійсним.
lirtosiast

2
@ThomasKwa, отже, я давав свою оцінку насамперед у незакодованих байтах. Кодування символів просто приєдналося до ідеї, що під час скорингу символів можна зловживати.
Hand-E-Food

4
@ThomasKwa: настав час для когось із нас зробити такого перекладача, який буде використаний у майбутніх викликах. Уявіть, що BF перемагає найкраще рішення гольфскрипту! :)
vsz


6

CJam, 16 байт

q:i_W%.+_,2/=2/c

Спробуйте в Інтернеті!

Як це працює

q                e# Read all input.
 :i              e# Cast each character to integer.
   _W%           e# Push a reversed copy.
      .+         e# Perform vectorized addition.
        _,2/     e# Get the length, divided by 2.
            =    e# Select the corresponding sum.
             2/c e# Divide by 2 and cast to character.

9
Чому майже будь-який гольф CJam / Pyth має 10-30 символів, незважаючи на труднощі? Оо
Зерегес

1
Складність? Це простий середній розрахунок за мінусом сортування ...
Денніс

4
@Dennis Я думаю, що це він має на увазі. Це може бути приблизно однакової довжини як для легших, так і важчих питань.
geokavel

@Zereges Не дуже. 10-30 характерно для легких проблем. Дивіться це, якщо ви хочете приклад того, як виглядає щось складніше: codegolf.stackexchange.com/a/64086/32852 .
Рето Коради

6

TeaScript , 23 байти 25 30 31 33

²(x[t=xn/2]c+xv[t]c)/2)

Використовує ідею @ isaacg про повернення рядка.

Спробуйте в Інтернеті

Перевірте всі випадки

Ungolfed && Пояснення

TeaScript як і раніше залишається JavaScript, тому він дуже схожий на JavaScript.

C((x[t=xn/2]c+xv[t]c)/2)

C((           // Char code to char
   x[t=xn/2]c // Floored center
   +          // Add to
   xv[t]c     // Ceil'd center
  ) / 2)      // Divide by 2

5
Це кернінг ...
lirtosiast

10
Цей заголовок - рад. Я хочу, щоб цей заголовок для кожної проклятої мови.
кіт

Так, крім кернінгу.
кіт

@sysreq lol, це було пов'язано з тим, що я використовую інший шрифт, виправлений.
Downgoat


5

Матлаб, 39 37 байт

floor((end+[1,2])/2) повертає середні два індекси рядка, якщо довжина парних, і повертає середній індекс двічі, якщо довжина непарна.

meanпросто повертає середнє значення цих значень і charавтоматично перекриває його.

@(s)char(mean(s(floor(end/2+[.5,1]))))

5

8086 машинного коду + DOS, 31 байт

Hexdump:

BA 1E 01 B4 0A CD 21 8B F2 46 8A 1C D0 EB 8A 50
01 72 06 74 08 02 10 D0 EA B4 02 CD 21 C3 FF

Вихідний код збірки (може бути зібраний з тасьмом):

    .MODEL TINY

    .CODE
    org 100h

    MAIN PROC

    mov dx, offset buf
    mov ah, 10      ; DOS function "read string"
    int 21h

    mov si, dx
    inc si          ; si now points to the length of the string
    mov bl, [si]    ; 
    shr bl, 1       ; divide the length by 2
    mov dl, [si+bx+1] ; load the middle char
    jc calc_done    ; if length was odd - done
    jz output_done  ; if length was zero - exit
    add dl, [si+bx] ; add the other middle char
    shr dl, 1       ; divide by 2
calc_done:
    mov ah, 2       ; DOS function "output char"
    int 21h
output_done:
    ret

buf db 255          ; maximum bytes to input

    MAIN ENDP
    END MAIN

Тут є делікатне використання реєстру FLAGS. Після зміщення довжини рядка право на 1 біт (що еквівалентно діленню на 2), два прапори зберігають додаткову інформацію:

  • Носити прапор: містить біт, який змістили. Якщо біт дорівнює 1, довжина була непарною.
  • Нульовий прапор: показує, чи є результат нульовим. Якщо прапор переносу дорівнює 0, а нульовий прапор - 1, довжина дорівнює нулю, і нічого не слід друкувати.

Зазвичай прапори слід перевірити негайно, але тут я використовую той факт, що movінструкція не змінює прапори. Тож їх можна оглянути після завантаження середньої діаграми.


4

Python 3, 61 59 57 55 байт

Я намагаюся не займатися гольфом мовами, на яких я працюю, але це не надто зло.

Дякуємо @xsot за 2 байти!

lambda x:chr((ord(x[len(x)//2])+ord(x[~len(x)//2]))//2)

Повна програма - 59 байт:

x=input()
l=len(x)//2
print(chr((ord(x[l])+ord(x[~l]))//2))

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


Ах, ти побив мене таким, яким моє бути наступне завдання (якби я не знайшов 10 байтів, щоб голити)
кіт

Ні, ні, 10 байт, щоб відголити моє рішення 166 байт Go. Однак ваш набагато елегантніший.
кіт

@sysreq Ах, я неправильно зрозумів. І дякую.
lirtosiast

-1-len(x)//2еквівалентно ~len(x)//2тому, як працює ділення підлоги на від'ємні цілі числа.
xsot

@xsot Спасибі - це робить код трохи
злішим

4

Пролог, 111 байт

Код

p(X):-atom_codes(X,L),length(L,N),I is N//2,J is(N-1)//2,nth0(I,L,A),nth0(J,L,B),Q is(A+B)//2,writef('%n',[Q]).

Пояснив

p(X):-atom_codes(X,L),       % Convert to list of charcodes
      length(L,N),           % Get length of list
      I is N//2,             % Get mid index of list
      J is(N-1)//2,          % Get 2nd mid index of list if even length
      nth0(I,L,A),           % Get element at mid index
      nth0(J,L,B),           % Get element at 2nd mid index
      Q is(A+B)//2,          % Get average of elements at mid indices
      writef('%n',[Q]).      % Print as character

Приклади

>p('Hello').
l

>p('Hiya').
q

4

R , 73 байти

function(x,y=utf8ToInt(x),n=sum(1|y))if(n)intToUtf8(mean(y[n/2+c(1,.5)]))

Спробуйте в Інтернеті!

Велике спасибі @ngm за те, що він придумав цю нерекурсивну ідею - дозволено грати в 20 байт.

Старе рішення:

R , 101 95 байт

"!"=function(x,n=sum(1|x))"if"(n<3,mean(x),!x[-c(1,n)])
try(intToUtf8(!utf8ToInt(scan(,""))),T)

Спробуйте в Інтернеті!

Рекурсивне рішення. Виправлено одне питання ціною 2 байти:

  • додано try(expr, silent = TRUE)для належного керування випадком, коли вхід порожній.

дякую Джусппе за 4 байти!


не intToUtf8скорочує не цілі числа?
Джузеппе

@Giuseppe ти маєш рацію, як завжди :)
JayCe

92 байти нерекурсивного розчину.
ngm

82 байти Я вважаю за краще викладати це як окрему відповідь - це абсолютно відрізняється від моєї відповіді!
JayCe

Ну, я б не придумав цього, якби ви не доклали початкових зусиль. З купою хитрощів ми, R люди, придумали. А потім ви зробили це коротше. Тож продовжуйте і робіть правки з чистою совістю!
ngm

4

Лушпиння , 11 байт

c½S¤+öc→←½↔

Спробуйте в Інтернеті!

Пояснення

Смачні, смачні комбінатори всю дорогу вниз. öє "скласти ці чотири функції", ¤це "застосувати перший аргумент до результатів застосування другого аргументу до двох додаткових аргументів окремо", Sце "застосувати цю функцію (яка повинна брати два аргументи) до Sтретього аргументу та до результату застосування Sдругого аргументу до його третього ". Тому

   Function       Type                Semantics
     öc→←½        [TChar]->TInt       ASCII code of middle (floored) char in string
   ¤+öc→←½        [TC]->[TC]->TI      Sum of ASCII codes of middle of two strings
  S¤+öc→←½↔       [TC]->TI            Sum of ASCII codes of the middle of a string and its reverse
c½S¤+öc→←½↔       [TC]->TC            ASCII character represented by half the above, QEF

Відредаговано, щоб додати: Строго кажучи, це трохи не відповідає специфікації проблеми, яка вимагає рядок у випадку порожнього вводу та символу в інших випадках.

Через суворе введення Хаска просто неможливо визначити функцію / програму, яка може повернути будь-який із двох типів. Я вирішив повернути один символ у всіх випадках, і для Husk найбільш розумним вибором для одного символу є представлення порожнього рядка, '(space)'оскільки це значення "за замовчуванням" (і насправді, тому ця програма повертає його; за замовчуванням значення використовується при прийнятті останнього ( ) елемента порожнього списку).

Я міг би також обґрунтовано обрати рядки з нуля або одного символу, що не зможе специфікацію в іншому напрямку, але я цього не зробив, оскільки він додає чотири байти: Ṡ&ö;c½S¤+öc→←½↔з ;перетворенням символу в односимвольну рядок, інший öявно скласти необхідне та Ṡ&ярлик у випадку помилкового введення.


3

C ++ 14, 56 байт

[](auto s){int l=s.size();return(s[(l-1)/2]+s[l/2])/2;};

Анонімний лямбда, беручи рядок як аргумент і повертаючи int як char-код. Бо ""повертається 0. Не впевнений, як саме повинні виглядати вхід та вихід (не вказано у питанні).

Безумовно, із використанням

#include <string>
int main()
{
    auto lmbd = [](auto str)
    {
        int len = str.size();
        return (str[(len - 1) / 2] + str[len / 2]) / 2;
    };

    std::cout << (char) lmbd("Hiya"s) << std::endl; // outputs q
}

@ CᴏɴᴏʀO'Bʀɪᴇɴ виконано.
Зереги

Я не думаю, що ти можеш виводити код символу, і я не думаю, що ти можеш виводити і 0для "".
lirtosiast

Було б непогано мати явні правила.
Зереги


3

JavaScript (ES6), 83 байти 89 91

Збережено 2 байти завдяки @ Cᴏɴᴏʀ O'Bʀɪᴇɴ

Збережено 6 байт завдяки @ETHproductions

s=>String.fromCharCode((s[~~(t=s.length/2-.5)][q='charCodeAt']()+s[0|t+.9][q]())/2)

JavaScript не надто хороший у цьому строковому чаровому коді.


Ти побив мене до цього. Ну добре, я щонайменше можу допомогти вам;) s=>String.fromCharCode((s[~~(t=s.length/2-.5)][r="charCodeAt"]()+s[Math.ceil(t)][r])/2)на 5 байт коротше.
Conor O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴ Солодкий. Мені потрібні ()навколо, charCodeAtтак що це дійсно 3 символи, але все одно дякую!
Вниз

@ ן nɟuɐɯɹɐ ן oɯ, якщо tце ціле число, яке не буде працювати
Downgoat

Math.ceil(t)можна змінити на0|t+.9
ETHproductions

@ETHproductions дякую, що врятували 6 байт!
Пуховик

3

О , 44 34 байти

Закреслений 44 все ще є регулярним 44 :(

ise.eJ;2/m[(\($L;dJ{#\#+2/c}L;?o];

Байти витрачаються на:

  • Перевірка, чи довжина вводу парна / непарна
  • Отримання середніх символів

7
Я впевнений, що ви опублікували версію, що не має волі, щоб сказати це;)
Conor O'Brien

4
@ CᴏɴᴏʀO'Bʀɪᴇɴ Мені просто пощастило: D
фаза

2

Мінколанг 0,13 , 23 20 байт

$oI2$%d$z,-Xz3&+2:O.

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

Пояснення

$o        Read in the whole stack as characters
I2$%      Push I,2, then pop them and push I//2,I%2
d$z       Duplicate top of stack (I%2) and store in register (z)
,-X       <not> the top of stack, subtract, and dump that many off the top of stack
z3&       Retrieve value from register and jump 3 spaces if this is not zero
   +2:    Add and then divide by 2
O.        Output as character and stop.

1
hiyaповертається iзамістьq
Downgoat

@ Vɪʜᴀɴ: ОН. Я неправильно його прочитав. Я подумав, що питання задає персонажа в середині, переходячи до середнього положення, якщо довжина була рівна.
El'endia Starman

@ThomasKwa: виправлено.
El'endia Starman

@ Vɪʜᴀɴ: ^ Виправлено.
El'endia Starman

2

Japt , 40 29 23 21 20 байт

Збережено 4 байти завдяки @ ן nɟuɐɯɹɐ ן oɯ

Тепер лише половина початкової довжини! Я люблю код гольф. :-D

UcV=K*Ul)+Uw cV)/2 d

Працює належним чином на порожньому рядку. Спробуйте в Інтернеті!

Як це працює

          // Implicit: U = input string, K = 0.5
Uc        // Take the char-code at position
 V=K*Ul   //  V = 0.5 * length of U
+         //  (auto-floored), plus
Uw cV     //  the char-code at position V (auto-floored) in the reversed string,
/2 d      //  divide by 2, and turn back into a character (auto-floored).
          // Implicit: output last expression

Як бачите, тут використовується багато автопокриття. (Дякую, JavaScript!) Пропозиції Ласкаво просимо!


Зворотна річ - блискуча +1
Downgoat

Ти не міг просто так зробити V=Ul /2;((UcV +Uw cV )/2 d?
Mama Fun Roll

@ ן nɟuɐɯɹɐ ן oɯ Добре, duh: P Я cстільки разів використовував без аргументів, що забув, що це прийняв. Спасибі!
ETHproductions

2

Перехід, 166 156 153 байт

Іти, можливо, не найкраща мова для гри в гольф ... але я це люблю, так багато, і я це вивчаю, так що там.

Ця реалізація приймає пустий ( \n) вхід і , ймовірно, розривається з входом , який не розширений ASCII / ASCII. Однак OP не вказав кодування вводу / виводу, таким чином ASCII - це все, що я явно підтримую.

Edit : виявляється if/ else це коротше switch. Тепер я знаю, гадаю.

Гольф:

package main;import ."fmt";func main(){a:="";_,_=Scanln(&a);if b:=len(a);b>0{x:=b/2;if b%2==0{Printf("%c",(a[x]+a[x+1])/2)}else{Println(string(a[x]))}}}

Безголівки:

package main # everything in go is a package.

import . "fmt" # the dot allows for absolute package method references 
# (think "from string import *" in python)

func main() {
    a := ""
    _, _ = Scanln(&a) # a pointer to a
    if b := len(a); b > 0 { # if statements allow local assignment statements
        x := b / 2
        if b%2 == 0 { # modulo 2 is the easiest way to test evenness
#in which case, average the charcodes and print the result
            Printf("%c", (a[x]+a[x+1])/2)
        } else {
# else just find the middle character (no rounding needed; integer division in Go always results in an integer)
            Println(string(a[x]))
        }
    }
}


2

C #, 77 байт

s=>{int n=s.Length;return n<1?' ':(char)(n%2>0?s[n/2]:(s[n/2-1]+s[n/2])/2);};

Він насправді не повертає рядок, і ви отримаєте пробільний символ, якщо рядок введення порожній, оскільки функція завжди повинна повертати значення. Ще 2 байти знадобляться для повернення рядка.

Повна програма з тестовими кейсами:

using System;

namespace FindTheCenter
{
    class Program
    {
        static void Main(string[] args)
        {
            Func<string,char>f= s=>{int n=s.Length;return n<1?' ':(char)(n%2>0?s[n/2]:(s[n/2-1]+s[n/2])/2);};   //77 bytes
            Console.WriteLine(f(""));
            Console.WriteLine(f("Hello"));
            Console.WriteLine(f("Hiya"));
        }
    }
}

Крім того, повна програма, яка читає введення користувача та друкує центр введеного рядка:

C #, 144 байти

using C=System.Console;class P{static void Main(){var s=C.ReadLine();int n=s.Length;C.Write(n<1?' ':(char)(n%2>0?s[n/2]:(s[n/2-1]+s[n/2])/2));}}

Знову ж таки, він використовує той самий трюк друку символу пробілу, який користувач не помітить, і не порожній рядок, інакше рішення на 2 байти довше.


2

Вим, 38 24 23 натискання клавіш

Оскільки ВІМ має вбудовану функцію , щоб знайти середню лінію , але не середній символ , ми розбиваємо кожен символ в окремому рядку першого використання substitute, знайти середню лінію, а потім видалити всі до і після нього.

:s/\./\0\r/g<cr>ddMjdGkdgg

Якщо ви хочете запустити це, остерігайтесь .vimrcфайлів, які можуть змінити поведінку .(магічний регулярний вираз) та g(дедалло). Зауважте, що це фактично економить мені 3 натискання клавіші на моїй машині :)

Попередня відповідь

:exe 'norm '.(virtcol('$')/2).'|d^ld$'

Приймає однорядний буфер як вхідний, оновляє поточний буфер із середнім символом. Я подумав, що це буде ярлик для цього в vim!

Примітка: потенційно коротше рішення, здається, викликає нескінченний цикл ... Якщо у когось є ідея: qq^x$x@qq@qp(12 натискань клавіш) - воно працює <c-c>після останнього @q...


1

Математика, 118 99 символів

Floor
If[#=="","",FromCharacterCode[%@Mean@#[[Ceiling[l=Length@#/2];;%[l+1]]]&@ToCharacterCode@#]]&

Маніпуляція кодом з ММА символом дорога ...


Ця функція працює лише один раз, якщо ви не повторюєте весь код кожного разу, коли ви хочете його зателефонувати. Суть подання функцій - це їх повторне використання . Виклик функції розбиває значення глобального, на %яке вона покладається.
Мартін Ендер

1
Чому б не використати укорочені форми підлоги та стелі?
DavidC

1

VBA, 130 байт

Function a(q)
h=Len(q):a=Mid(q,(h)/2,2)
If h Mod 2=0 Then:a=Chr((Asc(Left(a,1))+Asc(Right(a,1)))\2):Else:a=Right(a,1)
End Function

Знаходить середніх 2 персонажів.
Якщо число символів непарне, то отримайте право на середину 2, яка буде справжньою серединою, коли ми округлимо вниз.
Якщо не підсумовувати asc()значення ASCII двох символів, розділених на 2, і повертати символ ASCII chr()виходячи з цього значення.

Я думаю, що я можу відіграти один із asc()дзвінків, але не зміг би зробити його коротшим.




1

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

1

Серйозно , 22 20 байт

,O3 >WXXaXa3 >WXkæ≈c

Дякуємо @Mego за те, що чудово розумієш свою мову

Спробуйте в Інтернеті чи будь-що інше


1
Це не вдається для порожнього введення. У мене є видалене 20-байтове рішення, яке я також намагаюся виправити для порожнього введення.
lirtosiast

,;``@(lIƒзалишить вас із вхідним значенням на стеці, якщо його lenзначення> 0, або завершить програму в іншому випадку. Зауважте, що на задніх сторінках є недрукований символ - символ 127.
Мего

@Mego Це , здається, не працює.
фаза

@phase Ви повинні вказати рядки для введення. Це працює.
Мего

@Mego Що ƒробити?
фаза

1

CoffeeScript, 104 103 байт

f=(x)->((y=x.length)%2&&x[y//2]||y&&String.fromCharCode (x[y/=2][z='charCodeAt']()+x[y-1][z] 0)//2)||''

1

Рубі, 43 42 41 байт

->a{s=a.size;puts s<1?'':s%2<1??q:a[s/2]}

42 байти

->a{s=a.size;puts s==0?'':s%2<1??q:a[s/2]}

43 байти

->a{s=a.size;puts s==0?'':s%2<1?'q':a[s/2]}

Використання:

->a{s=a.size;puts s<1?'':s%2<1??q:a[s/2]}['12345']
=> 3

1

Java 7, 152 байти

String c(String s){char[]a=s.toCharArray();int l=a.length,x,y;return l<2?s:""+(l%2>0?a[l/2]:(char)((x=a[l/2])>(y=a[(l/2)-1])?y+((x-y)/2):x+((y-x)/2)));}

Невикористані та тестові справи:

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

class M{
  static String c(String s){
    char[] a = s.toCharArray();
    int l = a.length,
            x,
            y;
    return l < 2
            ? s
            : "" + (l%2 > 0
                     ? a[l/2]
                     : (char)((x = a[l/2]) > (y = a[(l/2)-1])
                                ? y + ((x-y)/2)
                                : x + ((y-x)/2)));
  }

  public static void main(String[] a){
    System.out.println(c("12345"));
    System.out.println(c("Hello"));
    System.out.println(c("Hiya"));
    System.out.println(c(""));
    System.out.println(c("x")); // Additional test case that will fail on some other answers
  }
}

Вихід:

3
l
q
(empty output)
x

1

PHP, 147 93 байт

Подяки та особлива подяка Йоргу Гюльсерману за те, що я на 54 байти!

<?=($l=strlen($s=$argv[1]))%2?$s[($l-1)/2]:chr(floor((ord($s‌​[$l/2])+ord($s[$l/2-‌​1]))/2));

Попередня версія:

$s=$argv[1];$l=strlen($s);echo($l%2!=0?substr($s,$n=($l-1)/2,-$n):chr(floor(abs((ord($x=substr($s,$l/2-1,1))-ord(substr($s,$l/2,1)))/2))+ord($x)));

Код тестування:

$argv[1] = 'Hiya';
$s=$argv[1];
$l=strlen($s);
echo($l%2!=0?substr($s,$n=($l-1)/2,-$n):chr(floor(abs((ord($x=substr($s,$l/2-1,1))-ord(substr($s,$l/2,1)))/2))+ord($x))); 

Тестуйте онлайн

У мене є відчуття, що це можна вдосконалити, але недостатньо часу для цього ...


<?=($l=strlen($s=$argv[1]))%2?$s[($l-1)/2]:chr(floor((ord($s[$l/2])+ord($s[$l/2-1]))/2));моя пропозиція
Йорг Гюльсерманн

@ JörgHülsermann Блискучий гольф! Ви повинні розмістити його як власну відповідь. Якщо я встигну, я більше пограю свою відповідь вашими приємними рішеннями. Спасибі.
Маріо

Не соромтеся сприймати це як свою відповідь
Йорг Гюльсерманн,

1

Excel, 122 79 байт

Насправді відповідь @Sophia Lechner зараз:

=IFERROR(CHAR(CODE(MID(A8,LEN(A8)/2+.5,1))/2+CODE(MID(A8,LEN(A8)/2+1,1))/2),"")

-5 байт від початкового рішення завдяки @Taylor Scott.

=IFERROR(IF(ISODD(LEN(A1)),MID(A1,LEN(A1)/2+1,1),CHAR((CODE(MID(A1,LEN(A1)/2,1))+CODE(MID(A1,LEN(A1)/2+1,1)))/2)),"")

12 байт, необхідних для порожнього рядка


Опустіть Average(...,...)і використовуйте (...+...)/2для -5 байт. =IFERROR(IF(ISODD(LEN(A1)),MID(A1,LEN(A1)/2+1,1),CHAR((CODE(MID(A1,LEN(A1)/2,1))+CODE(MID(A1,LEN(A1)/2+1,1)))/2)),"")
Тейлор Скотт

Excel прийме (і підлогу) не цілий другий аргумент до MID, тому вам не доведеться ділити його на випадки - =IFERROR(CHAR(CODE(MID(A1,LEN(A1)/2+1,1))/2+CODE(MID(A1,LEN(A1)/2+.5,1))/2),"")на 79 байт
Софія Лехнер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.