Trouvez le centre

24

Étant donné une chaîne de caractères ASCII, affichez le caractère qui se trouve au milieu. S'il n'y a pas de caractère central (lorsque la chaîne a une longueur paire), sortez le caractère ASCII dont l'ordinal est la moyenne plancher des deux caractères centraux. Si la chaîne est vide, une chaîne vide doit être sortie.

Cas de test:

12345 => 3

Hello => l

Hiya => q

(empty input) => (empty output)

Le programme le plus court en caractères gagne. (Pas d'octets.)

Classement

L'extrait de pile au bas de cet article génère le classement à partir des réponses a) comme une liste des solutions les plus courtes par langue et b) comme un classement général.

Pour vous assurer que votre réponse apparaît, veuillez commencer votre réponse avec un titre, en utilisant le modèle Markdown suivant:

## Language Name, N characters 

Nest la taille de votre soumission. Si vous améliorez votre score, vous pouvez conserver les anciens scores dans le titre, en les rayant. Par exemple:

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

Si vous souhaitez inclure plusieurs nombres dans votre en-tête (par exemple, parce que votre score est la somme de deux fichiers ou que vous souhaitez répertorier les pénalités de drapeau d'interprète séparément), assurez-vous que le score réel est le dernier numéro de l'en-tête:

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

Vous pouvez également faire du nom de la langue un lien qui apparaîtra ensuite dans l'extrait de code:

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

personne ici
la source
15
Habituellement, nous marquons en octets afin que les gens ne puissent pas compresser tout leur code, car cela se traduit par des solutions ennuyeuses. Êtes-vous sûr de vouloir cela?
Downgoat
1
@ Vɪʜᴀɴ Je ne pense pas que ce sera un problème ici, car les solutions seront de toute façon très courtes, donc la compression n'en vaudra pas la peine.
Ypnypn
9
Bienvenue chez PPCG! Grand premier défi!
Conor O'Brien
2
Pouvons-nous écrire des fonctions?
Downgoat
10
Pro-tip: encodez vos réponses en UTF-32. 4 octets par caractère. Ou peut-être que l'OP devrait simplement se débarrasser du score du personnage.
Mego

Réponses:

9

Pyth, 15 octets

Cs.O@R/lz2_BCMz

Manifestation

En commençant par "Hiya" comme entrée:

              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

Notez que cela se bloque avec une erreur sur une entrée vide et n'imprime rien dans STDOUT, qui est un moyen valide pour sortir une chaîne vide par défaut de code-golf.

isaacg
la source
Bifurcate montre à nouveau son utilité.
lirtosiast
whoa bifurcate est génial.
Maltysen
@KenanRhoton En réponse à votre proposition de modification, consultez le commit qui a ajouté la Cfonctionnalité de revêtement de sol: github.com/isaacg1/pyth/commit/0baf23ec Remarquez le jour où il a été ajouté, le jour même où cette question a été posée. C'est parce que cette question m'a inspiré pour ajouter cette fonctionnalité, ce qui la rend inéligible pour une utilisation sur cette question.
isaacg
8

Brainf ***, 61 octets

Chinois , 16 caractères

Cela nécessite que l'entrée se trouve dans la plage ASCII 1-127 et se termine par null. Il supprime les paires de caractères du début et de la fin de la chaîne jusqu'à ce qu'il ne reste qu'un ou deux caractères. S'il y en a deux, il les additionne, puis divise par 2, en arrondissant. Le caractère restant est imprimé.

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

Essayez-le sur cet interprète .

Dissection:

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

* Étant donné que chaque instruction peut être compressée en 3 bits et encodée en UTF-32, l'ensemble du programme peut techniquement être exprimé en 6 caractères.

EDIT: Et merci à Jan Dvorak de m'avoir présenté le chinois , qui le comprime en 16 caractères, à égalité avec la réponse CJam de Dennis .

蜐蕈帑聿纂胯箩悚衅鹊颂鹛拮拮氰人
Hand-E-Food
la source
5
Given each instruction could be compressed to 3 bits and encoded in UTF64, the whole program could technically be expressed in 3 characters.Vous gagnez. L'Internet. Et tout le reste.
chat
1
Je ne pense pas que ce soit valable. Le code source de Brainfuck est les caractères +-<>,.[] , quel que soit l'encodage, pas leurs représentations binaires. Nous sommes d' accord sur le fait qu'un encodage qui ne peut pas être utilisé par un interpréteur existant n'est pas valide.
lirtosiast
2
@ThomasKwa, donc j'ai donné mon score principalement en octets non codés. L'encodage des caractères venait de se joindre à l'idée que la notation par caractères peut être abusée.
Hand-E-Food
4
@ThomasKwa: il est temps pour certains d'entre nous de faire un tel interprète, à utiliser dans les défis à venir. Imaginez BF battre la meilleure solution de golfscript! :)
vsz
2
@vsz esolangs.org/wiki/Chinese
John Dvorak
6

CJam, 16 octets

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

Essayez-le en ligne!

Comment ça marche

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.
Dennis
la source
9
Pourquoi presque n'importe quel golf CJam / Pyth est de 10 à 30 caractères, peu importe la difficulté? Oo
Zereges
1
Difficulté? Ceci est un simple calcul médian, moins le tri ...
Dennis
4
@ Dennis Je pense que c'est ce qu'il veut dire. Il peut être à peu près de la même longueur pour les questions plus faciles et plus difficiles.
geokavel
@Zereges Pas vraiment. 10-30 est typique pour les problèmes faciles. Regardez ceci si vous voulez un exemple de la façon dont il ressemble à quelque chose de plus complexe: codegolf.stackexchange.com/a/64086/32852 .
Reto Koradi
6

TeaScript , 23 octets 25 30 31 33

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

Utilise l'idée de @ isaacg d'inverser la chaîne.

Essayez-le en ligne

Testez tous les cas

Ungolfed && Explication

TeaScript est toujours JavaScript, il fonctionne donc beaucoup comme 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
Downgoat
la source
5
Ce crénage ...
lirtosiast
10
Cet en-tête est rad. Je veux cet en-tête pour chaque putain de langue.
chat
Ouais, sauf le crénage.
chat
@sysreq lol, cela a à voir avec le fait que j'utilise une police différente, corrigée.
Downgoat
5

Matlab, 39 37 octets

floor((end+[1,2])/2) renvoie les deux indices du milieu de la chaîne si la longueur est paire et renvoie l'indice du milieu deux fois si la longueur est impaire.

meanrenvoie simplement la moyenne de ces valeurs et charla fixe automatiquement.

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

8086 code machine + DOS, 31 octets

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

Code source de l'assemblage (peut être assemblé avec 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

Il y a une utilisation délicate du registre FLAGS ici. Après avoir décalé la longueur de la chaîne de 1 bit vers la droite (ce qui équivaut à une division par 2), deux indicateurs stockent des informations supplémentaires:

  • Drapeau de portage: contient le bit qui a été déplacé. Si le bit est 1, la longueur était impaire.
  • Drapeau zéro: indique si le résultat est zéro. Si le drapeau de report est 0 et que le drapeau zéro est 1, la longueur était nulle et rien ne devrait être imprimé.

Normalement, les drapeaux doivent être vérifiés immédiatement, mais ici j'utilise le fait que l' movinstruction ne change pas les drapeaux. Ils peuvent donc être examinés après le chargement du caractère central.

anatolyg
la source
4

Python 3, 61 59 57 55 octets

J'essaie de ne pas jouer au golf avec les langues dans lesquelles je travaille, mais ce n'est pas trop mal.

Merci à @xsot pour 2 octets!

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

Le programme complet est de 59 octets:

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

Essayez-le ici .

lirtosiast
la source
Ah, vous m'avez battu jusqu'à ce que ma prochaine tâche allait être (si je n'avais pas trouvé 10 octets à raser)
chat
Non, non, 10 octets pour raser ma solution Go de 166 octets. Le vôtre est cependant beaucoup plus élégant.
chat
@sysreq Ah, j'ai mal compris. Et merci.
lirtosiast
-1-len(x)//2équivaut à la ~len(x)//2façon dont la division du plancher fonctionne sur des nombres entiers négatifs.
xsot
@xsot Merci - cela rend le code un peu plus diabolique cependant :)
lirtosiast
4

Prolog, 111 octets

Code

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

Expliqué

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

Exemples

>p('Hello').
l

>p('Hiya').
q
Emigna
la source
4

R , 73 octets

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

Essayez-le en ligne!

Un grand merci à @ngm pour avoir proposé cette idée non récursive - autorisé à jouer au golf 20 octets.

Ancienne solution:

R , 101 95 octets

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

Essayez-le en ligne!

Solution récursive. Correction d'un problème au prix de 2 octets:

  • ajouté try(expr, silent = TRUE)pour gérer correctement le cas où l'entrée est vide.

merci Giusppe pour 4 octets!

JayCe
la source
ne intToUtf8tronque pas les non entiers?
Giuseppe
@Giuseppe vous avez raison comme toujours :)
JayCe
Solution non récursive de 92 octets .
ngm
82 octets Je préfère que vous le postez comme une réponse distincte - c'est totalement différent de ma réponse!
JayCe
Eh bien, je ne l'aurais pas trouvé sans que vous ayez mis l'effort initial. Et ma réponse était un portage de la réponse Pyth qui obtient le plus de votes. Avec un tas de trucs, nous, les R, sommes arrivés. Et puis tu l'as raccourci. Alors allez-y et faites le montage en toute conscience!
ngm
4

Husk , 11 octets

c½S¤+öc→←½↔

Essayez-le en ligne!

Explication

Délicieux, délicieux combinateurs tout en bas. öest "composer ces quatre fonctions", ¤est "appliquer le premier argument aux résultats de l'application du deuxième argument à deux arguments supplémentaires séparément", Sest "appliquer cette fonction (qui doit prendre deux arguments) au Stroisième argument de et au résultat d S' appliquer le deuxième argument d' à son troisième ". Par conséquent,

   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

Modifié pour ajouter: à strictement parler, cela échoue légèrement à se conformer à la spécification du problème, qui demande une chaîne dans le cas d'une entrée vide et un caractère dans les autres cas.

En raison du typage strict de Husk, il n'est tout simplement pas possible de définir une fonction / un programme pouvant renvoyer l'un des deux types. J'ai choisi de renvoyer un seul caractère dans tous les cas, et pour Husk, le choix le plus raisonnable pour un seul caractère pour représenter la chaîne vide est '(space)'parce que c'est la valeur "par défaut" (et en fait, c'est pourquoi ce programme la renvoie; la valeur par défaut est utilisée lors de la prise du dernier élément ( ) d'une liste vide).

J'aurais également pu raisonnablement choisir de renvoyer des chaînes de zéro ou un caractère, ce qui ferait échouer la spécification dans l'autre sens, mais je ne l'ai pas fait car cela ajoute quatre octets: Ṡ&ö;c½S¤+öc→←½↔ avec la ;conversion du caractère en une chaîne à un caractère, une autre öpour composer explicitement le nécessaire, et un Ṡ&raccourci dans le cas d'une entrée falsifiée.

Sophia Lechner
la source
3

C ++ 14, 56 octets

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

Lambda anonyme prenant la chaîne comme argument et retournant int comme code char. Pour"" , ça revient 0. Vous ne savez pas exactement à quoi devraient ressembler l'entrée et la sortie (n'est pas spécifié dans la question).

Non golfé, avec utilisation

#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
}
Zereges
la source
@ CᴏɴᴏʀO'Bʀɪᴇɴ terminé.
Zereges
Je ne pense pas que vous puissiez sortir avec le code de caractère, et je ne pense pas non plus que vous puissiez sortir 0pour "".
lirtosiast
Ce serait bien d'avoir des règles apparentes.
Zereges
54 octets
Plafond
3

JavaScript (ES6), 83 octets 89 91

Enregistré 2 octets grâce à @ Cᴏɴᴏʀ O'Bʀɪᴇɴ

6 octets enregistrés grâce à @ETHproductions

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

JavaScript n'est pas trop bon du tout ce code de chaîne de caractères.

Downgoat
la source
Tu m'as battu. Eh bien, le moins que je puisse faire est de vous aider;) s=>String.fromCharCode((s[~~(t=s.length/2-.5)][r="charCodeAt"]()+s[Math.ceil(t)][r])/2)est 5 octets plus court.
Conor O'Brien
@ CᴏɴᴏʀO'Bʀɪᴇɴ Sweet. J'ai besoin du ()tour charCodeAtdonc c'est vraiment 3 caractères, mais merci quand même!
Downgoat
@ ן nɟuɐɯɹɐ ן oɯ if test un entier qui ne fonctionnera pas
Downgoat
Math.ceil(t)peut être changé en0|t+.9
ETHproductions
@ETHproductions merci, cela a permis d'économiser 6 octets!
Downgoat
3

O , 44 34 octets

Barré 44 est toujours régulier 44 :(

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

Octets gaspillés sur:

  • Vérifier si la longueur de l'entrée est paire / impaire
  • Obtenir le ou les personnages intermédiaires
phase
la source
7
Je suis sûr que vous avez posté une version non golfée pour le dire;)
Conor O'Brien
4
@ CᴏɴᴏʀO'Bʀɪᴇɴ Je viens d' avoir la chance: D
étape
2

Minkolang 0,13 , 23 20 octets

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

Essayez-le ici.

Explication

$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.
El'endia Starman
la source
1
hiyaretourne iau lieu deq
Downgoat
@ Vɪʜᴀɴ: OH. Je l'ai mal lu. Je pensais que la question demandait le personnage au milieu, allant à la position moyenne au sol si la longueur était égale.
El'endia Starman
@ThomasKwa: corrigé.
El'endia Starman
@ Vɪʜᴀɴ: ^ Fixé.
El'endia Starman
2

Japt , 40 29 23 21 20 octets

4 octets enregistrés grâce à @ ן nɟuɐɯɹɐ ן oɯ

Maintenant seulement la moitié de la longueur d'origine! J'adore le golf de code. :-RÉ

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

Fonctionne correctement sur la chaîne vide. Essayez-le en ligne!

Comment ça marche

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

Comme vous pouvez le voir, il utilise beaucoup de revêtement de sol automatique. (Merci, JavaScript!) Suggestions bienvenues!

ETHproductions
la source
La chose inverse est brillante +1
Downgoat
Ne pourriez-vous pas simplement faire V=Ul /2;((UcV +Uw cV )/2 d?
Mama Fun Roll
@ ן nɟuɐɯɹɐ ן oɯ Eh bien, duh: P J'ai utilisé ctant de fois sans argument que j'ai oublié qu'il en acceptait un. Merci!
ETHproductions
2

Allez, 166 156 153 153 octets

Le go n'est peut-être pas la meilleure langue pour jouer au golf ... mais je l'adore, tellement, et je l'apprends, donc là.

Cette implémentation accepte les \nentrées blank ( ) et rompra probablement avec une non ASCII / ASCII étendue.Cependant, OP n'a pas spécifié de codage d'entrée / sortie, donc ASCII est tout ce que j'ai explicitement pris en charge.

Modifier : s'avère if/ else est plus court queswitch . Maintenant je sais, je suppose.

Golfé:

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

Non 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]))
        }
    }
}
chat
la source
2

𝔼𝕊𝕄𝕚𝕟, 23 caractères

a=ïꝈ/2,ϚĎ((ïüa+ᴙïüa)/2)

Try it here (Firefox only).

Merci à @ETHProductions pour l'idée!

Mama Fun Roll
la source
2
Heureusement, un défi mesuré en caractères au lieu d'octets;)
ETHproductions
Oh ouais! Nous sommes tous liés.
Mama Fun Roll
Quiconque a rejeté cela, pourrais-je obtenir une explication?
Mama Fun Roll
2

C #, 77 octets

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

Il ne retourne pas réellement une chaîne, et vous obtiendrez un caractère espace si la chaîne d'entrée est vide car la fonction doit toujours renvoyer une valeur. 2 octets supplémentaires seraient nécessaires pour renvoyer une chaîne.

Programme complet avec cas de test:

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

Alternativement, un programme complet qui lit les entrées utilisateur et imprime le centre de la chaîne entrée:

C #, 144 octets

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

Encore une fois, il utilise la même astuce pour imprimer un caractère espace, que l'utilisateur ne remarquera pas, et pas une chaîne vide, sinon la solution est plus longue de 2 octets.

adrianmp
la source
2

Vim, 38 24 23 frappes

Parce que vim a une fonction intégrée pour trouver la moyenne ligne mais pas au milieu omble chevalier , nous avons divisé tous les caractères sur une ligne distincte de la première utilisation substitute, trouver la ligne médiane, puis supprimer tout avant et après lui.

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

Si vous voulez l'exécuter, méfiez-vous des .vimrcfichiers qui peuvent changer le comportement de .(regex magique) etg (gdefault). Notez que cela me fait en fait économiser 3 touches sur ma machine :)

Réponse précédente

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

Prend un tampon d'une ligne en entrée, met à jour le tampon actuel avec le caractère du milieu. Je pensais qu'il y aurait eu un raccourci pour cela dans vim!

Remarque: une solution potentiellement plus courte semble provoquer une boucle infinie ... Si quelqu'un a une idée: qq^x$x@qq@qp(12 frappes) - cela fonctionne <c-c>après la dernière @q...

Christian Rondeau
la source
1

Mathematica, 118 99 caractères

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

La manipulation du code de caractère Mma coûte cher ...

LegionMammal978
la source
Cette fonction ne fonctionne qu'une seule fois, sauf si vous répétez le code entier chaque fois que vous souhaitez l'appeler. Le point de vue des soumissions de fonctions est qu'elles soient réutilisables . L'appel de votre fonction rompt la valeur du global sur %lequel elle s'appuie.
Martin Ender
1
Pourquoi ne pas utiliser les formes raccourcies de plancher et de plafond?
DavidC
1

VBA, 130 octets

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

Trouve les 2 personnages du milieu.
Si le nombre de caractères est impair, obtenez la droite du milieu 2 qui sera le vrai milieu lorsque nous arrondissons vers le bas.
Sinon, additionnez les asc()valeurs ASCII des 2 caractères divisés par 2 et retournez le caractère ASCII en chr()fonction de cette valeur.

Je pense que je peux asc()jouer au golf avec l'un des appels, mais je n'ai pas pu le faire fonctionner plus rapidement.

JimmyJazzx
la source
1

K, 40 octets

{(*|r;`c$_(+/r:2#l_x)%2)@l=_l:-1+(#x)%2}
kirbyfan64sos
la source
1

> <>, 24 + 3 (pour -s) = 27 octets

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

Ancienne solution (ne fonctionne pas pour une entrée vide):

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

Les deux prennent en compte la pile -s. Les deux font 24 octets.

Essayez-le en ligne ici.

cole
la source
1

pb , 83 octets

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

Bien qu'il y ait au moins 3 caractères dans la chaîne d'entrée, le premier et le dernier sont supprimés. Cela laisse 1 caractère (doit être imprimé sans modification) ou 2 (doit être moyenné et imprimé). Pour gérer cela, les premier et dernier caractères de la chaîne sont additionnés et divisés par deux. S'il n'y avait qu'un seul caractère (a+a)/2==a,. S'il y en avait deux, (a+b)/2c'est le caractère qui doit être imprimé. pb "emprunte" l'évaluation de l'expression de Python (def expression(e): return eval(e, globals()) ), ce qui est automatiquement bloqué.

La gestion d'une entrée vide me coûte 5 octets. Plus précisément, <b[1]>sur la première ligne. Plus tôt, quand j'ai dit "string", c'était un mensonge total. pb n'a pas de chaînes, il a des personnages qui se trouvent être proches les uns des autres. Rechercher le «dernier caractère d'une chaîne» signifie simplement déplacer le pinceau vers la gauche jusqu'à ce qu'il touche un caractère. Lorsqu'aucune entrée n'est fournie, la boucle "tant qu'il y a au moins 3 caractères" est entièrement ignorée et elle commence à rechercher le dernier caractère. Sans cela <b[1]>, il continuerait à chercher pour toujours. Ce code place un caractère avec une valeur de 1 à (-1, -1) spécifiquement pour être trouvé lorsque l'entrée est vide. Après avoir trouvé le "dernier caractère" de la chaîne, le pinceau suppose que le premier est à (0, -1) et y va directement, trouvant une valeur de 0. (1+0)/2est 0 en pb,

Mais le monorail, ça continue d'imprimer! La spécification du défi dit (empty input) => (empty output)! L'impression d'un caractère nul ne triche-t-elle pas? En outre, cela n'est pas lié, mais vous êtes intelligent et beau.

Merci, hypothétique question-poseur. Plus tôt, quand j'ai dit "imprimer", c'était un mensonge total. En pb, vous n'imprimez pas vraiment les valeurs, vous les placez simplement sur le canevas. Plutôt que "un moyen de sortie", il est plus précis d'imaginer le canevas comme un tableau 2D infiniment grand. Il permet des indices négatifs dans l'une ou l'autre dimension, et beaucoup de programmation en pb consiste vraiment à s'assurer que le pinceau arrive à l'emplacement sur le canevas que vous souhaitez. Une fois l'exécution du programme terminée, tout élément du canevas contenant des coordonnées X et Y non négatives est imprimé à l'emplacement approprié sur la console. Lorsque le programme démarre, tout le canevas est rempli de valeurs de 0. Afin de ne pas avoir à imprimer un nombre infini de lignes, chacune avec un nombre infini d'octets nuls, chaque ligne de sortie est imprimée uniquement jusqu'au dernier caractère différent de zéro et les lignes ne sont imprimées que jusqu'à la dernière avec un caractère différent de zéro. Donc, mettre un0 à (0, 0) est toujours une sortie vide.

Non 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
métro monorail
la source
1

Sérieusement , 22 20 octets

,O3 >WXXaXa3 >WXkæ≈c

Merci @Mego d'être excellent dans votre langue

Essayez-le en ligne ou autre

phase
la source
1
Cela échoue pour une entrée vide. J'ai une solution supprimée de 20 octets que j'essaie également de corriger pour une entrée vide.
lirtosiast
,;``@(lIƒvous laissera la valeur d'entrée sur la pile si elle lenest> 0, ou terminera le programme autrement. Notez qu'il y a un non imprimable dans les backticks - caractère 127.
Mego
@Mego Cela ne semble pas fonctionner.
phase
@phase Vous devez citer des chaînes pour la saisie. Ça marche.
Mego
@Mego Que ƒdoit faire?
phase
1

CoffeeScript, 104 103 octets

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

Rubis, 43 42 41 octets

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

42 octets

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

43 octets

->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
Vasu Adari
la source
1

Java 7, 152 octets

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

Cas non testés et testés:

Essayez-le ici.

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

Sortie:

3
l
q
(empty output)
x
Kevin Cruijssen
la source
1

PHP, 147 93 octets

Remerciements et remerciements spéciaux à Jörg Hülsermann pour avoir joué ma réponse 54 octets plus bas!

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

La version précédente:

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

Code de test:

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

Testez en ligne

J'ai le sentiment que cela peut être amélioré, mais pas assez de temps pour cela ...

Mario
la source
<?=($l=strlen($s=$argv[1]))%2?$s[($l-1)/2]:chr(floor((ord($s[$l/2])+ord($s[$l/2-1]))/2));est ma proposition
Jörg Hülsermann
@ JörgHülsermann Un golf brillant! Vous devez l'afficher comme votre propre réponse. Si j'ai le temps, je jouerai davantage ma réponse avec vos belles solutions. Merci.
Mario
N'hésitez pas à prendre cela comme votre réponse
Jörg Hülsermann
1

Excel, 122 79 octets

En fait, la réponse de @Sophia Lechner maintenant:

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

-5 octets de la solution initiale grâce à @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 octets nécessaires pour la chaîne vide.

Wernisch
la source
Supprimez Average(...,...)et utilisez (...+...)/2pour -5 octets. =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 accepte (et plancher) un deuxième argument non entier à MID, vous n'avez donc pas à le diviser en cas - =IFERROR(CHAR(CODE(MID(A1,LEN(A1)/2+1,1))/2+CODE(MID(A1,LEN(A1)/2+.5,1))/2),"")pour 79 octets
Sophia Lechner