Finde das Zentrum

24

Geben Sie bei einer vorgegebenen Zeichenfolge aus ASCII-Zeichen das Zeichen in der Mitte aus. Wenn es kein mittleres Zeichen gibt (wenn die Zeichenfolge eine gerade Länge hat), geben Sie das ASCII-Zeichen aus, dessen Ordnungszahl der bodenständige Durchschnitt der beiden mittleren Zeichen ist. Wenn der String leer ist, sollte ein leerer String ausgegeben werden.

Testfälle:

12345 => 3

Hello => l

Hiya => q

(empty input) => (empty output)

Das kürzeste Programm in den Charakteren gewinnt. (Nicht Bytes.)

Bestenliste

Das Stapel-Snippet am Ende dieses Beitrags generiert die Rangliste aus den Antworten a) als Liste der kürzesten Lösungen pro Sprache und b) als Gesamtrangliste.

Um sicherzustellen, dass Ihre Antwort angezeigt wird, beginnen Sie Ihre Antwort mit einer Überschrift. Verwenden Sie dazu die folgende Markdown-Vorlage:

## Language Name, N characters 

Wo Nist die Größe Ihres Beitrags? Wenn Sie Ihren Score zu verbessern, Sie können alte Rechnungen in der Überschrift halten, indem man sich durch das Anschlagen. Zum Beispiel:

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

Wenn Sie mehrere Zahlen in Ihre Kopfzeile aufnehmen möchten (z. B. weil Ihre Punktzahl die Summe von zwei Dateien ist oder wenn Sie die Strafen für Interpreter-Flags separat auflisten möchten), stellen Sie sicher, dass die tatsächliche Punktzahl die letzte Zahl in der Kopfzeile ist:

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

Sie können den Namen der Sprache auch als Link festlegen, der dann im Snippet angezeigt wird:

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

niemand hier
quelle
15
Normalerweise werden die Werte in Bytes angegeben, damit die Benutzer nicht ihren gesamten Code komprimieren können, da dies zu langweiligen Lösungen führt. Bist du sicher, dass du das willst?
Downgoat
1
@ Vɪʜᴀɴ Ich denke nicht, dass das hier ein Problem sein wird, da die Lösungen sowieso sehr kurz sind, sodass sich das Komprimieren nicht lohnt.
Ypnypn
9
Willkommen bei PPCG! Tolle erste Herausforderung!
Conor O'Brien
2
Können wir Funktionen schreiben?
Downgoat
10
Pro-Tipp: Kodieren Sie Ihre Antworten in UTF-32. 4 Bytes pro Zeichen. Oder vielleicht sollte das OP die Charakterwertung einfach loswerden.
Mego

Antworten:

9

Pyth, 15 Bytes

Cs.O@R/lz2_BCMz

Demonstration

Beginnend mit "Hiya" als Eingabe:

              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

Beachten Sie, dass dies mit einem Fehler bei der Leereingabe abstürzt und nichts an STDOUT ausgibt. Dies ist eine gültige Methode, um eine leere Zeichenfolge per Code-Golf-Standard auszugeben.

isaacg
quelle
Bifurcate zeigt ihre Nützlichkeit wieder.
Lirtosiast
whoa gegabelten ist genial.
Maltysen
@KenanRhoton Überprüfen Sie als Antwort auf Ihre Änderungsvorschläge das Commit, das die CFunktionalität für Bodenbeläge hinzugefügt hat : github.com/isaacg1/pyth/commit/0baf23ec Notieren Sie sich den Tag des Hinzufügens, an dem diese Frage gestellt wurde. Das ist , weil diese Frage mich dazu inspiriert , die Funktionalität hinzufügen, dass diese Marke nicht für die Verwendung in dieser Frage zu machen.
isaacg
8

Brainf ***, 61 Bytes

Chinesisch , 16 Zeichen

Dies setzt voraus, dass die Eingabe im ASCII-Bereich von 1 bis 127 liegt und nullterminiert ist. Es werden Zeichenpaare vom Anfang und Ende der Zeichenfolge gelöscht, bis ein oder zwei Zeichen übrig sind. Wenn es zwei gibt, addiert es sie, dividiert durch 2 und rundet ab. Das verbleibende Zeichen wird gedruckt.

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

Probieren Sie es mit diesem Interpreter aus .

Präparation:

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

* Da jeder Befehl auf 3 Bit komprimiert und in UTF-32 codiert werden kann, kann das gesamte Programm technisch in 6 Zeichen ausgedrückt werden.

EDIT: Und dank Jan Dvorak für mich auf die Einführung Chinesen , die dies in 16 Zeichen komprimiert, gleichauf mit Dennis' CJam Antwort .

蜐蕈帑聿纂胯箩悚衅鹊颂鹛拮拮氰人
Hand-E-Food
quelle
5
Given each instruction could be compressed to 3 bits and encoded in UTF64, the whole program could technically be expressed in 3 characters.Du gewinnst. Das Internet. Und alles andere.
Katze
1
Ich denke nicht, dass das gültig ist. Der Brainfuck-Quellcode besteht aus den Zeichen +-<>,.[] , in welcher Kodierung auch immer, nicht aus deren binären Darstellungen. Wir sind uns einig, dass eine Codierung, die von einem vorhandenen Interpreter nicht verwendet werden kann, ungültig ist.
Lirtosiast
2
@ThomasKwa, daher habe ich meine Punktzahl hauptsächlich in nicht codierten Bytes angegeben. Die Zeichenkodierung schloss sich gerade der Idee an, dass das Bewerten nach Zeichen missbraucht werden kann.
Hand-E-Food
4
@ThomasKwa: Es ist Zeit für einige von uns, einen solchen Dolmetscher zu entwickeln, der für zukünftige Herausforderungen verwendet werden kann. Stellen Sie sich vor, BF schlägt die beste Golfscript-Lösung! :)
vsz
2
@vsz esolangs.org/wiki/Chinese
John Dvorak
6

CJam, 16 Bytes

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

Probieren Sie es online!

Wie es funktioniert

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
quelle
9
Warum hat fast jeder CJam / Pyth-Golf 10-30 Zeichen, egal auf welchem ​​Schwierigkeitsgrad? Oo
Zereges
1
Schwierigkeit? Dies ist eine einfache Medianberechnung, abzüglich der Sortierung ...
Dennis
4
@ Tennis Ich denke, das ist was er meint. Sie kann für einfachere und schwierigere Fragen ungefähr gleich lang sein.
Geokavel
@Zereges Nicht wirklich. 10-30 ist typisch für einfache Probleme. Sehen Sie sich das an, wenn Sie ein Beispiel dafür suchen, wie es nach etwas Komplexerem aussieht: 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)

Uses @ isaacg Idee des Strings umzukehren.

Probieren Sie es online aus

Testen Sie alle Fälle

Ungolfed && Erklärung

TeaScript ist immer noch JavaScript und funktioniert daher ähnlich wie 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
quelle
5
Das Kerning ...
Lirtosiast
10
Dieser Header ist rad. Ich möchte , dass Header für jede goddamn Sprache.
Katze
Ja, außer dem Kerning.
Katze
@sysreq lol, es hat damit zu tun, dass ich eine andere Schriftart verwende, behoben.
Downgoat
5

Matlab, 39 37 Bytes

floor((end+[1,2])/2) Gibt die mittleren zwei Indizes des Strings zurück, wenn die Länge gerade ist, und gibt den mittleren Index zweimal zurück, wenn die Länge ungerade ist.

meannur gibt den Mittelwert dieser Werte und chares automatisch Etagen.

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

8086 Maschinencode + DOS, 31 Byte

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

Assembly-Quellcode (kann mit tasm zusammengestellt werden):

    .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

Das FLAGS-Register wird hier nur sehr selten verwendet. Nachdem es die Länge der Zeichenfolge rechts um 1 Bit verschiebt (die von 2 bis Teilung äquivalent ist), zwei Flags zusätzliche Informationen speichern:

  • Carry Flag: Enthält das herausgeschobene Bit. Wenn das Bit 1 ist, war die Länge ungerade.
  • Zero Flag: Zeigt an, ob das Ergebnis Null ist. Wenn der Carry-Flag 0 ist und der Null-Flag 1 ist, war die Länge Null, und nichts soll gedruckt werden.

Normalerweise sollten die Fahnen sofort überprüft werden, aber hier habe ich die Tatsache nutzen , dass die movAnweisung nicht Flags ändert. So können sie nach dem Laden des mittleren Zeichens untersucht werden.

anatolyg
quelle
4

Python 3, 61 59 57 55 Bytes

Ich versuche, nicht zu Golf mit Sprachen, die ich in Arbeit, aber das ist nicht zu böse.

Danke an @xsot für 2 Bytes!

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

Das vollständige Programm besteht aus 59 Bytes:

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

Probieren Sie es hier aus .

Lirtosiast
quelle
Ah, du hast mich bis zu meiner nächsten Aufgabe geschlagen (hätte ich nicht 10 Bytes gefunden, die ich abschneiden könnte)
Katze
Nein, nein, 10 Byte mein abrasieren 166 Byte Go Lösung. Ihre ist jedoch weitaus eleganter.
Katze
@ Sysreq Ah, ich habe falsch verstanden. Und danke.
Lirtosiast
-1-len(x)//2entspricht ~len(x)//2aufgrund der Funktionsweise der Floor-Division für negative ganze Zahlen.
24.
@xsot Danke - es macht den Code ein bisschen böser :)
Lirtosiast
4

Prolog, 111 Bytes

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

Erklärt

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

Beispiele

>p('Hello').
l

>p('Hiya').
q
Emigna
quelle
4

R , 73 Bytes

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

Probieren Sie es online!

Vielen Dank an @ngm für diese nicht-rekursive Idee - 20 Bytes Golf spielen dürfen.

Alte Lösung:

R , 101 95 Bytes

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

Probieren Sie es online!

Rekursive Lösung. Ein Problem zum Preis von 2 Bytes behoben:

  • hinzugefügt try(expr, silent = TRUE), um den Fall ordnungsgemäß zu verwalten, in dem die Eingabe leer ist.

danke Giusppe für 4 Bytes!

JayCe
quelle
nicht intToUtf8nicht-Zahlen gestutzt?
Giuseppe
@ Giuseppe Sie sind wie immer richtig :)
JayCe
92 Bytes nicht rekursive Lösung.
ngm
82 Bytes Ich würde es bevorzugen, wenn Sie es als separate Antwort posten - es ist völlig anders als meine Antwort!
JayCe
Nun, ich hätte es mir nicht ausgedacht, wenn Sie nicht die ursprüngliche Anstrengung unternommen hätten. Und meine Antwort war eine Portierung der Pyth-Antwort mit der höchsten Stimmenzahl. Mit ein paar Tricks sind wir R Leute gekommen. Und dann hast du es kürzer gemacht. Also mach den Schnitt mit gutem Gewissen!
ngm
4

Schale , 11 Bytes

c½S¤+öc→←½↔

Probieren Sie es online!

Erläuterung

Leckere, leckere Kombinatoren ganz nach unten. öheißt "komponiere diese vier Funktionen", ¤heißt "wende das erste Argument auf die Ergebnisse an, wenn das zweite Argument separat auf zwei zusätzliche Argumente angewendet wird" und Sheißt "wende diese Funktion (die zwei Argumente annehmen sollte) auf Sdas dritte Argument und auf das Ergebnis an das Szweite Argument auf das dritte anzuwenden ". Deshalb,

   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

Bearbeitet, um hinzuzufügen: Streng genommen entspricht dies leicht nicht der Problemspezifikation, die im Fall einer leeren Eingabe eine Zeichenfolge und in anderen Fällen ein Zeichen anfordert.

Aufgrund der strengen Schreibweise von Husk ist es einfach nicht möglich, eine Funktion / ein Programm zu definieren, die / das einen von zwei Typen zurückgeben kann. Ich habe mich in jedem Fall für die Rückgabe eines einzelnen Zeichens entschieden, und für Husk ist es am sinnvollsten, '(space)'wenn ein einzelnes Zeichen die leere Zeichenfolge darstellt, da dies der "Standard" -Wert ist (und das ist der Grund, warum dieses Programm ihn zurückgibt; der Standardwert) value wird verwendet, wenn das letzte ( ) Element einer leeren Liste genommen wird.

Ich hätte auch vernünftigerweise Zeichenfolgen mit null oder einem Zeichen zurückgeben können, was die Spezifikation in der anderen Richtung verfehlen würde, aber ich tat es nicht, weil es vier Bytes hinzufügt: Ṡ&ö;c½S¤+öc→←½↔beim ;Konvertieren des Zeichens in eine Zeichenfolge mit einem Zeichen eine andere ödas Notwendige explizit zu komponieren, und eine Ṡ&Abkürzung im Falle einer falschen Eingabe.

Sophia Lechner
quelle
3

C ++ 14, 56 Bytes

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

Anonymes Lambda, das einen String als Argument verwendet und int als Zeichencode zurückgibt. Denn ""es kehrt zurück 0. Nicht sicher, wie genau die Ein- und Ausgabe aussehen soll (ist in der Frage nicht angegeben).

Ungolfed, mit gebrauch

#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
quelle
@ CᴏɴᴏʀO'Bʀɪᴇɴ erledigt.
Zereges
Ich glaube nicht, dass Sie mit dem Zeichencode 0"" ausgeben können, und ich glaube auch nicht, dass Sie für "" ausgeben können .
Lirtosiast
Es wäre schön, offensichtliche Regeln zu haben.
Zereges,
54 Bytes
Ceilingcat
3

JavaScript (ES6), 83 Byte 89 91

2 Bytes dank @ Cᴏɴᴏʀ O'Bʀɪᴇɴ gespeichert

6 Bytes gespart dank @ETHproductions

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

JavaScript ist überhaupt nicht gut dieser String-Zeichencode.

Downgoat
quelle
Du warst schneller als ich. Na ja, ich kann dir wenigstens helfen;) s=>String.fromCharCode((s[~~(t=s.length/2-.5)][r="charCodeAt"]()+s[Math.ceil(t)][r])/2)ist 5 Bytes kürzer.
Conor O'Brien
@ CᴏɴᴏʀO'Bʀɪᴇɴ Süß. Ich brauche die ()um charCodeAtso es ist wirklich 3 Zeichen, aber trotzdem danke!
Downgoat
@ ן nןuɟ ן oן if tist eine Ganzzahl, die nicht funktioniert
Downgoat
Math.ceil(t)kann geändert werden zu0|t+.9
ETHproductions 24.11.15
@ETHproductions danke, das hat 6 Bytes gespart!
Downgoat
3

O , 44 34 Bytes

Durchgestrichen 44 ist immer noch regulär 44 :(

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

Bytes verschwendet auf:

  • Überprüfen Sie, ob die Länge der Eingabe gerade / ungerade ist
  • Abrufen der mittleren Zeichen
Phase
quelle
7
Ich bin sicher, dass Sie eine ungolfed Version gepostet haben, um das zu sagen;)
Conor O'Brien
4
@ CᴏɴᴏʀO'Bʀɪᴇɴ Ich habe gerade Glück gehabt: D
Phase
2

Minkolang 0.13 , 23 20 Bytes

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

Probieren Sie es hier aus.

Erläuterung

$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
quelle
1
hiyakehrt zurück istattq
Downgoat
@ Vɪʜᴀɴ: OH. Ich habe es falsch verstanden. Ich dachte, die Frage bezog sich auf den Charakter in der Mitte und ging zu der durchschnittlichen Position auf dem Boden, wenn die Länge gerade war.
El'endia Starman
@ ThomasKwa: Behoben.
El'endia Starman
@ Vɪʜᴀɴ: ^ behoben.
El'endia Starman
2

Japt , 40 29 23 21 20 Bytes

4 Bytes dank @ ן nןuɟ ן oן gespeichert

Jetzt nur noch die halbe Originallänge! Ich liebe Codegolf. :-D

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

Funktioniert ordnungsgemäß mit der leeren Zeichenfolge. Probieren Sie es online!

Wie es funktioniert

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

Wie Sie sehen können, wird viel Autoboden verwendet. (Danke, JavaScript!) Vorschläge willkommen!

ETHproductions
quelle
Das Gegenteil ist brillant +1
Downgoat
Könntest du nicht einfach tun V=Ul /2;((UcV +Uw cV )/2 d?
Mama Fun Roll
@ ן nןuɟ ן oן Nun, duh: P Ich habe cso oft ohne ein Argument verwendet, dass ich vergessen habe, dass es eines akzeptiert. Vielen Dank!
ETHproductions
2

Los, 166 156 153 Bytes

Go ist vielleicht nicht die beste Sprache zum Golfen ... aber ich liebe es so sehr und ich lerne es so sehr.

Diese Implementierung akzeptiert leere ( \n) Eingaben und unterbricht wahrscheinlich Eingaben ohne ASCII / ASCII-Erweiterung. OP hat jedoch keine Eingabe- / Ausgabecodierung angegeben, sodass ASCII alles ist, was ich ausdrücklich unterstützt habe.

Bearbeiten : fällt aus if/ else ist kürzer als switch. Jetzt weiß ich es, nehme ich an.

Golf gespielt:

package main;import ."fmt";func main(){a:="";_,_=Scanln(&a);if b:=len(a);b>0{x:=b/2;if b%2==0{Printf("%c",(a[x]+a[x+1])/2)}else{Println(string(a[x]))}}}

Ungolfed:

package main # everything in go is a package.

import . "fmt" # the dot allows for absolute package method references 
# (think "from string import *" in python)

func main() {
    a := ""
    _, _ = Scanln(&a) # a pointer to a
    if b := len(a); b > 0 { # if statements allow local assignment statements
        x := b / 2
        if b%2 == 0 { # modulo 2 is the easiest way to test evenness
#in which case, average the charcodes and print the result
            Printf("%c", (a[x]+a[x+1])/2)
        } else {
# else just find the middle character (no rounding needed; integer division in Go always results in an integer)
            Println(string(a[x]))
        }
    }
}
Katze
quelle
2

𝔼𝕊𝕄𝕚𝕟 23 Zeichen

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

Try it here (Firefox only).

Vielen Dank an @ETHProductions für die Idee!

Mama Fun Roll
quelle
2
Zum
Oh ja! Wir sind alle gebunden.
Mama Fun Roll
Wer auch immer dies ablehnte, könnte ich bitte eine Erklärung bekommen?
Mama Fun Roll
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);};

Tatsächlich wird keine Zeichenfolge zurückgegeben, und Sie erhalten ein Leerzeichen, wenn die Eingabezeichenfolge leer ist, da die Funktion immer einen Wert zurückgeben muss. Es wären 2 weitere Bytes erforderlich, um eine Zeichenfolge zurückzugeben.

Volles Programm mit Testfällen:

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

Alternativ ein vollständiges Programm, das Benutzereingaben liest und die Mitte der eingegebenen Zeichenfolge druckt:

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

Auch hier wird der gleiche Trick verwendet, bei dem ein Leerzeichen gedruckt wird, das der Benutzer nicht bemerkt, und keine leere Zeichenfolge, da die Lösung sonst 2 Byte länger ist.

adrianmp
quelle
2

Vim, 38 24 23 Tastenanschläge

Da vim in Funktion ein gebaut hat , um die Mitte zu finden Linie , aber nicht in der Mitte char , teilten wir jedes Zeichen in einer separaten Zeile zuerst unter Verwendung substitutefindet die Mittellinie, dann löschen Sie alles vor und nach ihm.

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

Wenn Sie dies ausführen möchten, achten Sie auf .vimrcDateien, die das Verhalten von .(magic regex) und g(gdefault) ändern können. Beachten Sie, dass es mir tatsächlich 3 Tastatureingaben auf meinem Computer spart :)

Vorherige Antwort

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

Nimmt einen einzeiligen Puffer als Eingabe, aktualisiert den aktuellen Puffer mit dem mittleren Zeichen. Ich dachte, dass es in vim eine Abkürzung dafür gegeben hätte!

Hinweis: Eine möglicherweise kürzere Lösung scheint eine Endlosschleife auszulösen ... Wenn jemand eine Idee hat: qq^x$x@qq@qp(12 Tastenanschläge) - es funktioniert <c-c>nach dem letzten @q...

Christian Rondeau
quelle
1

Mathematica, 118 99 Zeichen

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

Mma-Zeichen-Code-Manipulation ist teuer ...

LegionMammal978
quelle
Diese Funktion funktioniert nur einmal, es sei denn, Sie wiederholen den gesamten Code jedes Mal, wenn Sie ihn aufrufen möchten. Die Funktionseinreichungen müssen wiederverwendbar sein . Der Aufruf Ihrer Funktion unterbricht den Wert des Globalen, auf %das sie sich stützt.
Martin Ender
1
Warum nicht die verkürzten Formen von Boden und Decke verwenden?
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

Findet die mittleren 2 Zeichen.
Wenn die Anzahl der Zeichen ungerade ist, erhalten Sie das Recht der Mitte 2, das die wahre Mitte ist, wenn wir abrunden.
Wenn nicht, addieren Sie die ASCII- asc()Werte der 2 Zeichen geteilt durch 2 und geben Sie das ASCII-Zeichen chr()basierend auf diesem Wert zurück.

Ich glaube, ich kann einen der asc()Calls weggolfen, aber nicht kürzer zum Laufen bringen.

JimmyJazzx
quelle
1

K, 40 Bytes

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

> <>, 24 + 3 (für -s) = 27 Byte

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

Alte Lösung (Funktioniert nicht bei leerer Eingabe):

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

Beide nehmen Eingaben auf dem Stack durch -s. Beide sind 24 Bytes.

Probieren Sie es hier online aus.

cole
quelle
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]

Während die Eingabezeichenfolge mindestens 3 Zeichen enthält, werden die ersten und letzten Zeichen entfernt. Dies lässt entweder 1 Zeichen (sollte unverändert gedruckt werden) oder 2 (sollte gemittelt und gedruckt werden). Um dies zu handhaben, werden das erste und das letzte Zeichen der Zeichenfolge zusammenaddiert und durch zwei geteilt. Wenn es nur ein Zeichen, (a+a)/2==a. Wenn es zwei gab, muss (a+b)/2das Zeichen gedruckt werden. pb "leiht" Pythons Ausdrucksbewertung (def expression(e): return eval(e, globals()) ) aus, so dass dies automatisch belegt wird.

Die Bearbeitung leerer Eingaben kostet mich 5 Byte. Insbesondere <b[1]>in der ersten Zeile. Früher, als ich "Schnur" sagte, war das eine totale Lüge. pb hat keine Strings, sondern zufällig nahe beieinander stehende Zeichen. Wenn Sie nach dem "letzten Zeichen einer Zeichenfolge" suchen, bewegen Sie den Pinsel einfach nach links, bis er auf ein Zeichen trifft. Wenn keine Eingabe erfolgt, wird die Schleife "Wenn mindestens 3 Zeichen vorhanden sind" vollständig übersprungen und es wird nach dem letzten Zeichen gesucht. Ohne das <b[1]>würde es für immer aussehen. Dieser Code setzt ein Zeichen mit dem Wert 1 bei (-1, -1), das speziell dann gefunden wird, wenn die Eingabe leer ist. Nach dem Auffinden des "letzten Zeichens" der Zeichenfolge geht der Pinsel davon aus, dass das erste Zeichen bei (0, -1) ist, und geht direkt dorthin, wobei der Wert (1+0)/20 in pb 0 ist.

Aber Monorail, das wird noch gedruckt! Die Herausforderungsspezifikation sagt (empty input) => (empty output)! Ist das Drucken eines Nullzeichens kein Betrug? Auch das hat nichts mit dir zu tun, aber du bist schlau und gutaussehend.

Danke, hypothetischer Fragesteller. Früher, als ich "Drucken" sagte, war das eine totale Lüge. In pb werden Werte nicht wirklich gedruckt, sondern nur auf der Leinwand platziert. Anstatt "eine Möglichkeit zur Ausgabe", ist es genauer, sich die Leinwand als unendlich großes 2D-Array vorzustellen. Es erlaubt negative Indizes in beiden Dimensionen, und beim Programmieren in pb geht es wirklich darum, sicherzustellen, dass der Pinsel an die gewünschte Stelle auf der Leinwand gelangt. Wenn die Ausführung des Programms abgeschlossen ist, wird alles auf der Zeichenfläche mit nicht negativen X- und Y-Koordinaten an der entsprechenden Stelle auf der Konsole gedruckt. Wenn das Programm beginnt, wird die gesamte Zeichenfläche mit den Werten 0 gefüllt. Damit nicht unendlich viele Zeilen mit einer unendlichen Anzahl von Nullbytes gedruckt werden müssen, Jede Ausgabezeile wird nur bis zum letzten Nicht-Null-Zeichen gedruckt, und Zeilen werden nur bis zum letzten Nicht-Null-Zeichen gedruckt. Also setzen Sie ein0 at (0, 0) ist immer noch eine leere Ausgabe.

Ungolfed:

^<b[1]>                # Prevent an infinite loop on empty input

>>w[B!0]{              # While there are at least 3 chars of input:

    <w[B!0]{              # Starting at the second character:
            t[B]<b[T]>>         # Copy all characters one position to the left
                                # (Effectively erasing the first character)
    }

    <b[0]<b[0]            # Delete both copies of the last character

    <[X]>>                # Get in place to restart loop
}

w[B=0]{<}                 # Go to last character of remaining string
t[B]<[X]t[B+T]            # Find it plus the first character
vb[T/2]                   # Divide by 2 and print
untergrundbahn
quelle
1

Im Ernst , 22 20 Bytes

,O3 >WXXaXa3 >WXkæ≈c

Vielen Dank an @Mego, dass Sie in Ihrer Sprache großartig sind

Probieren Sie es online oder was auch immer

Phase
quelle
1
Dies schlägt bei leerer Eingabe fehl. Ich habe eine gelöschte 20-Byte-Lösung, die ich auch für leere Eingabe zu beheben versuche.
Lirtosiast
,;``@(lIƒbelässt Sie mit dem Eingabewert auf dem Stapel, wenn er len> 0 ist, oder beendet das Programm ansonsten. Beachten Sie, dass es eine nicht druckbare in den Backticks - Zeichen 127
Mego
@Mego Das scheint nicht zu funktionieren.
Phase
@phase Sie müssen Zeichenfolgen für die Eingabe zitieren. Das funktioniert.
Mego
@Mego Was ƒsoll der machen?
Phase
1

CoffeeScript, 104 103 Bytes

f=(x)->((y=x.length)%2&&x[y//2]||y&&String.fromCharCode (x[y/=2][z='charCodeAt']()+x[y-1][z] 0)//2)||''
rink.attendant.6
quelle
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]}

Verwendung:

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

Java 7, 152 Bytes

String c(String s){char[]a=s.toCharArray();int l=a.length,x,y;return l<2?s:""+(l%2>0?a[l/2]:(char)((x=a[l/2])>(y=a[(l/2)-1])?y+((x-y)/2):x+((y-x)/2)));}

Ungolfed & Testfälle:

Probieren Sie es hier aus.

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

Ausgabe:

3
l
q
(empty output)
x
Kevin Cruijssen
quelle
1

PHP, 147 93 Bytes

Danksagung und besonderer Dank an Jörg Hülsermann für die 54 Bytes tiefe Antwort!

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

Vorherige Version:

$s=$argv[1];$l=strlen($s);echo($l%2!=0?substr($s,$n=($l-1)/2,-$n):chr(floor(abs((ord($x=substr($s,$l/2-1,1))-ord(substr($s,$l/2,1)))/2))+ord($x)));

Testcode:

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

Online testen

Ich habe das Gefühl, dass dies verbessert werden kann, aber nicht genug Zeit dafür ...

Mario
quelle
<?=($l=strlen($s=$argv[1]))%2?$s[($l-1)/2]:chr(floor((ord($s[$l/2])+ord($s[$l/2-1]))/2));ist mein Vorschlag
Jörg Hülsermann
@ JörgHülsermann Geniales Golfen! Sie sollten es als Ihre eigene Antwort posten. Wenn ich Zeit habe, werde ich meine Antwort mehr mit Ihren netten Lösungen Golf spielen. Vielen Dank.
Mario
Fühlen Sie sich frei, es als Ihre Antwort zu nehmen
Jörg Hülsermann
1

Excel, 122 79 Bytes

Eigentlich @Sophia Lechners Antwort jetzt:

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

-5 Bytes von der anfänglichen Lösung dank @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)),"")

Für eine leere Zeichenfolge werden 12 Byte benötigt.

Wernisch
quelle
Löschen Average(...,...)und (...+...)/2für -5 Bytes verwenden. =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 akzeptiert (und unterschreibt) ein nicht ganzzahliges zweites Argument für MID, sodass Sie es nicht in Groß- und Kleinschreibung aufteilen müssen - =IFERROR(CHAR(CODE(MID(A1,LEN(A1)/2+1,1))/2+CODE(MID(A1,LEN(A1)/2+.5,1))/2),"")für 79 Byte
Sophia Lechner