Encontre o centro


24

Dada uma sequência de caracteres ASCII, produza o caractere que está no meio. Se não houver um caractere do meio (quando a sequência tiver um comprimento par), imprima o caractere ASCII cujo ordinal é a média do piso dos dois caracteres centrais. Se a sequência estiver vazia, uma sequência vazia deve ser exibida.

Casos de teste:

12345 => 3

Hello => l

Hiya => q

(empty input) => (empty output)

O programa mais curto em caracteres vence. (Não bytes.)

Entre os melhores

O snippet de pilha na parte inferior desta postagem gera o cabeçalho das respostas a) como uma lista da solução mais curta por idioma eb) como um cabeçalho geral.

Para garantir que sua resposta seja exibida, inicie-a com um título, usando o seguinte modelo de remarcação:

## Language Name, N characters 

onde Nestá o tamanho do seu envio. Se você melhorar sua pontuação, poderá manter as pontuações antigas no título, identificando-as. Por exemplo:

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

Se você quiser incluir vários números no cabeçalho (por exemplo, porque sua pontuação é a soma de dois arquivos ou você deseja listar as penalidades do sinalizador de intérpretes separadamente), verifique se a pontuação real é o último número no cabeçalho:

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

Você também pode transformar o nome do idioma em um link que será exibido no snippet:

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


15
Normalmente, pontuamos em bytes para que as pessoas não possam compactar todo o código, pois isso resulta em soluções chatas. Tem certeza de que deseja isso?
Downgoat 23/11/2015

11
@ Vɪʜᴀɴ Acho que não será um problema aqui, já que as soluções serão muito curtas de qualquer maneira, portanto a compactação não valerá a pena.
Ypnypn

9
Bem-vindo ao PPCG! Grande primeiro desafio!
Conor O'Brien

2
Podemos escrever funções?
Downgoat 23/11/2015

10
Dica profissional: codifique suas respostas em UTF-32. 4 bytes por caractere. Ou talvez o OP deva se livrar da pontuação do personagem.
Mego

Respostas:


9

Pitão, 15 bytes

Cs.O@R/lz2_BCMz

Demonstração

Começando com "Hiya" como entrada:

              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

Observe que isso trava com um erro na entrada vazia e não imprime nada em STDOUT, que é uma maneira válida de gerar uma cadeia vazia por padrões de código-golfe.


Bifurcate mostra sua utilidade novamente.
lirtosiast

whoa bifurcada é incrível.
Maltysen 25/11/2015

@KenanRhoton Em resposta à sua edição proposta, confira o commit que adicionou a Cfuncionalidade do revestimento: github.com/isaacg1/pyth/commit/0baf23ec Observe o dia em que foi adicionado, no mesmo dia em que esta pergunta foi feita. Isso porque essa pergunta me inspirou a adicionar essa funcionalidade, tornando-a inelegível para uso nessa questão.
Isaacg

8

Brainf ***, 61 bytes

Chinês , 16 caracteres

Isso requer que a entrada esteja no intervalo ASCII 1-127 e seja terminada em nulo. Exclui pares de caracteres do início e do fim da string até que haja um ou dois caracteres restantes. Se houver dois, os soma e depois divide por 2, arredondando para baixo. O caractere restante é impresso.

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

Experimente neste intérprete .

Dissecação:

,[>,]         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

* Dado que cada instrução pode ser compactada em 3 bits e codificada em UTF-32, todo o programa pode ser tecnicamente expresso em 6 caracteres.

Edição: E obrigado a Jan Dvorak por me apresentar o chinês , que o comprime em 16 caracteres, a par da resposta CJam de Dennis .

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

5
Given each instruction could be compressed to 3 bits and encoded in UTF64, the whole program could technically be expressed in 3 characters.Você ganha. A Internet. E qualquer outra coisa.
cat

11
Eu não acho que isso seja válido. O código-fonte Brainfuck são os caracteres +-<>,.[] , em qualquer codificação, não suas representações binárias. Temos um consenso de que uma codificação que não pode ser usada por um intérprete existente é inválida.
Lirtosiast

2
@ThomasKwa, por isso dei minha pontuação principalmente em bytes não codificados. A codificação de caracteres estava apenas se juntando à ideia de que a pontuação por caracteres pode ser abusada.
Hand-E-Food

4
@ThomasKwa: é hora de alguns de nós fazermos um intérprete para ser usado em desafios futuros. Imagine a BF superando a melhor solução de golfe! :)
vsz


6

CJam, 16 bytes

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

Experimente online!

Como funciona

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
Por que quase qualquer golfe CJam / Pyth é de 10 a 30 caracteres, não importa a dificuldade? Oo
Zereges

11
Dificuldade? Este é um cálculo médio simples, menos a classificação ...
Dennis

4
@ Dennis, acho que é isso que ele quer dizer. Pode ter a mesma duração para perguntas mais fáceis e difíceis.
geokavel

@Zereges Na verdade não. 10-30 é típico para problemas fáceis. Veja isso se você quiser um exemplo de como ele procura algo mais complexo: codegolf.stackexchange.com/a/64086/32852 .
Reto Koradi

6

TeaScript , 23 bytes 25 30 31 33

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

Usa a idéia de @ isaacg de reverter a string.

Experimente online

Teste todos os casos

Ungolfed && Explicação

O TeaScript ainda é JavaScript, portanto também funciona como o 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
Isso kerning ... #
24415

10
Esse cabeçalho é rad. Quero esse cabeçalho para todas as malditas línguas.
cat

Sim, exceto o kerning.
cat

@sysreq lol, tinha a ver com o fato de eu estar usando uma fonte diferente, corrigida.
Downgoat 24/11/2015


5

Matlab, 39 37 bytes

floor((end+[1,2])/2) retorna os dois índices do meio da string se o comprimento for par e retorna o índice do meio duas vezes se o comprimento for ímpar.

meanapenas retorna a média desses valores e chara coloca automaticamente automaticamente.

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

5

Código de máquina 8086 + DOS, 31 bytes

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

Código fonte do assembly (pode ser montado com o 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

Há um uso delicado do registro FLAGS aqui. Depois de mudar o comprimento da string para a direita em 1 bit (o que equivale à divisão por 2), dois sinalizadores armazenam informações adicionais:

  • Carregar sinalizador: contém o bit que foi deslocado para fora. Se o bit for 1, o comprimento será ímpar.
  • Sinalizador zero: mostra se o resultado é zero. Se o sinalizador de transporte for 0 e o sinalizador zero for 1, o comprimento será zero e nada deverá ser impresso.

Normalmente, os sinalizadores devem ser verificados imediatamente, mas aqui eu uso o fato de que a movinstrução não altera os sinalizadores. Para que possam ser examinados após o carregamento do caractere do meio.


4

Python 3, 61 59 57 55 bytes

Tento não jogar golfe com os idiomas em que trabalho, mas isso não é muito ruim.

Obrigado a @xsot por 2 bytes!

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

O programa completo tem 59 bytes:

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

Experimente aqui .


Ah, você me ensinou qual seria minha próxima tarefa (se eu não tivesse encontrado 10 bytes para raspar) #
cat

Não, não, 10 bytes para raspar minha solução Go de 166 bytes. O seu é muito mais elegante, no entanto.
cat

@ sysreq Ah, eu entendi errado. E obrigada
lirtosiast

-1-len(x)//2 é equivalente a ~len(x)//2 como a divisão de piso funciona em números inteiros negativos.
Xsot #

@xsot Thanks-torna o código um pouco mais mal embora :)
lirtosiast

4

Prolog, 111 bytes

Código

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

Explicado

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

Exemplos

>p('Hello').
l

>p('Hiya').
q

4

R , 73 bytes

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

Experimente online!

Muito obrigado ao @ngm por ter apresentado essa idéia não recursiva - permitida jogar 20 bytes de golfe.

Solução antiga:

R , 101 95 bytes

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

Experimente online!

Solução recursiva. Corrigido um problema ao preço de 2 bytes:

  • adicionado try(expr, silent = TRUE)para gerenciar adequadamente o caso em que a entrada está vazia.

obrigado Giusppe por 4 bytes!


não intToUtf8trunca não-inteiros?
Giuseppe

@Giuseppe você está certo, como sempre :)
Jayce

Solução não recursiva de 92 bytes .
ngm

82 bytes Prefiro que você a publique como uma resposta separada - é totalmente diferente da minha resposta!
Jayce

Bem, eu não teria pensado nisso, a menos que você tivesse feito o esforço original. E minha resposta foi um dos principais resultados da resposta Pyth para obtenção de votos. Com vários truques, nós, pessoas R, surgimos. E então você diminuiu. Então vá em frente e faça a edição com a consciência limpa!
ngm

4

Casca , 11 bytes

c½S¤+öc→←½↔

Experimente online!

Explicação

Deliciosos, deliciosos combinadores até o fim. öé "compõe essas quatro funções", ¤é "aplica o primeiro argumento aos resultados da aplicação do segundo argumento a dois argumentos adicionais separadamente", Sé "aplica esta função (que deve receber dois argumentos) ao Sterceiro argumento e ao resultado de aplicar So segundo argumento de seu terceiro ". Assim sendo,

   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

Editado para adicionar: Estritamente falando, isso falha um pouco em conformidade com a especificação do problema, que solicita uma sequência no caso de uma entrada vazia e um caractere em outros casos.

Devido à digitação estrita de Husk, simplesmente não é possível definir uma função / programa que possa retornar um dos dois tipos. Eu escolhi retornar um único caractere em todos os casos, e para Husk, a escolha mais razoável para um único caractere representar a sequência vazia é '(space)'porque esse é o valor "padrão" (e, de fato, é por isso que este programa o retorna; o padrão valor é usado ao obter o último item ( ) de uma lista vazia).

Eu também poderia ter razoavelmente escolhido retornar cadeias de zero ou um caractere, o que falharia na especificação na outra direção, mas não o fiz porque adiciona quatro bytes: Ṡ&ö;c½S¤+öc→←½↔com a ;conversão do caractere em uma cadeia de um caractere, outra öcompor explicitamente o necessário e um Ṡ&atalho no caso de entrada falsa.


3

C ++ 14, 56 bytes

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

Lambda anônima tomando string como argumento e retornando int como código de char. Pois "", ele retorna 0. Não tenho certeza de como exatamente a entrada e a saída devem parecer (não está especificado na pergunta).

Ungolfed, com uso

#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ʀɪᴇɴ feito.
Zereges

Eu não acho que você possa imprimir com o código de caractere e também não 0"".
lirtosiast

Seria bom ter regras aparentes.
Zereges


3

JavaScript (ES6), 83 bytes 89 91

Guardado 2 bytes graças a @ Cᴏɴᴏʀ O'Bʀɪᴇɴ

Guardado 6 bytes graças a @ETHproductions

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

O JavaScript não é muito bom em todo esse código de caracteres.


Você chegou antes de mim. Bem, pelo menos eu posso ajudá-lo;) s=>String.fromCharCode((s[~~(t=s.length/2-.5)][r="charCodeAt"]()+s[Math.ceil(t)][r])/2)é 5 bytes mais curto.
Conor O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴ Doce. Eu preciso da ()volta, charCodeAtentão são realmente 3 caracteres, mas obrigado de qualquer maneira!
Downgoat 24/11/2015

@ ן nɟuɐɯɹɐ ן oɯ se té um inteiro que não vai funcionar
Downgoat

Math.ceil(t)pode ser alterado para0|t+.9
ETHproductions

Obrigado @ETHproductions, que economizou 6 bytes!
Downgoat 24/11/2015

3

O , 44 34 bytes

Riscado 44 ainda é regular 44 :(

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

Bytes desperdiçados em:

  • Verificando se o comprimento da entrada é par / ímpar
  • Obtendo o (s) personagem (s) do meio

7
Tenho certeza que você postou uma versão ungolfed dizer que;)
Conor O'Brien

4
@ CᴏɴᴏʀO'Bʀɪᴇɴ Eu só tive sorte: D
fase

2

Referência 0.13 , 23 20 bytes

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

Experimente aqui.

Explicaçã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.

11
hiyaretorna em ivez deq
Downgoat

@ Vɪʜᴀɴ: OH. Eu interpretei errado. Eu pensei que a pergunta estava pedindo o personagem no meio, indo para a posição média do piso , se o comprimento fosse regular.
El'endia Starman 24/11/2015

@ThomasKwa: corrigido.
El'endia Starman 24/11/2015

@ Vɪʜᴀɴ: ^ Corrigido.
El'endia Starman 24/11/2015

2

Japt , 40 29 23 21 20 bytes

Guardado 4 bytes graças a @ ן nɟuɐɯɹɐ ן oɯ

Agora apenas metade do comprimento original! Eu amo golfe de código. :-D

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

Funciona corretamente na cadeia vazia. Experimente online!

Como funciona

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

Como você pode ver, ele usa muito revestimento automático. (Obrigado, JavaScript!) Sugestões são bem-vindas!


A coisa inversa é brilhante +1
Downgoat 24/11/2015

Você não poderia simplesmente fazer V=Ul /2;((UcV +Uw cV )/2 d?
Mama Fun Roll

@ Du nɟuɐɯɹɐ ן oɯ Bem, duh: P Eu usei ctantas vezes sem argumentar que esqueci que aceitava uma. Obrigado!
ETHproductions

2

Go, 166 156 153 bytes

O Go pode não ser o melhor idioma para jogar golfe ... mas eu adoro muito, e estou aprendendo, muito por aí.

Esta implementação aceita \nentrada em branco ( ) e provavelmente quebrará com entrada não estendida por ASCII / ASCII. No entanto, o OP não especificou a codificação de entrada / saída, portanto, ASCII é tudo que eu suporte explicitamente.

Editar : acaba if/ else é menor que switch. Agora eu sei, suponho.

Golfe:

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 bytes

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

Na verdade, ele não retorna uma string e você obterá um caractere de espaço se a string de entrada estiver vazia porque a função sempre deve retornar um valor. Seriam necessários mais 2 bytes para retornar uma string.

Programa completo com casos de teste:

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

Como alternativa, um programa completo que lê a entrada do usuário e imprime o centro da string inserida:

C #, 144 bytes

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

Novamente, ele usa o mesmo truque de imprimir um caractere de espaço, que o usuário não notará, e não uma sequência vazia, caso contrário, a solução terá 2 bytes a mais.


2

Vim, 38 24 23 pressionamentos de teclas

Como o vim possui uma função embutida para encontrar a linha do meio , mas não o caractere do meio , dividimos cada caractere em uma linha separada primeiro substitute, localizamos a linha do meio e excluímos tudo depois e antes dela.

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

Se você deseja executar isso, cuidado com os .vimrcarquivos que podem mudar o comportamento de .(regex mágico) eg (gdefault). Note that it actually saves me 3 keystrokes on my machine :)

Resposta anterior

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

Pega um buffer de uma linha como entrada, atualiza o buffer atual com o caractere do meio. Eu pensei que teria havido um atalho para isso no vim!

Nota: uma solução potencialmente mais curta parece causar um loop infinito ... Se alguém tiver uma idéia: qq^x$x@qq@qp(12 pressionamentos de tecla) - funciona <c-c>depois da última @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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.