Znajdź centrum

24

Biorąc pod uwagę ciąg znaków ASCII, wypisz znak znajdujący się na środku. Jeśli nie ma znaku środkowego (gdy łańcuch ma parzystą długość), wypisz znak ASCII, którego liczba porządkowa jest średnią zmienną dwóch znaków środkowych. Jeśli ciąg jest pusty, powinien zostać wyprowadzony pusty ciąg.

Przypadki testowe:

12345 => 3

Hello => l

Hiya => q

(empty input) => (empty output)

Najkrótszy program w postaci wygrywa. (Nie bajty.)

Tabela liderów

Fragment kodu na dole tego postu generuje tabelę wyników na podstawie odpowiedzi a) jako lista najkrótszych rozwiązań dla każdego języka oraz b) jako ogólna tabela wyników.

Aby upewnić się, że twoja odpowiedź się pojawi, zacznij od nagłówka, korzystając z następującego szablonu Markdown:

## Language Name, N characters 

gdzie Njest rozmiar twojego zgłoszenia. Jeśli poprawić swój wynik, to może zachować stare porachunki w nagłówku, uderzając je przez. Na przykład:

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

Jeśli chcesz umieścić w nagłówku wiele liczb (np. Ponieważ twój wynik to suma dwóch plików lub chcesz osobno wymienić kary za flagi tłumacza), upewnij się, że rzeczywisty wynik jest ostatnią liczbą w nagłówku:

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

Możesz także ustawić nazwę języka jako link, który pojawi się we fragmencie:

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

nikogo tu nie ma
źródło
15
Zazwyczaj liczymy w bajtach, aby ludzie nie mogli skompresować całego kodu, ponieważ powoduje to nudne rozwiązania. Jesteś pewien, że tego chcesz?
Downgoat
1
@ Vɪʜᴀɴ Nie sądzę, że będzie to stanowić problem, ponieważ rozwiązania i tak będą bardzo krótkie, więc kompresja nie będzie tego warta.
Ypnypn
9
Witamy w PPCG! Świetne pierwsze wyzwanie!
Conor O'Brien
2
Czy możemy pisać funkcje?
Downgoat
10
Porada: zakoduj swoje odpowiedzi w UTF-32. 4 bajty na znak. A może OP powinien po prostu pozbyć się punktacji postaci.
Mego

Odpowiedzi:

9

Pyth, 15 bajtów

Cs.O@R/lz2_BCMz

Demonstracja

Począwszy od „Hiya” jako wejścia:

              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

Zauważ, że to zawiesza się z błędem przy pustym wejściu i nie wypisuje nic do STDOUT, co jest prawidłowym sposobem na wyprowadzenie pustego ciągu przez domyślne ustawienia kodu golfa.

isaacg
źródło
Bifurcate ponownie pokazuje swoją użyteczność.
lirtosiast
whoa bifurcate jest niesamowity.
Maltysen
@KenanRhoton W odpowiedzi na proponowaną edycję sprawdź zatwierdzenie, które dodało Cfunkcjonalność podłogi: github.com/isaacg1/pyth/commit/0baf23ec Zwróć uwagę na dzień, w którym został dodany, tego samego dnia, w którym zadano to pytanie. To dlatego, że to pytanie zainspirowało mnie do dodania tej funkcjonalności, przez co nie można jej używać w tym pytaniu.
isaacg
8

Brainf ***, 61 bajtów

Chiński , 16 znaków

Wymaga to, aby dane wejściowe były w zakresie ASCII 1-127 i były zerowane. Usuwa pary znaków od początku i końca łańcucha, aż pozostanie jeden lub dwa znaki. Jeśli są dwa, dodaje je razem, a następnie dzieli przez 2, zaokrąglając w dół. Pozostały znak jest drukowany.

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

Wypróbuj na tym tłumaczu .

Sekcja:

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

* Biorąc pod uwagę, że każda instrukcja może być skompresowana do 3 bitów i zakodowana w UTF-32, cały program można technicznie wyrazić za pomocą 6 znaków.

EDYCJA: Dziękuję Janowi Dvorakowi za wprowadzenie mnie w język chiński , który kompresuje to do 16 znaków, na równi z odpowiedzią Dennisa na CJam .

蜐蕈帑聿纂胯箩悚衅鹊颂鹛拮拮氰人
Hand-E-Food
źródło
5
Given each instruction could be compressed to 3 bits and encoded in UTF64, the whole program could technically be expressed in 3 characters.Wygrałeś. Internet I wszystko inne.
kot
1
Nie sądzę, żeby to było ważne. Kod źródłowy Brainfuck to znaki +-<>,.[] , niezależnie od ich kodowania, a nie ich reprezentacje binarne. Jesteśmy zgodni co do tego, że kodowanie, którego nie może użyć istniejący tłumacz, jest nieprawidłowe.
lirtosiast
2
@ThomasKwa, stąd mój wynik zapisałem przede wszystkim w nieszyfrowanych bajtach. Kodowanie znaków właśnie przyłączyło się do idei nadużywania punktacji przez postacie.
Hand-E-Food
4
@ThomasKwa: nadszedł czas, aby niektórzy z nas stworzyli takiego tłumacza, który będzie wykorzystywany w przyszłych wyzwaniach. Wyobraź sobie, że BF pokonuje najlepsze rozwiązanie w golfa! :)
vsz
2
@vsz esolangs.org/wiki/Chinese
John Dvorak
6

CJam, 16 bajtów

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

Wypróbuj online!

Jak to działa

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
źródło
9
Dlaczego prawie każdy golf CJam / Pyth ma 10-30 znaków bez względu na trudność? Oo
Zereges
1
Trudność? To proste obliczenie mediany, bez sortowania ...
Dennis,
4
@Dennis Myślę, że o to mu chodzi. Może być mniej więcej tej samej długości zarówno dla łatwiejszych, jak i trudniejszych pytań.
geokavel
@Zereges Nie bardzo. 10-30 jest typowe dla łatwych problemów. Zobacz to, jeśli chcesz zobaczyć, jak to wygląda na coś bardziej złożonego: codegolf.stackexchange.com/a/64086/32852 .
Reto Koradi
6

TeaScript , 23 bajty 25 30 31 33

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

Wykorzystuje pomysł @ isaacga na odwrócenie łańcucha.

Wypróbuj online

Przetestuj wszystkie przypadki

Niegolfowane i objaśnienia

TeaScript jest wciąż JavaScript, więc działa podobnie jak 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
źródło
5
To kerning ...
lirtosiast
10
Ten nagłówek to rad. Chcę ten nagłówek dla każdego cholernego języka.
kot
Tak, z wyjątkiem kerningu.
kot
@sysreq lol, miało to związek z faktem, że używam innej czcionki, naprawione.
Downgoat
5

Matlab, 39 37 bajtów

floor((end+[1,2])/2) zwraca środkowe dwa indeksy łańcucha, jeśli długość jest parzysta, i zwraca środkowy indeks dwa razy, jeśli długość jest nieparzysta.

meanpo prostu zwraca średnią z tych wartości i charautomatycznie ją określa .

@(s)char(mean(s(floor(end/2+[.5,1]))))
wada
źródło
5

Kod maszynowy 8086 + DOS, 31 bajtów

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

Kod źródłowy asemblera (może być skompletowany z 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

Tutaj jest pewne delikatne użycie rejestru FLAGS. Po przesunięciu długości łańcucha w prawo o 1 bit (co odpowiada podziałowi przez 2) dwie flagi przechowują dodatkowe informacje:

  • Carry flag: zawiera bit, który został przesunięty. Jeśli bit ma wartość 1, długość była nieparzysta.
  • Flaga zero: pokazuje, czy wynik wynosi zero. Jeśli flagą przenoszenia jest 0, a flagą zero jest 1, długość wynosi zero i nic nie powinno być drukowane.

Zazwyczaj flagi powinny być natychmiast sprawdzane, ale tutaj korzystam z faktu, że movinstrukcja nie zmienia flag. Można je więc zbadać po załadowaniu środkowego znaku.

anatolig
źródło
4

Python 3, 61 59 57 55 bajtów

Staram się nie grać w golfa w językach, w których pracuję, ale to nie jest zbyt złe.

Dzięki @xsot za 2 bajty!

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

Pełny program ma 59 bajtów:

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

Wypróbuj tutaj .

lirtosiast
źródło
Ach, pobiłeś mnie do mojego następnego zadania (gdybym nie znalazł 10 bajtów do ogolenia)
cat
Nie, nie, 10 bajtów, aby zgolić moje 166 bajtowe rozwiązanie Go. Twój jest jednak o wiele bardziej elegancki.
cat
@sysreq Ach, źle zrozumiałem. I dzięki.
lirtosiast
-1-len(x)//2jest równoważne z ~len(x)//2powodu tego, jak działa podział podłogi na ujemne liczby całkowite.
xsot
@xsot Dzięki - czyni kod trochę bardziej złym :)
lirtosiast
4

Prolog, 111 bajtów

Kod

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

Wyjaśnił

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

Przykłady

>p('Hello').
l

>p('Hiya').
q
Emigna
źródło
4

R , 73 bajty

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

Wypróbuj online!

Ogromne podziękowania dla @ngm za wymyślenie tego nierekurencyjnego pomysłu - pozwolono na grę w golfa 20 bajtów.

Stare rozwiązanie:

R , 101 95 bajtów

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

Wypróbuj online!

Rozwiązanie rekurencyjne. Poprawiono jeden problem w cenie 2 bajtów:

  • dodano, try(expr, silent = TRUE)aby właściwie zarządzać przypadkiem, w którym dane wejściowe są puste.

dzięki Giusppe za 4 bajty!

JayCe
źródło
nie intToUtf8obcina liczb niecałkowitych?
Giuseppe,
@Giuseppe masz rację jak zawsze :)
JayCe
92 bajtowe rozwiązanie nierekurencyjne.
ngm
82 bajty Wolę, żebyś opublikował to jako osobną odpowiedź - jest to zupełnie inna od mojej odpowiedź!
JayCe,
Cóż, nie wymyśliłbym tego, gdybyś nie włożył w to oryginalnego wysiłku. A moja odpowiedź była jedną z najlepszych odpowiedzi na pytania w Pythonie. Dzięki wielu sztuczkom wymyśliliśmy my, ludzie. A potem skróciłeś. Więc idź i dokonaj edycji z czystym sumieniem!
ngm
4

Łuska , 11 bajtów

c½S¤+öc→←½↔

Wypróbuj online!

Wyjaśnienie

Pyszne, pyszne kombinatory do samego końca. öto „ułóż te cztery funkcje”, ¤to „zastosuj pierwszy argument do wyników zastosowania drugiego argumentu osobno dla dwóch dodatkowych argumentów”, Sto „zastosuj tę funkcję (która powinna wziąć dwa argumenty) do Strzeciego argumentu i do wyniku zastosowania Sdrugiego argumentu do trzeciego ". W związku z tym,

   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

Edytowano, aby dodać: Ściśle mówiąc, nie jest to nieco zgodne ze specyfikacją problemu, która żąda ciągu w przypadku pustego wejścia i znaku w innych przypadkach.

Ze względu na ścisłe pisanie przez Husk po prostu nie można zdefiniować funkcji / programu, który może zwrócić jeden z dwóch typów. Zdecydowałem się zwrócić pojedynczy znak we wszystkich przypadkach, a dla Huska najbardziej rozsądnym wyborem dla pojedynczego znaku do reprezentowania pustego ciągu jest '(space)'to, że jest to wartość „domyślna” (i w rzeczywistości dlatego ten program zwraca ją; wartość domyślna wartość jest używana przy pobieraniu ostatniego ( ) elementu pustej listy).

Mógłbym również rozsądnie zdecydować o zwróceniu ciągów zerowych lub jednego znaku, co nie powiedzie się w specyfikacji w przeciwnym kierunku, ale nie zrobiłem tego, ponieważ dodaje cztery bajty: Ṡ&ö;c½S¤+öc→←½↔przy ;konwersji znaku na ciąg jednego znaku, inny öwyraźne skomponowanie potrzebnych informacji oraz Ṡ&skrót w przypadku fałszowania danych wejściowych.

Sophia Lechner
źródło
3

C ++ 14, 56 bajtów

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

Anonimowa lambda bierze ciąg jako argument i zwraca int jako kod char. Na ""to zwraca 0. Nie jestem pewien, jak dokładnie powinny wyglądać dane wejściowe i wyjściowe (nie jest określone w pytaniu).

Bez golfa, z użyciem

#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
źródło
@ CᴏɴᴏʀO'Bʀɪᴇɴ gotowe.
Zereges
Nie sądzę, że możesz wyprowadzać dane za pomocą kodu znakowego, i nie sądzę, że możesz również wyprowadzać dane wyjściowe 0dla „”.
lirtosiast
Byłoby miło mieć pozorne zasady.
Zereges
54 bajty
ceilingcat
3

JavaScript (ES6), 83 bajty 89 91

Zaoszczędzono 2 bajty dzięki @ Cᴏɴᴏʀ O'Bʀɪᴇɴ

Zaoszczędź 6 bajtów dzięki @ETHproductions

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

JavaScript nie jest zbyt dobry w całym tym łańcuchu znaków.

Downgoat
źródło
Pobiłeś mnie do tego. No cóż, przynajmniej mogę ci pomóc;) s=>String.fromCharCode((s[~~(t=s.length/2-.5)][r="charCodeAt"]()+s[Math.ceil(t)][r])/2)jest o 5 bajtów krótszy.
Conor O'Brien
@ CᴏɴᴏʀO'Bʀɪᴇɴ Sweet. Muszę się ()wokół charCodeAt, więc jest to naprawdę 3 znaki, ale i tak dzięki!
Downgoat
@ ן nɟuɐɯɹɐ ן oɯ jeśli tjest liczbą całkowitą, która nie będzie działać
Downgoat
Math.ceil(t)można zmienić na0|t+.9
ETHprodukcje
@ETHproductions dzięki, że zaoszczędziłeś 6 bajtów!
Downgoat
3

O , 44 34 bajtów

Przekreślone 44 jest nadal regularne 44 :(

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

Bajty zmarnowane na:

  • Sprawdzanie, czy długość wejścia jest parzysta / nieparzysta
  • Zdobycie środkowej postaci
faza
źródło
7
Jestem pewien, że opublikowałeś wersję bez golfa;)
Conor O'Brien
4
@ CᴏɴᴏʀO'Bʀɪᴇɴ Właśnie miałem szczęście: D
faza
2

Minkolang 0,13 , 23 20 bajtów

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

Wypróbuj tutaj.

Wyjaśnienie

$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
źródło
1
hiyazwraca izamiastq
Downgoat
@ Vɪʜᴀɴ: OH. Źle to odczytałem. Myślałem, że pytaniem było o postać pośrodku, idącą do średniej pozycji swobodnej, jeśli długość była równa.
El'endia Starman
@ThomasKwa: Naprawiono.
El'endia Starman
@ Vɪʜᴀɴ: ^ Naprawiono.
El'endia Starman
2

Japt , 40 29 23 21 20 bajtów

Zaoszczędzono 4 bajty dzięki @ ן nɟuɐɯɹɐ ן oɯ

Teraz tylko połowa oryginalnej długości! Kocham golfa kodowego. :-RE

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

Działa poprawnie na pustym ciągu. Wypróbuj online!

Jak to działa

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

Jak widać, wykorzystuje wiele automatycznych podłóg. (Dzięki, JavaScript!) Sugestie mile widziane!

ETHprodukcje
źródło
Odwrotną rzeczą jest genialna +1
Downgoat
Nie mogłeś po prostu zrobić V=Ul /2;((UcV +Uw cV )/2 d?
Mama Fun Roll
@ ן nɟuɐɯɹɐ ן oɯ Cóż, duh: P Użyłem ctyle razy bez argumentu, że zapomniałem, że je zaakceptowałem. Dzięki!
ETHprodukcje
2

Idź, 166 156 153 bajtów

Go może nie być najlepszym językiem do gry w golfa ... ale tak bardzo go kocham i uczę się go, więc tam.

Ta implementacja akceptuje \ndane wejściowe puste ( ) i prawdopodobnie ulegnie awarii z danymi wejściowymi nieobjętymi ASCII / ASCII. Jednak OP nie określił kodowania wejścia / wyjścia, więc ASCII jest wszystkim, co wyraźnie poparłem.

Edycja : okazuje się if/ else jest krótsza niż switch. Teraz wiem, jak sądzę.

Gra w golfa:

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

Nie golfowany:

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]))
        }
    }
}
kot
źródło
2

𝔼𝕊𝕄𝕚𝕟, 23 znaki

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

Try it here (Firefox only).

Dzięki @ETHProductions za pomysł!

Mama Fun Roll
źródło
2
Na szczęście wyzwanie mierzone w
znakach
O tak! Wszyscy jesteśmy związani.
Mama Fun Roll
Ktokolwiek to ocenił, czy mógłbym otrzymać wyjaśnienie?
Mama Fun Roll
2

C #, 77 bajtów

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

W rzeczywistości nie zwraca łańcucha, a jeśli łańcuch wejściowy jest pusty, otrzymasz znak spacji, ponieważ funkcja musi zawsze zwracać wartość. Potrzebne będą jeszcze 2 bajty, aby zwrócić ciąg.

Pełny program z przypadkami testowymi:

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

Alternatywnie, pełny program, który odczytuje dane wprowadzone przez użytkownika i drukuje środek wprowadzonego ciągu:

C #, 144 bajty

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

Ponownie wykorzystuje tę samą sztuczkę, wypisując znak spacji, którego użytkownik nie zauważy, a nie pusty ciąg, w przeciwnym razie rozwiązanie jest o 2 bajty dłuższe.

adrianmp
źródło
2

Vim, 38 24 23 klawiszy

Ponieważ vim ma wbudowaną funkcję znajdowania środkowej linii, ale nie środkowego znaku , każdy znak w osobnej linii dzielimy najpierw za pomocą substitute, znajdź środkową linię, a następnie usuwamy wszystko po niej i przed nią.

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

Jeśli chcesz to uruchomić, uważaj na .vimrcpliki, które mogą zmienić zachowanie .(magic regex) i g(gdefault). Pamiętaj, że w rzeczywistości oszczędza mi 3 naciśnięcia klawiszy na moim komputerze :)

Poprzednia odpowiedź

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

Bierze wejściowy bufor jednowierszowy, aktualizuje bieżący bufor środkowym znakiem. Myślałem, że w vimie byłby na to skrót!

Uwaga: potencjalnie krótsze rozwiązanie wydaje się powodować nieskończoną pętlę ... Jeśli ktoś ma pomysł: qq^x$x@qq@qp(12 naciśnięć klawiszy) - działa z <c-c>ostatnim @q...

Christian Rondeau
źródło
1

Mathematica, 118 99 znaków

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

Manipulacja kodem znaków MMA jest kosztowna ...

LegionMammal978
źródło
Ta funkcja działa tylko raz, chyba że powtórzysz cały kod za każdym razem, gdy chcesz go wywołać. Ich przesłanie polega na tym, aby można je było ponownie wykorzystać . Wywołanie funkcji powoduje uszkodzenie wartości globalnej, na %której się opiera.
Martin Ender
1
Dlaczego nie skorzystać ze skróconych form podłogi i sufitu?
DavidC
1

VBA, 130 bajtów

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

Znajduje 2 środkowe postacie.
Jeśli liczba znaków jest nieparzysta, zdobądź prawo od środka 2, które będzie prawdziwym środkiem, gdy zaokrąglimy w dół.
Jeśli nie, zsumuj asc()wartości ASCII 2 Znaków podzielonych przez 2 i zwróć Znak ASCII chr()na podstawie tej wartości.

Myślę, że mogę pograć w golfa z jednym z asc()telefonów, ale nie mogłem go skrócić.

JimmyJazzx
źródło
1

K, 40 bajtów

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

> <>, 24 + 3 (dla -s) = 27 bajtów

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

Stare rozwiązanie (nie działa dla pustych danych wejściowych):

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

Oba pobierają dane wejściowe na stosie -s. Oba mają 24 bajty.

Wypróbuj online tutaj.

kapusta
źródło
1

sb , 83 bajty

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

Chociaż w ciągu wejściowym są co najmniej 3 znaki, pierwszy i ostatni są usuwane. Pozostawia to 1 znak (należy wydrukować niezmodyfikowany) lub 2 (należy uśrednić i wydrukować). Aby sobie z tym poradzić, pierwszy i ostatni znak ciągu są dodawane razem i dzielone przez dwa. Jeśli istnieje tylko jedna postać, (a+a)/2==a. Jeśli były dwa,(a+b)/2 to znak, który należy wydrukować. pb „pożycza” ocenę wyrażeń Pythona ( def expression(e): return eval(e, globals())), więc jest ona automatycznie przenoszona.

Obsługa pustych danych wejściowych kosztuje mnie 5 bajtów. W szczególności <b[1]>w pierwszej linii. Wcześniej, kiedy powiedziałem „sznurek”, było to całkowite kłamstwo. pb nie ma ciągów, ma znaki, które są blisko siebie. Szukanie „ostatniej postaci sznurka” oznacza po prostu przesuwanie pędzla w lewo, aż uderzy on w postać. Gdy nie podano danych wejściowych, pętla „dopóki są co najmniej 3 znaki” jest całkowicie pomijana i zaczyna szukać ostatniego znaku. Bez tego <b[1]>wyglądałoby to wiecznie. Ten kod umieszcza znak o wartości 1 w (-1, -1), który można znaleźć, gdy dane wejściowe są puste. Po znalezieniu „ostatniego znaku” struny pędzel przyjmuje, że pierwszy ma wartość (0, -1) i idzie tam bezpośrednio, znajdując wartość 0. (1+0)/2wynosi 0 w pb,

Ale jednoszynowy, to wciąż drukuje! Specyfikacja wyzwania mówi (empty input) => (empty output)! Czy nie jest drukowaniem znaku o zerowej wartości? To też nie ma związku, ale jesteś bystry i przystojny.

Dzięki, hipotetyczny pytający. Wcześniej, kiedy powiedziałem „drukuj”, było to całkowite kłamstwo. W PB naprawdę nie drukujesz wartości, po prostu umieszczasz je na płótnie. Zamiast „sposobu na wyjście”, bardziej dokładne jest wyobrażenie sobie płótna jako nieskończenie dużej tablicy 2D. Pozwala na ujemne wskaźniki w obu wymiarach, a wiele programów w pb polega na upewnieniu się, że pędzel dotrze do miejsca na płótnie, które chcesz. Po zakończeniu wykonywania programu wszystko na płótnie z nieujemnymi współrzędnymi X i Y jest drukowane w odpowiednim miejscu na konsoli. Po uruchomieniu programu całe płótno jest wypełnione wartościami 0. Aby nie trzeba było drukować nieskończonej liczby linii, każda z nieskończoną liczbą bajtów zerowych, każdy wiersz wyniku jest drukowany tylko do ostatniego niezerowego znaku, a linie są drukowane tylko do ostatniego z niezerowym znakiem. Więc umieszczenie0 at (0, 0) jest nadal pustym wyjściem.

Nie golfowany:

^<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
podziemny monorail
źródło
1

Poważnie , 22 20 bajtów

,O3 >WXXaXa3 >WXkæ≈c

Dzięki @Mego za bycie świetnym w swoim języku

Wypróbuj online lub cokolwiek innego

faza
źródło
1
Nie udaje się to przy pustych danych wejściowych. Mam usunięte 20-bajtowe rozwiązanie, które również próbuję naprawić dla pustych danych wejściowych.
lirtosiast
,;``@(lIƒpozostawi cię z wartością wejściową na stosie, jeśli lenjest> 0, lub zakończy program w inny sposób. Zwróć uwagę, że w backticks znajduje się niezadrukowany znak - postać 127.
Mego
@Mego To chyba nie działa.
faza
@ faza Musisz podać ciągi znaków do wprowadzenia. To działa
Mego
@Mego Co należy ƒzrobić?
faza
1

CoffeeScript, 104 103 bajty

f=(x)->((y=x.length)%2&&x[y//2]||y&&String.fromCharCode (x[y/=2][z='charCodeAt']()+x[y-1][z] 0)//2)||''
lodowisko. dozorca 6
źródło
1

Rubin, 43 42 41 bajtów

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

42 bajty

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

43 bajty

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

Stosowanie:

->a{s=a.size;puts s<1?'':s%2<1??q:a[s/2]}['12345']
=> 3
Vasu Adari
źródło
1

Java 7, 152 bajty

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

Przypadki bez golfa i testy:

Wypróbuj tutaj.

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

Wydajność:

3
l
q
(empty output)
x
Kevin Cruijssen
źródło
1

PHP, 147 93 bajtów

Podziękowania i specjalne podziękowania dla Jörga Hülsermanna za grę w golfa moją odpowiedź 54 bajty w dół!

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

Poprzednia wersja:

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

Kod testowy:

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

Przetestuj online

Mam wrażenie, że można to poprawić, ale nie mam na to czasu ...

Mario
źródło
<?=($l=strlen($s=$argv[1]))%2?$s[($l-1)/2]:chr(floor((ord($s[$l/2])+ord($s[$l/2-1]))/2));to moja propozycja
Jörg Hülsermann
@ JörgHülsermann Genialny golf! Powinieneś opublikować to jako własną odpowiedź. Jeśli będę miał czas, dam ci więcej odpowiedzi z twoimi fajnymi rozwiązaniami. Dzięki.
Mario,
Przyjmij
1

Excel, 122 79 bajtów

Właściwie odpowiedź @Sophia Lechner:

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

-5 bajtów od początkowego rozwiązania dzięki @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 bajtów potrzebnych na pusty ciąg.

Wernisch
źródło
Upuść Average(...,...)i użyj (...+...)/2dla -5 bajtów. =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 zaakceptuje (i dolne piętro) drugi argument nie będący liczbą całkowitą dla MID, więc nie musisz dzielić go na przypadki - =IFERROR(CHAR(CODE(MID(A1,LEN(A1)/2+1,1))/2+CODE(MID(A1,LEN(A1)/2+.5,1))/2),"")za 79 bajtów
Sophia Lechner