センターを見つける


24

ASCII文字の文字列を指定すると、中央にある文字を出力します。中間文字がない場合(文字列の長さが偶数の場合)、序数が2つの中央文字のフロア平均であるASCII文字を出力します。文字列が空の場合、空の文字列が出力されます。

テストケース:

12345 => 3

Hello => l

Hiya => q

(empty input) => (empty output)

キャラクターの最短プログラムが勝ちます。(バイトではありません。)

リーダーボード

この投稿の下部にあるスタックスニペットは、a)言語ごとの最短ソリューションのリストとして、およびb)リーダーボード全体としての回答からリーダーボードを生成します。

回答が表示されるようにするには、次のマークダウンテンプレートを使用して、見出しから回答を開始してください。

## Language Name, N characters 

N提出物のサイズはどこですか。スコアを改善する場合、古いスコアを打つことで見出しに残すことができます。例えば:

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

ヘッダーに複数の数字を含める場合(たとえば、スコアが2つのファイルの合計であるか、インタープリターフラグペナルティーを個別にリストする場合)、実際のスコアがヘッダーの最後の数字であることを確認します。

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

言語名をリンクにして、スニペットに表示することもできます。

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


15
通常、バイト単位でスコアリングするため、人々はコード全体を圧縮できません。これは退屈なソリューションになります。本当によろしいですか?
ダウンゴート

1
@Vɪʜᴀɴ解決策はとにかく非常に短いので、ここで問題になるとは思わないので、圧縮する価値はありません。
Ypnypn

9
PPCGへようこそ!素晴らしい最初の挑戦!
コナーオブライエン

2
関数を書くことはできますか?
ダウンゴート

10
ヒント:回答をUTF-32でエンコードします。1文字あたり4バイト。または、OPはキャラクターのスコアリングを取り除く必要があります。
メゴ

回答:


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はそのユーティリティを再び表示します。
リトシアスト

おっと二人は素晴らしいです。
マルティセン

あなたの提案を編集する@KenanRhotonで応答、追加したことをコミットチェックアウトCフローリング機能:github.com/isaacg1/pyth/commit/0baf23ecお知らせ、それが追加された日、この質問を頼まれた同じ日に。これは、この質問が私にその機能を追加するきっかけになり、この質問で使用する資格がなくなったためです。
isaacg

8

Brainf ***、61バイト

中国語、16文字

これには、入力がASCII範囲1〜127であり、ヌルで終了する必要があります。残りの1文字または2文字になるまで、文字列の先頭と末尾から文字のペアを削除します。2つある場合、それらを加算し、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文字で表現できます。

編集:そして、DennisのCJam answerと同等に、これを16文字に圧縮する中国語を紹介してくれたJan Dvorakに感謝します

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

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のソースコードは、バイナリ表現ではなく、あらゆるエンコーディングの文字 +-<>,.[]です。既存のインタープリターが使用できないエンコードは無効であるというコンセンサスがあります。
リルトシアスト

2
@ThomasKwa、したがって、主にエンコードされていないバイトでスコアを与えました。文字エンコーディングは、文字によるスコアリングが悪用される可能性があるという考えに参加していました。
Hand-E-Food

4
@ThomasKwa:私たちの中には、このようなインタープリターを作成して、将来の課題で使用する時が来ました。BFが最高のGolfscriptソリューションを破ることを想像してください!:)
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文字であるのはなぜですか。Oo
Zereges

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のアイデアを使用します。

オンラインで試す

すべてのケースをテストする

アンゴルフ&&説明

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
カーニング
...-リトシアスト

10
そのヘッダーはradです。私はすべてのひどい言語のためにそのヘッダーが欲しいです。

ええ、カーニングを除きます。

@sysreq lol、私は別のフォントを使用しているという事実に関係していました、修正されました。
ダウンゴート


5

Matlab、39 37バイト

floor((end+[1,2])/2) 長さが偶数の場合は文字列の中央の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による除算に相当)、2つのフラグに追加情報が格納されます。

  • キャリーフラグ:シフトアウトされたビットが含まれます。ビットが1の場合、長さは奇数でした。
  • ゼロフラグ:結果がゼロかどうかを示します。キャリーフラグが0で、ゼロフラグが1の場合、長さはゼロであり、何も出力されません。

通常、フラグはすぐにチェックする必要がありますが、ここではmov命令がフラグを変更しないという事実を使用します。そのため、ミドルチャーを読み込んだ後にそれらを調べることができます。


4

Pythonの3、61 59 57 55バイト

私は自分が働いている言語でゴルフをしないようにしていますが、これはそれほど悪くありません。

2バイトの@xsotに感謝します!

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

ここで試してみてください


ああ、あなたは私の次の仕事がどうなるかを私にbeatりました(10バイトを剃るのを見つけられなかった)
cat

いいえ、いいえ、私の166バイトのGoソリューションを削る10バイトです。ただし、あなたのものははるかにエレガントです。

@sysreqああ、私は誤解しました。ありがとう。
リトシアスト

-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バイトのゴルフを許可されています。

古いソリューション:

R101 95バイト

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

オンラインでお試しください!

再帰的なソリューション。2バイトの価格で1つの問題を修正しました。

  • try(expr, silent = TRUE)入力が空の場合を適切に管理するために追加されました。

4バイトのGiusppeに感謝します!


intToUtf8非整数を切り捨てませんか?
ジュゼッペ

@ジュゼッペあなたはいつも正しいです:)
JayCe

92バイトの非再帰的ソリューション。
-ngm

82バイト別の回答として投稿することをお勧めします-それは私の回答とはまったく異なります!
JayCe

まあ、元の努力をしていない限り、私はそれを思い付かなかったでしょう。そして、私の答えは、トップの投票を得るPythの答えの移植でした。たくさんのトリックを使って、Rの人々が登場しました。そして、あなたはそれを短くしました。だから、明確な良心を持って編集してください!
ngm

4

、11バイト

c½S¤+öc→←½↔

オンラインでお試しください!

説明

おいしい、おいしいコンビネーターがずっと下にあります。öは、「これらの4つの関数を構成する」、¤「2番目の引数を2つの追加引数に別々に適用した結果に最初の引数を適用する」、S「この関数(2つの引数を取る)をS3番目の引数に適用し、結果に適用する」Sの2番目の引数を3番目の引数に適用する」。したがって、

   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の厳密な型付けのため、2つの型のいずれかを返すことができる関数/プログラムを定義することはできません。私はすべての場合に単一の文字を返すことを選択しましたが、ハスクの場合、空の文字列を表す単一の文字の最も合理的な選択は'(space)'、それが「デフォルト」値であるためです(実際、このプログラムがそれを返すのはデフォルトです; 空のリストの最後の()アイテムを取得するときに値が使用されます)。

それは4つのバイトが追加されますので、私はまた、合理的に他の方向に仕様を失敗し、ゼロまたは1文字の文字列を返すことを選択した可能性がありますが、私はしませんでした:Ṡ&ö;c½S¤+öc→←½↔、と;1文字の文字列に文字を変換し、別のö必要なものを明示的に作成し、Ṡ&偽の入力の場合はショートカットを作成します。


3

C ++ 14、56バイト

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

引数として文字列を取り、charコードとしてintを返す匿名ラムダ。の場合""0。入力と出力がどのように表示されるか正確にはわかりません(質問では指定されていません)。

Ungolfed、使用法あり

#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、「」も出力できるとは思いません。
リスト管理者

明らかなルールがあるといいでしょう。
ゼレゲス


3

JavaScript(ES6)、83バイト89 91

@CᴏɴᴏʀO'Bʀɪᴇɴのおかげで2バイト節約

@ETHproductionsのおかげで6バイト節約

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文字ですが、とにかくありがとう!
ダウンゴート

@ןnɟuɐɯɹɐןoɯif tが機能しない整数
Downgoat

Math.ceil(t)変更することができます0|t+.9
ETHproductions

@ETHproductionsありがとう、6バイト節約できました!
ダウンゴート


2

Minkolang 0.1323の、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
hiyai代わりに戻るq
-Downgoat

@Vɪʜᴀɴ:ああ。誤解しています。私は質問が真ん中のキャラクターを求めていて、長さが均等であればフロアー平均位置に行くと思った。
エレンディアスターマン

@ThomasKwa:修正されました。
エレンディアスターマン

@Vɪʜᴀɴ:^修正。
エレンディアスターマン

2

Japt40 29 23 21 20バイト

@ןnɟuɐɯɹɐןoɯのおかげで4バイト節約

元の長さの半分だけになりました!私はコードゴルフが大好きです。:-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か?
ママファンロール

@ןnɟuɐɯɹɐןoɯまあ、まあ、私はc引数なしで何回も使ってきたので、それを受け入れるのを忘れました。ありがとう!
ETHproductions

2

ゴー、166の 156 153バイト

Goはゴルフに最適な言語ではないかもしれません...しかし、私はとても大好きで、とても勉強しています。

この実装は空白(\n)入力を受け入れ、非ASCII / ASCII拡張入力でおそらく中断します。ただし、OPは入力/出力エンコーディングを指定していないため、ASCIIのみが明示的にサポートされています。

編集:判明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

Vim、 38 24 23キーストローク

Vimが真ん中見つけるために、機能が組み込まれていますので、ラインではなく、中央の 文字を、私たちが最初に使用して別の行にすべての文字を分割しsubstitute、中央のラインを見つけ、後に、それ以前に、その後、削除すべて。

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

これを実行したい場合は.vimrc.(魔法の正規表現)の動作を変更する可能性のあるファイルに注意してください。g (gdefault). Note that it actually saves me 3 keystrokes on my machine :)

前の答え

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

入力として1行のバッファーを取り、現在のバッファーを中央の文字で更新します。私はvimでこれに近道があると思っていました!

注:潜在的に短いソリューションは無限ループを引き起こすようです...誰かがアイデアを持っている場合:qq^x$x@qq@qp(12キーストローク)- <c-c>最後の後に動作し@qます...


1

Mathematica, 118 99 chars

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

Mma character code manipulation is pricey...


This function only works once, unless you repeat the entire code each time you want to call it. The point of function submissions is for them to be reusable. Calling your function breaks the value of the global % which it relies on.
Martin Ender

1
Why not use the shortened forms of Floor and Ceiling?
DavidC

1

VBA, 130 Bytes

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

Finds the Middle 2 Characters.
If number of Characters is Odd then get the Right of the Middle 2 which will be the true middle as we rounded down.
If not sum the ASCII asc() values of the 2 Characters divided by 2 and return the ASCII Character chr() based on that value.

I think I can golf away one of the asc() calls, but couldn't get it to work shorter.



1

><>, 24 + 3 (for -s) = 27 bytes

l1+l4(*9$.~{~
;
o;
+2,o;

Old solution (Doesn't work for empty input):

l3(?v~{~
?vo;>l2=
;>+2,o

Both take input on the stack through -s. Both are 24 bytes.

Try it online here.


1

pb, 83 bytes

^<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]

While there are at least 3 characters in the input string, the first and last are removed. This leaves either 1 character (should be printed unmodified) or 2 (should be averaged and printed). To handle this, the first and last characters of the string are added together and divided by two. If there was only one character, (a+a)/2==a. If there was two, (a+b)/2 is the character that needs to be printed. pb "borrows" Python's expression evaluation (def expression(e): return eval(e, globals())) so this is automatically floored.

Handling empty input costs me 5 bytes. Specifically, <b[1]> on the first line. Earlier, when I said "string", that was a total lie. pb doesn't have strings, it has characters that happen to be close to each other. Looking for the "last character of a string" just means moving the brush to the left until it hits a character. When no input is provided, the "while there are at least 3 characters" loop is skipped entirely and it starts looking for the last character. Without that <b[1]>, it would keep looking forever. That code puts a character with a value of 1 at (-1, -1) specifically to be found when the input is empty. After finding the "last character" of the string the brush assumes the first one is at (0, -1) and goes there directly, finding a value of 0. (1+0)/2 is 0 in pb, so it prints a null character.

But monorail, that's still printing! The challenge specification says (empty input) => (empty output)! Isn't printing a null character cheating? Also, this is unrelated, but you are smart and handsome.

Thanks, hypothetical question-asker. Earlier, when I said "print", that was a total lie. In pb, you don't really print values, you just place them on the canvas. Rather than "a way to output", it's more accurate to imagine the canvas as an infinitely large 2D array. It allows negative indices in either dimension, and a lot of programming in pb is really about making sure the brush gets to the location on the canvas that you want it. When the program finishes executing, anything on the canvas with non-negative X and Y coordinates is printed to the appropriate location on the console. When the program begins, the entire canvas is filled with values of 0. In order to not have to print an infinite number of lines, each with an infinite number of null bytes, each line of output is only printed up to the last nonzero character, and lines are only printed up to the last one with a nonzero character in it. So putting a 0 at (0, 0) is still an empty output.

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

Seriously, 22 20 bytes

,O3 >WXXaXa3 >WXkæ≈c

Thanks @Mego for being great at your language

Try it online or whatever


1
This fails for empty input. I have a deleted 20-byte solution which I'm also trying to fix for empty input.
lirtosiast

,;``@(lIƒ will leave you with the input value on the stack if its len is > 0, or terminate the program otherwise. Note that there's an unprintable in the backticks - character 127.
Mego

@Mego This doesn't seem to be working.
phase

@phase You gotta quote strings for input. This works.
Mego

@Mego What is the ƒ supposed to do?
phase

1

CoffeeScript, 104 103 bytes

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

1

Ruby, 43 42 41 bytes

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

42 bytes

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

43 bytes

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

Usage:

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

1

Java 7, 152 bytes

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 & test cases:

Try it here.

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

Output:

3
l
q
(empty output)
x

1

PHP, 147 93 bytes

Credits and special thanks to Jörg Hülsermann for golfing my answer 54 bytes down!

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

Previous version:

$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)));

Testing code:

$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))); 

Test online

I have the feeling that this can be improved, but not enough time for it...


<?=($l=strlen($s=$argv[1]))%2?$s[($l-1)/2]:chr(floor((ord($s[$l/2])+ord($s[$l/2-1]))/2)); is my proposal
Jörg Hülsermann

@JörgHülsermann Brilliant golfing! You should post it as your own answer. If I have time I will golf my answer more with your nice solutions. Thanks.
Mario

Feel free to take it as your answer
Jörg Hülsermann

1

Excel, 122 79 bytes

Actually @Sophia Lechner's answer now:

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

-5 bytes from initial solution thanks to @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 bytes needed for Empty String.


Drop Average(...,...) and use (...+...)/2 for -5 bytes. =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)),"")
Taylor Scott

Excel will accept (and floor) a non-integer second argument to MID, so you don't have to split it into cases - =IFERROR(CHAR(CODE(MID(A1,LEN(A1)/2+1,1))/2+CODE(MID(A1,LEN(A1)/2+.5,1))/2),"") for 79 bytes
Sophia Lechner
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.