Encuentra el centro


24

Dada una cadena de caracteres ASCII, genera el carácter que está en el medio. Si no hay un carácter intermedio (cuando la cadena tiene una longitud par), muestre el carácter ASCII cuyo ordinal es el promedio de los dos caracteres centrales. Si la cadena está vacía, se debe generar una cadena vacía.

Casos de prueba:

12345 => 3

Hello => l

Hiya => q

(empty input) => (empty output)

El programa más corto en personajes gana. (No bytes)

Tabla de clasificación

El Fragmento de pila al final de esta publicación genera la tabla de clasificación a partir de las respuestas a) como una lista de la solución más corta por idioma yb) como una tabla de clasificación general.

Para asegurarse de que su respuesta se muestre, comience con un título, usando la siguiente plantilla de Markdown:

## Language Name, N characters 

¿Dónde Nestá el tamaño de su envío? Si mejora su puntaje, puede mantener los puntajes antiguos en el título, tachándolos. Por ejemplo:

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

Si desea incluir varios números en su encabezado (por ejemplo, porque su puntaje es la suma de dos archivos o desea enumerar las penalizaciones de la bandera del intérprete por separado), asegúrese de que el puntaje real sea el último número en el encabezado:

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

También puede hacer que el nombre del idioma sea un enlace que luego aparecerá en el fragmento:

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


15
Por lo general, puntuamos en bytes para que las personas no puedan comprimir todo su código, ya que esto da como resultado soluciones aburridas. ¿Estás seguro de que quieres esto?
Downgoat

1
@ Vɪʜᴀɴ No creo que sea un problema aquí, ya que las soluciones serán muy cortas de todos modos, por lo que la compresión no valdrá la pena.
Ypnypn

99
Bienvenido a PPCG! ¡Gran primer desafío!
Conor O'Brien el

2
¿Podemos escribir funciones?
Downgoat

10
Pro-tip: codifique sus respuestas en UTF-32. 4 bytes por caracter. O tal vez el OP debería deshacerse de la puntuación del personaje.
Mego

Respuestas:


9

Pyth, 15 bytes

Cs.O@R/lz2_BCMz

Demostración

Comenzando con "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

Tenga en cuenta que esto se bloquea con un error en la entrada vacía, y no imprime nada en STDOUT, que es una forma válida de generar una cadena vacía mediante los valores predeterminados del código de golf.


Bifurcate muestra su utilidad nuevamente.
lirtosiast

Whoa bifurcar es increíble.
Maltysen

@KenanRhoton En respuesta a su propuesta de edición, consulte la confirmación que agregó la Cfuncionalidad de piso: github.com/isaacg1/pyth/commit/0baf23ec Observe el día en que se agregó, el mismo día en que se hizo esta pregunta. Esto se debe a que esta pregunta me inspiró a agregar esa funcionalidad, por lo que no es elegible para su uso en esta pregunta.
isaacg

8

Brainf ***, 61 bytes

Chino , 16 caracteres

Esto requiere que la entrada esté en el rango ASCII 1-127 y esté terminada en nulo. Elimina pares de caracteres desde el inicio y el final de la cadena hasta que queden uno o dos caracteres restantes. Si hay dos, los suma, luego se divide por 2, redondeando hacia abajo. Se imprime el carácter restante.

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

Pruébalo en este intérprete .

Disección:

,[>,]         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 instrucción podría comprimirse a 3 bits y codificarse en UTF-32, todo el programa podría expresarse técnicamente en 6 caracteres.

EDITAR: Y gracias a Jan Dvorak por presentarme al chino , que comprime esto en 16 caracteres, a la par con la respuesta CJam de Dennis .

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

55
Given each instruction could be compressed to 3 bits and encoded in UTF64, the whole program could technically be expressed in 3 characters.Tú ganas. La Internet. Y todo lo demás.
gato

1
No creo que esto sea válido. El código fuente de Brainfuck son los caracteres +-<>,.[] , en cualquier codificación, no sus representaciones binarias. Tenemos un consenso de que una codificación que no puede ser utilizada por un intérprete existente no es válida.
lirtosiast

2
@ThomasKwa, por lo tanto, di mi puntaje principalmente en bytes sin codificar. La codificación de caracteres solo se unía a la idea de que se puede abusar de la puntuación por caracteres.
Hand-E-Food

44
@ThomasKwa: es hora de que algunos de nosotros hagamos un intérprete de este tipo, para ser utilizado en futuros desafíos. ¡Imagina a BF superando a la mejor solución de golfscript! :)
vsz


6

CJam, 16 bytes

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

Pruébalo en línea!

Cómo 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.

99
¿Por qué casi cualquier golf CJam / Pyth es de 10-30 caracteres sin importar la dificultad? Oo
Zereges

1
¿Dificultad? Este es un cálculo medio simple, menos la clasificación ...
Dennis

44
@ Dennis Creo que eso es lo que quiere decir. Puede tener aproximadamente la misma longitud para preguntas más fáciles y más difíciles.
geokavel

@Zereges No realmente. 10-30 es típico para problemas fáciles. Vea esto si desea un ejemplo de cómo se ve algo más complejo: 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)

Utiliza la idea de @ isaacg de invertir la cadena.

Pruébalo en línea

Prueba todos los casos

Ungolfed && Explicación

TeaScript sigue siendo JavaScript, por lo que también funciona de manera muy similar a 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

55
Ese kerning ...
lirtosiast

10
Ese encabezado es rad. Quiero ese encabezado para cada maldito idioma.
gato

Sí, excepto el kerning.
gato

@sysreq lol, tenía que ver con el hecho de que estoy usando una fuente diferente, fija.
Downgoat


5

Matlab, 39 37 bytes

floor((end+[1,2])/2) devuelve los dos índices medios de la cadena si la longitud es par, y devuelve el índice medio dos veces si la longitud es impar.

meansolo devuelve la media de esos valores y charautomáticamente la aplica al suelo.

@(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 fuente de ensamblaje (se puede ensamblar con 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

Hay un uso delicado del registro de BANDERAS aquí. Después de que desplaza la longitud de la cadena a la derecha en 1 bit (que es equivalente a la división por 2), dos banderas almacenan información adicional:

  • Bandera de transporte: contiene el bit que se desplazó. Si el bit es 1, la longitud era impar.
  • Indicador de cero: muestra si el resultado es cero. Si el indicador de acarreo es 0 y el indicador de cero es 1, la longitud era cero y no se debe imprimir nada.

Normalmente, las banderas deben verificarse de inmediato, pero aquí uso el hecho de que la movinstrucción no cambia las banderas. Para que puedan ser examinados después de cargar el char medio.


4

Pitón 3, 61 59 57 55 bytes

Intento no jugar al golf con los idiomas en los que trabajo, pero esto no es demasiado malo.

¡Gracias a @xsot por 2 bytes!

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

El programa completo tiene 59 bytes:

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

Probarlo aquí .


Ah, me adelantaste a cuál sería mi próxima tarea (si no hubiera encontrado 10 bytes para afeitarme)
gato

No, no, 10 bytes para eliminar mi solución Go de 166 bytes. Sin embargo, el tuyo es mucho más elegante.
gato

@sysreq Ah, no entendí bien. Y gracias.
lirtosiast

-1-len(x)//2es equivalente a ~len(x)//2cómo funciona la división de piso en enteros negativos.
xsot

@xsot Gracias, aunque hace que el código sea un poco más malvado :)
lirtosiast el

4

Prólogo, 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

Ejemplos

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

Pruébalo en línea!

Muchas gracias a @ngm por tener esta idea no recursiva, permitida jugar 20 bytes.

Vieja solución:

R , 101 95 bytes

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

Pruébalo en línea!

Solución recursiva. Se corrigió un problema al precio de 2 bytes:

  • agregado try(expr, silent = TRUE)para administrar adecuadamente el caso donde la entrada está vacía.

gracias Giusppe por 4 bytes!


no intToUtf8trunca los no enteros?
Giuseppe

@Giuseppe tienes razón como siempre :)
JayCe

Solución no recursiva de 92 bytes .
ngm

82 bytes Prefiero que lo publiques como una respuesta separada, ¡es totalmente diferente de mi respuesta!
JayCe

Bueno, no lo habría inventado a menos que hubieras hecho el esfuerzo original. Y mi respuesta fue un ejemplo de la respuesta de Pyth que obtuvo más votos. Con un montón de trucos, hemos aparecido personas R. Y luego lo hiciste más corto. ¡Así que adelante y haga la edición con la conciencia tranquila!
ngm

4

Casco , 11 bytes

c½S¤+öc→←½↔

Pruébalo en línea!

Explicación

Deliciosos, deliciosos combinadores hasta el final. öes "componer estas cuatro funciones", ¤es "aplicar el primer argumento a los resultados de aplicar el segundo argumento a dos argumentos adicionales por separado", Ses "aplicar esta función (que debe tomar dos argumentos) al Stercer argumento y al resultado de aplicar Sel segundo argumento a su tercero ". Por lo tanto,

   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 agregar: Estrictamente hablando, esto no se ajusta ligeramente a la especificación del problema, que solicita una cadena en el caso de una entrada vacía y un carácter en otros casos.

Debido al estricto tipeo de Husk, simplemente no es posible definir una función / programa que pueda devolver cualquiera de los dos tipos. Elegí devolver un solo carácter en todos los casos, y para Husk, la opción más razonable para que un solo carácter represente la cadena vacía es '(space)'porque ese es el valor "predeterminado" (y de hecho, es por eso que este programa lo devuelve; el predeterminado el valor se usa al tomar el último ( elemento ) de una lista vacía).

También podría haber elegido razonablemente devolver cadenas de cero o un carácter, lo que fallaría la especificación en la otra dirección, pero no lo hice porque agrega cuatro bytes: Ṡ&ö;c½S¤+öc→←½↔con la ;conversión del carácter a una cadena de un carácter, otro öpara componer explícitamente lo necesario y un Ṡ&acceso directo en el 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ónimo que toma una cadena como argumento y devuelve int como código char. Para "", vuelve 0. No estoy seguro de cómo deberían ser exactamente la entrada y la salida (no se especifica en la pregunta).

Sin golf, con 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ʀɪᴇɴ hecho.
Zereges

No creo que pueda generar con el código de caracteres, y tampoco creo que pueda generar 0"".
lirtosiast

Sería bueno tener reglas aparentes.
Zereges


3

JavaScript (ES6), 83 bytes 89 91

Guardado 2 bytes gracias a @ Cᴏɴᴏʀ O'Bʀɪᴇɴ

Guardado 6 bytes gracias a @ETHproductions

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

JavaScript no es demasiado bueno en todo este código de cadena de caracteres.


Me ganaste a eso. Oh, bueno, lo menos que puedo hacer es ayudarte;) s=>String.fromCharCode((s[~~(t=s.length/2-.5)][r="charCodeAt"]()+s[Math.ceil(t)][r])/2)es 5 bytes más corto.
Conor O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴ Dulce. Necesito el ()alrededor, charCodeAtasí que realmente son 3 caracteres, ¡pero gracias de todos modos!
Downgoat

@ ן nɟuɐɯɹɐ ן oɯ si tes un número entero que no funcionará
Downgoat

Math.ceil(t)se puede cambiar a0|t+.9
ETHproductions

@ETHproductions gracias, ¡eso ahorró 6 bytes!
Downgoat

3

O , 44 34 bytes

Tachado 44 sigue siendo regular 44 :(

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

Bytes desperdiciados en:

  • Comprobando si la longitud de la entrada es par / impar
  • Obteniendo los personajes del medio

77
Estoy seguro de que publicaste una versión sin golf para decir eso;)
Conor O'Brien el

44
@ CᴏɴᴏʀO'Bʀɪᴇɴ Tuve suerte: D
fase

2

Minkolang 0.13 , 23 20 bytes

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

Pruébalo aquí

Explicación

$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
hiyaregresa en ilugar deq
Downgoat

@ Vɪʜᴀɴ: OH. Lo leí mal. Pensé que la pregunta era preguntar por el personaje en el medio, yendo a la posición promedio del piso si la longitud era pareja.
El'endia Starman

@ThomasKwa: corregido.
El'endia Starman

@ Vɪʜᴀɴ: ^ Fijo.
El'endia Starman

2

Japt , 40 29 23 21 20 bytes

Guardado 4 bytes gracias a @ ן nɟuɐɯɹɐ ן oɯ

¡Ahora solo la mitad de la longitud original! Me encanta el golf de código. :-RE

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

Funciona correctamente en la cadena vacía. Pruébalo en línea!

Cómo 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 puede ver, utiliza muchos pisos automáticos. (¡Gracias, JavaScript!) ¡Sugerencias bienvenidas!


Lo inverso es brillante +1
Downgoat

¿No podrías simplemente hacerlo V=Ul /2;((UcV +Uw cV )/2 d?
Mama Fun Roll

@ ן nɟuɐɯɹɐ ן oɯ Bueno, duh: P Lo he usado ctantas veces sin un argumento que olvidé que aceptaba uno. ¡Gracias!
ETHproductions

2

Go, 166 156 153 bytes

Ir puede no ser el mejor idioma para jugar golf ... pero me encanta, mucho, y lo estoy aprendiendo, así que ahí.

Esta implementación acepta \nentradas en blanco ( ) y probablemente se romperá con entradas no ASCII / ASCII extendidas. Sin embargo, OP no ha especificado la codificación de entrada / salida, por lo que ASCII es todo lo que he admitido explícitamente.

Editar : resulta if/ else es más corto que switch. Ahora lo sé, supongo.

Golfizado:

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

Sin golf:

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

En realidad, no devuelve una cadena, y obtendrá un carácter de espacio si la cadena de entrada está vacía porque la función siempre debe devolver un valor. Se necesitarían 2 bytes más para devolver una cadena.

Programa completo con casos de prueba:

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

Alternativamente, un programa completo que lee la entrada del usuario e imprime el centro de la cadena ingresada:

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

Nuevamente, utiliza el mismo truco de imprimir un carácter de espacio, que el usuario no notará, y no una cadena vacía, de lo contrario, la solución es 2 bytes más larga.


2

Vim, 38 24 23 pulsaciones de teclas

Debido a que vim tiene una función incorporada para encontrar la línea media pero no el carácter medio , primero dividimos cada carácter en una línea separada usando substitute, buscamos la línea media y luego eliminamos todo después y antes.

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

Si desea ejecutar esto, tenga cuidado con los .vimrcarchivos que pueden cambiar el comportamiento de .(magic regex) y g(gdefault). Tenga en cuenta que en realidad me ahorra 3 pulsaciones de teclas en mi máquina :)

Respuesta anterior

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

Toma un búfer de una línea como entrada, actualiza el búfer actual con el carácter del medio. ¡Pensé que habría habido un atajo para esto en vim!

Nota: una solución potencialmente más corta parece causar un bucle infinito ... Si alguien tiene una idea: qq^x$x@qq@qp(12 pulsaciones de teclas), funciona <c-c>después de la última @q...


1

Mathematica, 118 99 caracteres

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

La manipulación del código de personaje de MMA es costosa ...


Esta función solo funciona una vez, a menos que repita el código completo cada vez que quiera llamarlo. El punto de las presentaciones de funciones es que sean reutilizables . Llamar a su función rompe el valor del global en el %que se basa.
Martin Ender

1
¿Por qué no utilizar las formas acortadas de piso y techo?
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

Encuentra los 2 personajes del medio.
Si el número de caracteres es impar, obtenga el derecho del medio 2, que será el verdadero centro a medida que redondeamos hacia abajo.
Si no, sume los asc()valores ASCII de los 2 caracteres divididos por 2 y devuelva el carácter ASCII en chr()función de ese valor.

Creo que puedo eliminar una de las asc()llamadas de golf , pero no pude hacerlo funcionar más corto.



1

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

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

Solución anterior (no funciona para entradas vacías):

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

Ambos toman entrada en la pila a través de -s . Ambos son de 24 bytes.

Pruébelo en línea aquí.


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]

Si bien hay al menos 3 caracteres en la cadena de entrada, se eliminan el primero y el último. Esto deja 1 carácter (debe imprimirse sin modificar) o 2 (debe promediarse e imprimirse). Para manejar esto, el primer y el último carácter de la cadena se suman y se dividen entre dos. Si solo hubiera un personaje (a+a)/2==a,. Si hubo dos, (a+b)/2es el carácter que debe imprimirse. pb "toma prestada" la evaluación de expresión de Python (def expression(e): return eval(e, globals()) ), por lo que este se anula automáticamente.

El manejo de entradas vacías me cuesta 5 bytes. Específicamente,<b[1]> en la primera línea. Antes, cuando dije "cuerda", eso era una mentira total. pb no tiene cadenas, tiene caracteres que están cerca uno del otro. Buscar el "último carácter de una cadena" solo significa mover el pincel hacia la izquierda hasta que toque un carácter. Cuando no se proporciona ninguna entrada, el bucle "mientras haya al menos 3 caracteres" se omite por completo y comienza a buscar el último carácter. Sin eso <b[1]>, seguiría buscando para siempre. Ese código pone un carácter con un valor de 1 en (-1, -1) que se encuentra específicamente cuando la entrada está vacía. Después de encontrar el "último carácter" de la cadena, el pincel asume que el primero está en (0, -1) y va allí directamente, encontrando un valor de 0. (1+0)/2es 0 en pb,

Pero monorraíl, ¡eso todavía se está imprimiendo! La especificación del desafío dice(empty input) => (empty output) ! ¿No está imprimiendo un personaje nulo haciendo trampa? Además, esto no está relacionado, pero eres inteligente y guapo.

Gracias, hipotético preguntador. Antes, cuando dije "imprimir", eso era una mentira total. En pb, realmente no imprime valores, simplemente los coloca en el lienzo. En lugar de "una forma de salida", es más preciso imaginar el lienzo como una matriz 2D infinitamente grande. Permite índices negativos en cualquier dimensión, y mucha programación en pb realmente se trata de asegurarse de que el pincel llegue a la ubicación en el lienzo que desea. Cuando el programa termina de ejecutarse, cualquier cosa en el lienzo con coordenadas X e Y no negativas se imprime en la ubicación adecuada en la consola. Cuando comienza el programa, todo el lienzo se llena con valores de 0. Para no tener que imprimir un número infinito de líneas, cada una con un número infinito de bytes nulos, cada línea de salida solo se imprime hasta el último carácter distinto de cero, y las líneas solo se imprimen hasta el último con un carácter distinto de cero. Entonces poner un0 at (0, 0) sigue siendo una salida vacía.

Sin golf:

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

En serio , 22 20 bytes

,O3 >WXXaXa3 >WXkæ≈c

Gracias @Mego por ser excelente en tu idioma

Pruébalo en línea o lo que sea


1
Esto falla para la entrada vacía. Tengo una solución eliminada de 20 bytes que también estoy tratando de arreglar para la entrada vacía.
lirtosiast

,;``@(lIƒlo dejará con el valor de entrada en la pila si lenes> 0, o terminará el programa de otra manera. Tenga en cuenta que hay una copia no imprimible en los backticks - carácter 127.
Mego

@Mego Esto no parece estar funcionando.
fase

@phase Tienes que citar cadenas para la entrada. Esto funciona
Mego

@Mego ¿Qué se ƒsupone que debe hacer?
fase

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

Uso:

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

Sin golf y casos de prueba:

Pruébalo aquí

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

Salida:

3
l
q
(empty output)
x

1

PHP, 147 93 bytes

Créditos y gracias especiales a Jörg Hülsermann por jugar golf mi respuesta ¡54 bytes hacia abajo!

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

Versión previa:

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

Código de prueba:

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

Prueba en línea

Tengo la sensación de que esto se puede mejorar, pero no hay suficiente tiempo para ello ...


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

@ JörgHülsermann ¡Golf brillante! Debes publicarlo como tu propia respuesta. Si tengo tiempo, jugaré más mi respuesta con sus buenas soluciones. Gracias.
Mario

Siéntase libre de tomarlo como su respuesta
Jörg Hülsermann

1

Excel, 122 79 bytes

En realidad, la respuesta de @Sophia Lechner ahora:

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

-5 bytes desde la solución inicial gracias a @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)),"")

Se necesitan 12 bytes para la cadena vacía.


Descarte Average(...,...)y use (...+...)/2para -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 aceptará (y plantará) un segundo argumento no entero para MID, por lo que no tiene que dividirlo en mayúsculas y minúsculas - =IFERROR(CHAR(CODE(MID(A1,LEN(A1)/2+1,1))/2+CODE(MID(A1,LEN(A1)/2+.5,1))/2),"")por 79 bytes
Sophia Lechner
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.