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 N
está 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
<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>
Respostas:
Pitão, 15 bytes
Demonstração
Começando com "Hiya" como entrada:
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.
fonte
B
ifurcate mostra sua utilidade novamente.C
funcionalidade 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.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:
* 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 .
fonte
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.+-<>,.[]
, 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.CJam, 16 bytes
Experimente online!
Como funciona
fonte
TeaScript , 23 bytes
25 30 31 33Usa 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.
fonte
Matlab,
3937 bytesfloor((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.mean
apenas retorna a média desses valores echar
a coloca automaticamente automaticamente.fonte
Código de máquina 8086 + DOS, 31 bytes
Hexdump:
Código fonte do assembly (pode ser montado com o tasm):
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:
Normalmente, os sinalizadores devem ser verificados imediatamente, mas aqui eu uso o fato de que a
mov
instrução não altera os sinalizadores. Para que possam ser examinados após o carregamento do caractere do meio.fonte
Python 3,
61595755 bytesTento não jogar golfe com os idiomas em que trabalho, mas isso não é muito ruim.
Obrigado a @xsot por 2 bytes!
O programa completo tem 59 bytes:
Experimente aqui .
fonte
-1-len(x)//2
é equivalente a~len(x)//2
como a divisão de piso funciona em números inteiros negativos.Prolog, 111 bytes
Código
Explicado
Exemplos
fonte
R , 73 bytes
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 ,
10195 bytesExperimente online!
Solução recursiva. Corrigido um problema ao preço de 2 bytes:
try(expr, silent = TRUE)
para gerenciar adequadamente o caso em que a entrada está vazia.obrigado Giusppe por 4 bytes!
fonte
intToUtf8
trunca não-inteiros?Casca , 11 bytes
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) aoS
terceiro argumento e ao resultado de aplicarS
o segundo argumento de seu terceiro ". Assim sendo,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.fonte
C ++ 14, 56 bytes
Lambda anônima tomando string como argumento e retornando int como código de char. Pois
""
, ele retorna0
. Não tenho certeza de como exatamente a entrada e a saída devem parecer (não está especificado na pergunta).Ungolfed, com uso
fonte
0
"".JavaScript (ES6), 83 bytes
89 91Guardado 2 bytes graças a @ Cᴏɴᴏʀ O'Bʀɪᴇɴ
Guardado 6 bytes graças a @ETHproductions
O JavaScript não é muito bom em todo esse código de caracteres.
fonte
s=>String.fromCharCode((s[~~(t=s.length/2-.5)][r="charCodeAt"]()+s[Math.ceil(t)][r])/2)
é 5 bytes mais curto.()
volta,charCodeAt
então são realmente 3 caracteres, mas obrigado de qualquer maneira!t
é um inteiro que não vai funcionarMath.ceil(t)
pode ser alterado para0|t+.9
O ,
4434 bytesRiscado 44 ainda é regular 44 :(
Bytes desperdiçados em:
fonte
Referência 0.13 ,
2320 bytesExperimente aqui.
Explicação
fonte
hiya
retorna emi
vez deq
Japt ,
4029232120 bytesGuardado 4 bytes graças a @ ן nɟuɐɯɹɐ ן oɯ
Agora apenas metade do comprimento original! Eu amo golfe de código. :-D
Funciona corretamente na cadeia vazia. Experimente online!
Como funciona
Como você pode ver, ele usa muito revestimento automático. (Obrigado, JavaScript!) Sugestões são bem-vindas!
fonte
V=Ul /2;((UcV +Uw cV )/2 d
?c
tantas vezes sem argumentar que esqueci que aceitava uma. Obrigado!Go,
166156153 bytesO 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
\n
entrada 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 queswitch
. Agora eu sei, suponho.Golfe:
Ungolfed:
fonte
23, 23 caracteres
Try it here (Firefox only).
Obrigado a @ETHProductions pela ideia!
fonte
C #, 77 bytes
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:
Como alternativa, um programa completo que lê a entrada do usuário e imprime o centro da string inserida:
C #, 144 bytes
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.
fonte
Vim,
382423 pressionamentos de teclasComo 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.Se você deseja executar isso, cuidado com os
.vimrc
arquivos que podem mudar o comportamento de.
(regex mágico) eg
(gdefault). Note that it actually saves me 3 keystrokes on my machine :)Resposta anterior
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
...fonte
Mathematica,
11899 charsMma character code manipulation is pricey...
fonte
%
which it relies on.VBA, 130 Bytes
I think I can golf away one of the
asc()
calls, but couldn't get it to work shorter.fonte
K, 40 bytes
fonte
><>, 24 + 3 (for -s) = 27 bytes
Old solution (Doesn't work for empty input):
Both take input on the stack through
-s
. Both are 24 bytes.Try it online here.
fonte
pb, 83 bytes
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.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:
fonte
Seriously,
2220 bytesThanks @Mego for being great at your language
Try it online or whatever
fonte
,;``@(lIƒ
will leave you with the input value on the stack if itslen
is > 0, or terminate the program otherwise. Note that there's an unprintable in the backticks - character 127.ƒ
supposed to do?CoffeeScript,
104103 bytesfonte
Ruby,
434241 bytes42 bytes
43 bytes
Usage:
fonte
Java 7, 152 bytes
Ungolfed & test cases:
Try it here.
Output:
fonte
PHP,
14793 bytesCredits and special thanks to Jörg Hülsermann for golfing my answer 54 bytes down!
Previous version:
Testing code:
Test online
I have the feeling that this can be improved, but not enough time for it...fonte
<?=($l=strlen($s=$argv[1]))%2?$s[($l-1)/2]:chr(floor((ord($s[$l/2])+ord($s[$l/2-1]))/2));
is my proposalExcel,
12279 bytesActually @Sophia Lechner's answer now:
-5 bytes from initial solution thanks to @Taylor Scott.
12 bytes needed for Empty String.
fonte
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)),"")
=IFERROR(CHAR(CODE(MID(A1,LEN(A1)/2+1,1))/2+CODE(MID(A1,LEN(A1)/2+.5,1))/2),"")
for 79 bytes