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 N
está 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
<style>body { text-align: left !important} #answer-list { padding: 10px; width: 290px; float: left; } #language-list { padding: 10px; width: 290px; float: left; } table thead { font-weight: bold; } table td { padding: 5px; }</style><script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <div id="language-list"> <h2>Shortest Solution by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr> </thead> <tbody id="languages"> </tbody> </table> </div> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr> </thead> <tbody id="answers"> </tbody> </table> </div> <table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr> </tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr> </tbody> </table><script>var QUESTION_ID = 64599; var ANSWER_FILTER = "!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe"; var COMMENT_FILTER = "!)Q2B_A2kjfAiU78X(md6BoYk"; var OVERRIDE_USER = 47556; var answers = [], answers_hash, answer_ids, answer_page = 1, more_answers = true, comment_page; function answersUrl(index) { return "https://api.stackexchange.com/2.2/questions/" + QUESTION_ID + "/answers?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + ANSWER_FILTER; } function commentUrl(index, answers) { return "https://api.stackexchange.com/2.2/answers/" + answers.join(';') + "/comments?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + COMMENT_FILTER; } function getAnswers() { jQuery.ajax({ url: answersUrl(answer_page++), method: "get", dataType: "jsonp", crossDomain: true, success: function (data) { answers.push.apply(answers, data.items); answers_hash = []; answer_ids = []; data.items.forEach(function(a) { a.comments = []; var id = +a.share_link.match(/\d+/); answer_ids.push(id); answers_hash[id] = a; }); if (!data.has_more) more_answers = false; comment_page = 1; getComments(); } }); } function getComments() { jQuery.ajax({ url: commentUrl(comment_page++, answer_ids), method: "get", dataType: "jsonp", crossDomain: true, success: function (data) { data.items.forEach(function(c) { if (c.owner.user_id === OVERRIDE_USER) answers_hash[c.post_id].comments.push(c); }); if (data.has_more) getComments(); else if (more_answers) getAnswers(); else process(); } }); } getAnswers(); var SCORE_REG = /<h\d>\s*([^\n,<]*(?:<(?:[^\n>]*>[^\n<]*<\/[^\n>]*>)[^\n,<]*)*),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/; var OVERRIDE_REG = /^Override\s*header:\s*/i; function getAuthorName(a) { return a.owner.display_name; } function process() { var valid = []; answers.forEach(function(a) { var body = a.body; a.comments.forEach(function(c) { if(OVERRIDE_REG.test(c.body)) body = '<h1>' + c.body.replace(OVERRIDE_REG, '') + '</h1>'; }); var match = body.match(SCORE_REG); if (match) valid.push({ user: getAuthorName(a), size: +match[2], language: match[1], link: a.share_link, }); else console.log(body); }); valid.sort(function (a, b) { var aB = a.size, bB = b.size; return aB - bB }); var languages = {}; var place = 1; var lastSize = null; var lastPlace = 1; valid.forEach(function (a) { if (a.size != lastSize) lastPlace = place; lastSize = a.size; ++place; var answer = jQuery("#answer-template").html(); answer = answer.replace("{{PLACE}}", lastPlace + ".") .replace("{{NAME}}", a.user) .replace("{{LANGUAGE}}", a.language) .replace("{{SIZE}}", a.size) .replace("{{LINK}}", a.link); answer = jQuery(answer); jQuery("#answers").append(answer); var lang = a.language; lang = jQuery('<a>'+lang+'</a>').text(); languages[lang] = languages[lang] || {lang: a.language, lang_raw: lang.toLowerCase(), user: a.user, size: a.size, link: a.link}; }); var langs = []; for (var lang in languages) if (languages.hasOwnProperty(lang)) langs.push(languages[lang]); langs.sort(function (a, b) { if (a.lang_raw > b.lang_raw) return 1; if (a.lang_raw < b.lang_raw) return -1; return 0; }); for (var i = 0; i < langs.length; ++i) { var language = jQuery("#language-template").html(); var lang = langs[i]; language = language.replace("{{LANGUAGE}}", lang.lang) .replace("{{NAME}}", lang.user) .replace("{{SIZE}}", lang.size) .replace("{{LINK}}", lang.link); language = jQuery(language); jQuery("#languages").append(language); } }</script>
Respuestas:
Pyth, 15 bytes
Demostración
Comenzando con "Hiya" como entrada:
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.
fuente
B
ifurcate muestra su utilidad nuevamente.C
funcionalidad 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.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:
* 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 .
fuente
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.+-<>,.[]
, 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.CJam, 16 bytes
Pruébalo en línea!
Cómo funciona
fuente
TeaScript , 23 bytes
25 30 31 33Utiliza 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.
fuente
Matlab,
3937 bytesfloor((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.mean
solo devuelve la media de esos valores ychar
automáticamente la aplica al suelo.fuente
Código de máquina 8086 + DOS, 31 bytes
Hexdump:
Código fuente de ensamblaje (se puede ensamblar con tasm):
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:
Normalmente, las banderas deben verificarse de inmediato, pero aquí uso el hecho de que la
mov
instrucción no cambia las banderas. Para que puedan ser examinados después de cargar el char medio.fuente
Pitón 3,
61595755 bytesIntento no jugar al golf con los idiomas en los que trabajo, pero esto no es demasiado malo.
¡Gracias a @xsot por 2 bytes!
El programa completo tiene 59 bytes:
Probarlo aquí .
fuente
-1-len(x)//2
es equivalente a~len(x)//2
cómo funciona la división de piso en enteros negativos.Prólogo, 111 bytes
Código
Explicado
Ejemplos
fuente
R , 73 bytes
Pruébalo en línea!
Muchas gracias a @ngm por tener esta idea no recursiva, permitida jugar 20 bytes.
Vieja solución:
R ,
10195 bytesPruébalo en línea!
Solución recursiva. Se corrigió un problema al precio de 2 bytes:
try(expr, silent = TRUE)
para administrar adecuadamente el caso donde la entrada está vacía.gracias Giusppe por 4 bytes!
fuente
intToUtf8
trunca los no enteros?Casco , 11 bytes
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",S
es "aplicar esta función (que debe tomar dos argumentos) alS
tercer argumento y al resultado de aplicarS
el segundo argumento a su tercero ". Por lo tanto,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.fuente
C ++ 14, 56 bytes
Lambda anónimo que toma una cadena como argumento y devuelve int como código char. Para
""
, vuelve0
. 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
fuente
0
"".JavaScript (ES6), 83 bytes
89 91Guardado 2 bytes gracias a @ Cᴏɴᴏʀ O'Bʀɪᴇɴ
Guardado 6 bytes gracias a @ETHproductions
JavaScript no es demasiado bueno en todo este código de cadena de caracteres.
fuente
s=>String.fromCharCode((s[~~(t=s.length/2-.5)][r="charCodeAt"]()+s[Math.ceil(t)][r])/2)
es 5 bytes más corto.()
alrededor,charCodeAt
así que realmente son 3 caracteres, ¡pero gracias de todos modos!t
es un número entero que no funcionaráMath.ceil(t)
se puede cambiar a0|t+.9
O ,
4434 bytesTachado 44 sigue siendo regular 44 :(
Bytes desperdiciados en:
fuente
Minkolang 0.13 ,
2320 bytesPruébalo aquí
Explicación
fuente
hiya
regresa eni
lugar deq
Japt ,
4029232120 bytesGuardado 4 bytes gracias a @ ן nɟuɐɯɹɐ ן oɯ
¡Ahora solo la mitad de la longitud original! Me encanta el golf de código. :-RE
Funciona correctamente en la cadena vacía. Pruébalo en línea!
Cómo funciona
Como puede ver, utiliza muchos pisos automáticos. (¡Gracias, JavaScript!) ¡Sugerencias bienvenidas!
fuente
V=Ul /2;((UcV +Uw cV )/2 d
?c
tantas veces sin un argumento que olvidé que aceptaba uno. ¡Gracias!Go,
166156153 bytesIr puede no ser el mejor idioma para jugar golf ... pero me encanta, mucho, y lo estoy aprendiendo, así que ahí.
Esta implementación acepta
\n
entradas 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 queswitch
. Ahora lo sé, supongo.Golfizado:
Sin golf:
fuente
𝔼𝕊𝕄𝕚𝕟, 23 caracteres
Try it here (Firefox only).
¡Gracias a @ETHProductions por la idea!
fuente
C #, 77 bytes
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:
Alternativamente, un programa completo que lee la entrada del usuario e imprime el centro de la cadena ingresada:
C #, 144 bytes
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.
fuente
Vim,
382423 pulsaciones de teclasDebido 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.Si desea ejecutar esto, tenga cuidado con los
.vimrc
archivos que pueden cambiar el comportamiento de.
(magic regex) yg
(gdefault). Tenga en cuenta que en realidad me ahorra 3 pulsaciones de teclas en mi máquina :)Respuesta anterior
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
...fuente
Mathematica,
11899 caracteresLa manipulación del código de personaje de MMA es costosa ...
fuente
%
que se basa.VBA, 130 bytes
Creo que puedo eliminar una de las
asc()
llamadas de golf , pero no pude hacerlo funcionar más corto.fuente
K, 40 bytes
fuente
> <>, 24 + 3 (para -s) = 27 bytes
Solución anterior (no funciona para entradas vacías):
Ambos toman entrada en la pila a través de
-s
. Ambos son de 24 bytes.Pruébelo en línea aquí.
fuente
pb , 83 bytes
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)/2
es 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)/2
es 0 en pb,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 un
0
at (0, 0) sigue siendo una salida vacía.Sin golf:
fuente
En serio ,
2220 bytesGracias @Mego por ser excelente en tu idioma
Pruébalo en línea o lo que sea
fuente
,;``@(lIƒ
lo dejará con el valor de entrada en la pila silen
es> 0, o terminará el programa de otra manera. Tenga en cuenta que hay una copia no imprimible en los backticks - carácter 127.ƒ
supone que debe hacer?CoffeeScript,
104103 bytesfuente
Ruby,
434241 bytes42 bytes
43 bytes
Uso:
fuente
Java 7, 152 bytes
Sin golf y casos de prueba:
Pruébalo aquí
Salida:
fuente
PHP,
14793 bytesCréditos y gracias especiales a Jörg Hülsermann por jugar golf mi respuesta ¡54 bytes hacia abajo!
Versión previa:
Código de prueba:
Prueba en línea
Tengo la sensación de que esto se puede mejorar, pero no hay suficiente tiempo para ello ...fuente
<?=($l=strlen($s=$argv[1]))%2?$s[($l-1)/2]:chr(floor((ord($s[$l/2])+ord($s[$l/2-1]))/2));
es mi propuestaExcel,
12279 bytesEn realidad, la respuesta de @Sophia Lechner ahora:
-5 bytes desde la solución inicial gracias a @Taylor Scott.
Se necesitan 12 bytes para la cadena vacía.
fuente
Average(...,...)
y use(...+...)/2
para -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)),"")
=IFERROR(CHAR(CODE(MID(A1,LEN(A1)/2+1,1))/2+CODE(MID(A1,LEN(A1)/2+.5,1))/2),"")
por 79 bytes