Найти центр


24

Учитывая строку символов ASCII, выведите символ, который находится посередине. Если среднего символа нет (когда строка имеет четную длину), выведите символ ASCII, порядковый номер которого является средним числом двух центральных символов. Если строка пуста, должна быть выведена пустая строка.

Тестовые случаи:

12345 => 3

Hello => l

Hiya => q

(empty input) => (empty output)

Самая короткая программа в персонажах побеждает. (Не байт.)

Leaderboard

Фрагмент стека внизу этого поста генерирует таблицу лидеров из ответов а) в виде списка кратчайшего решения для каждого языка и б) в качестве общей таблицы лидеров.

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

## 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
Обычно мы оцениваем в байтах, чтобы люди не могли сжать весь код, так как это приводит к скучным решениям. Вы уверены, что хотите этого?
Downgoat

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

9
Добро пожаловать в PPCG! Отличный первый вызов!
Конор О'Брайен

2
Можем ли мы написать функции?
Downgoat

10
Pro-tip: закодируйте ваши ответы в 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, который является допустимым способом вывода пустой строки по умолчанию в code-golf.


Bifurcate снова показывает свою полезность.
lirtosiast

Вау бифуркат это круто.
Maltysen

@KenanRhoton В ответ на предложенное вами изменение проверьте коммит, в котором добавлена Cфункциональность покрытия: github.com/isaacg1/pyth/commit/0baf23ec Обратите внимание на день, когда он был добавлен, в тот же день, когда был задан этот вопрос. Это потому, что этот вопрос вдохновил меня на добавление этой функциональности, что делает его непригодным для использования в этом вопросе.
Исаак

8

Brainf ***, 61 байт

Китайский , 16 знаков

Это требует ввода в диапазоне ASCII 1-127 и заканчивается нулем. Он удаляет пары символов из начала и конца строки, пока не останется один или два символа. Если их два, он складывает их вместе, а затем делит на 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 символах.

РЕДАКТИРОВАТЬ: И спасибо Яну Двораку за представление меня на китайском языке , который сжимает это в 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
@ Денис, я думаю, это то, что он имеет в виду. Это может быть примерно одинаковой длины для простых и сложных вопросов.
геокавель

@ 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

Matlab, 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

Исходный код сборки (может быть собран с помощью tasm):

    .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 Спасибо - это делает код немного более злым, хотя :)
lirtosiast

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)чтобы правильно управлять случаем, когда вход пуст.

спасибо Giusppe за 4 байта!


не intToUtf8усекает нецелые числа?
Джузеппе

@ Джузеппе ты прав как всегда :)
JayCe

92 байта нерекурсивного решения.
НГМЫ

82 байта. Я бы предпочел, чтобы вы опубликовали его как отдельный ответ - он полностью отличается от моего ответа!
JayCe

Ну, я бы не придумал это, если бы вы не приложили первоначальные усилия. И мой ответ был портом ответа Пита, получившего наибольшее количество голосов. С кучей трюков мы R люди придумали. А потом ты сделал это короче. Так что продолжайте и делайте редактирование с чистой совестью!
НГМЫ

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 просто невозможно определить функцию / программу, которая может возвращать любой из двух типов. Я решил вернуть один символ во всех случаях, и для Husk наиболее разумный выбор для одного символа для представления пустой строки, '(space)'потому что это значение «по умолчанию» (и фактически, именно поэтому эта программа возвращает его; значение по умолчанию) значение используется при получении элемента last ( ) пустого списка).

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


3

C ++ 14, 56 байт

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

Анонимная лямбда, принимающая строку в качестве аргумента и возвращающая int как код символа. Для"" это возвращает 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ʀɪᴇɴ сделано.
Zereges

Я не думаю, что вы можете вывести с помощью кода символа, и я не думаю, что вы можете вывести и 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 байт короче.
Конор О'Брайен

@ CᴏɴᴏʀO'Bʀɪᴇɴ Сладкий. Мне нужно ()вокруг, charCodeAtтак что это действительно 3 символа, но все равно спасибо!
Downgoat

@ ן nɟuɐɯɹɐ ן oɯ if t- целое число, которое не будет работать
Downgoat

Math.ceil(t)может быть изменено на0|t+.9
ETHproductions

Спасибо @ETHproductions, что сэкономило 6 байт!
Downgoat

3

O , 44 34 байта

Вычеркнул 44, все еще регулярно 44 :(

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

Байт потрачен на:

  • Проверка, является ли длина ввода четной / нечетной
  • Получение среднего символа (ов)

7
Я уверен, что вы выложили версию без гольфа, чтобы сказать это;)
Конор О'Брайен

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

@ ן ɐɯɹɐ ɟ ɯ ɯ,: ɯ du du du du du du du P P P P P P used ctimes Я много раз использовал без аргументов, что забыл, что один принял. Благодарность!
ETHproductions

2

Идти, 166 156 153 байта

Го, возможно, не лучший язык для игры в гольф ... но мне это очень нравится, и я его учу, вот так.

Эта реализация допускает \nввод blank ( ) и , вероятно, прервется с вводом без расширений ASCII / ASCII. Однако OP не указал кодировку ввода / вывода, поэтому ASCII - это все, что я явно поддерживал.

Edit : оказывается if/ else это короче switch. Теперь я знаю, я полагаю.

Golfed:

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]))}}}

Ungolfed:

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

Vim, 38 24 23 нажатия клавиш

Поскольку в vim есть встроенная функция для нахождения средней строки, но не среднего символа , мы сначала разбиваем каждый символ на отдельной строке substitute, находим среднюю строку, а затем удаляем все после и до нее.

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

Если вы хотите запустить это, остерегайтесь .vimrcфайлов, которые могут изменить поведение .(магическое регулярное выражение) иg (gdefault). Обратите внимание, что это на самом деле экономит мне 3 нажатия клавиш на моей машине :)

Предыдущий ответ

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

Принимает однострочный буфер в качестве входных данных, обновляет текущий буфер со средним символом. Я думал, что был бы ярлык для этого в VIM!

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


1

Mathematica, 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 символов, разделенные на 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 вы на самом деле не печатаете значения, вы просто помещаете их на холст. Вместо «способа вывода», точнее представить холст как бесконечно большой двумерный массив. Он допускает отрицательные индексы в любом измерении, и большая часть программирования на 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

1

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

,O3 >WXXaXa3 >WXkæ≈c

Спасибо @Mego за отличную речь

Попробуйте онлайн или что-то еще


1
Это не для пустого ввода. У меня есть удаленное 20-байтовое решение, которое я также пытаюсь исправить для пустого ввода.
Lirtosiast

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

@ Мего Это не похоже на работу.
этап

@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)));}

Ungolfed и тестовые случаи:

Попробуй это здесь.

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 Блестящий гольф! Вы должны опубликовать это как свой собственный ответ. Если у меня будет время, я буду лучше отвечать на ваши вопросы вашими хорошими решениями. Спасибо.
Mario

Не стесняйтесь принять это как свой ответ
Йорг Хюльсерманн

1

Excel, 122 79 байт

На самом деле ответ Софии Лехнер сейчас:

=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.