Temukan pusatnya


24

Diberikan string karakter ASCII, output karakter yang ada di tengah. Jika tidak ada karakter tengah (ketika string memiliki panjang genap), output karakter ASCII yang ordinalnya adalah rata-rata lantai dari dua karakter tengah. Jika string kosong, string kosong harus dihasilkan.

Kasus uji:

12345 => 3

Hello => l

Hiya => q

(empty input) => (empty output)

Program terpendek dalam karakter menang. (Bukan byte.)

Papan peringkat

Cuplikan Stack di bagian bawah posting ini menghasilkan leaderboard dari jawaban a) sebagai daftar solusi terpendek per bahasa dan b) sebagai leaderboard keseluruhan.

Untuk memastikan bahwa jawaban Anda muncul, silakan mulai jawaban Anda dengan tajuk utama, menggunakan templat Penurunan harga berikut:

## Language Name, N characters 

di mana Nukuran kiriman Anda. Jika Anda meningkatkan skor Anda, Anda bisa menyimpan skor lama di headline, dengan mencoretnya. Contohnya:

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

Jika Anda ingin memasukkan beberapa angka dalam tajuk Anda (mis. Karena skor Anda adalah jumlah dari dua file atau Anda ingin membuat daftar hukuman penterjemah secara terpisah), pastikan bahwa skor sebenarnya adalah angka terakhir di tajuk:

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

Anda juga dapat membuat nama bahasa menjadi tautan yang kemudian akan muncul di cuplikan:

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


15
Biasanya kami mencetak dalam byte sehingga orang tidak dapat memampatkan seluruh kode mereka, karena ini menghasilkan solusi yang membosankan. Apakah Anda yakin ini?
Downgoat

1
@ Vɪʜᴀɴ Saya tidak berpikir itu akan menjadi masalah di sini, karena solusinya akan sangat singkat, jadi mengompresi tidak akan sia-sia.
Ypnypn

9
Selamat datang di PPCG! Tantangan besar pertama!
Conor O'Brien

2
Bisakah kita menulis fungsi?
Downgoat

10
Pro-tip: menyandikan jawaban Anda di UTF-32. 4 byte per karakter. Atau mungkin OP harus menyingkirkan penilaian karakter.
Mego

Jawaban:


9

Pyth, 15 byte

Cs.O@R/lz2_BCMz

Demonstrasi

Dimulai dengan "Hiya" sebagai input:

              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

Perhatikan bahwa ini macet dengan kesalahan pada input kosong, dan tidak mencetak apa pun ke STDOUT, yang merupakan cara yang valid untuk menghasilkan string kosong dengan default kode-golf.


Bifurcate menunjukkan utilitasnya lagi.
lirtosiast

bifurkasi whoa mengagumkan.
Maltysen

@KenanRhoton Menanggapi pengeditan yang Anda ajukan, periksa komit yang menambahkan Cfungsionalitas lantai: github.com/isaacg1/pyth/commit/0baf23ec Perhatikan hari ditambahkan, pada hari yang sama pertanyaan ini ditanyakan. Itu karena pertanyaan ini mengilhami saya untuk menambahkan fungsionalitas itu, membuatnya tidak memenuhi syarat untuk digunakan pada pertanyaan ini.
isaacg

8

Brainf ***, 61 byte

Mandarin , 16 karakter

Ini membutuhkan input dalam rentang ASCII 1-127 dan diakhiri null. Ini menghapus pasangan karakter dari awal dan akhir string sampai ada satu atau dua karakter yang tersisa. Jika ada dua, itu menambahkan mereka bersama-sama, lalu membaginya dengan 2, membulatkan ke bawah. Karakter yang tersisa dicetak.

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

Cobalah dengan penerjemah ini .

Pembedahan:

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

* Mengingat setiap instruksi dapat dikompresi menjadi 3 bit dan dikodekan dalam UTF-32, seluruh program secara teknis dapat dinyatakan dalam 6 karakter.

EDIT: Dan terima kasih kepada Jan Dvorak karena memperkenalkan saya ke bahasa Mandarin , yang mengompres ini menjadi 16 karakter, setara dengan jawaban CJam Dennis .

蜐蕈帑聿纂胯箩悚衅鹊颂鹛拮拮氰人

5
Given each instruction could be compressed to 3 bits and encoded in UTF64, the whole program could technically be expressed in 3 characters.Kamu menang. Internet. Dan yang lainnya.
kucing

1
Saya rasa ini tidak valid. Kode sumber Brainfuck adalah karakter +-<>,.[] , dalam penyandian apa pun, bukan representasi binernya. Kami memiliki konsensus bahwa penyandian yang tidak dapat digunakan oleh penerjemah yang ada tidak valid.
lirtosiast

2
@ ThomasKwa, maka saya memberikan skor saya terutama dalam byte yang tidak disandikan. Pengkodean karakter baru saja bergabung dalam gagasan bahwa penilaian berdasarkan karakter dapat disalahgunakan.
Hand-E-Food

4
@ThomasKwa: saatnya bagi sebagian dari kita untuk membuat penerjemah seperti itu, untuk digunakan dalam tantangan di masa depan. Bayangkan BF mengalahkan solusi skrip golf terbaik! :)
vsz


6

CJam, 16 byte

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

Cobalah online!

Bagaimana itu bekerja

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.

9
Mengapa hampir semua golf CJam / Pyth adalah 10-30 karakter tidak peduli kesulitannya? Oo
Zereges

1
Kesulitan? Ini adalah perhitungan median sederhana, minus penyortiran ...
Dennis

4
@ Dennis Saya pikir itu yang dia maksud. Panjangnya bisa sama untuk pertanyaan yang lebih mudah dan sulit.
geokavel

@ Zona Tidak juga. 10-30 khas untuk masalah mudah. Lihat ini jika Anda ingin contoh bagaimana mencari sesuatu yang lebih kompleks: codegolf.stackexchange.com/a/64086/32852 .
Reto Koradi

6

TeaScript , 23 byte 25 30 31 33

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

Menggunakan ide @ isaacg untuk membalik string.

Cobalah online

Uji semua kasus

Penjelasan && Tidak Terkumpul

TeaScript masih JavaScript sehingga fungsinya sangat mirip dengan JavaScript juga.

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

5

10
Header itu adalah rad. Saya ingin tajuk itu untuk setiap bahasa.
kucing

Ya, kecuali kerning.
kucing

@sysreq lol, itu ada hubungannya dengan fakta saya menggunakan font yang berbeda, diperbaiki.
Downgoat


5

Matlab, 39 37 byte

floor((end+[1,2])/2) mengembalikan dua indeks tengah string jika panjangnya genap, dan mengembalikan indeks tengah dua kali jika panjangnya ganjil.

meanhanya mengembalikan rata-rata dari nilai-nilai itu dan charsecara otomatis meletakannya.

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

5

8086 kode mesin + 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

Kode sumber assembly (dapat dirakit dengan 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

Ada beberapa penggunaan halus dari pendaftaran FLAGS di sini. Setelah menggeser panjang string dengan 1 bit (yang setara dengan pembagian dengan 2), dua flag menyimpan informasi tambahan:

  • Bawalah bendera: berisi bit yang digeser keluar. Jika bitnya 1, panjangnya aneh.
  • Nol bendera: menunjukkan apakah hasilnya nol. Jika flag carry adalah 0 dan flag nol adalah 1, panjangnya nol, dan tidak ada yang harus dicetak.

Biasanya, flag harus diperiksa segera, tetapi di sini saya menggunakan fakta bahwa movinstruksi tidak mengubah flag. Jadi mereka bisa diperiksa setelah memuat char tengah.


4

Python 3, 61 59 57 55 byte

Saya mencoba untuk tidak bermain golf dengan bahasa tempat saya bekerja, tetapi ini tidak terlalu jahat.

Berkat @ xsot selama 2 byte!

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

Program lengkapnya adalah 59 byte:

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

Coba di sini .


Ah, Anda mengalahkan saya dengan tugas saya selanjutnya (seandainya saya tidak menemukan 10 byte untuk dicukur)
cat

Tidak, tidak, 10 byte untuk mencukur solusi Go 166 byte saya . Anda jauh lebih elegan.
kucing

@sysreq Ah, saya salah paham. Dan terimakasih.
lirtosiast

-1-len(x)//2setara dengan ~len(x)//2karena bagaimana pembagian lantai bekerja pada bilangan bulat negatif.
xsot

@ xsot Terima kasih — itu membuat kode sedikit lebih jahat :)
lirtosiast

4

Prolog, 111 byte

Kode

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

Dijelaskan

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

Contohnya

>p('Hello').
l

>p('Hiya').
q

4

R , 73 byte

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

Cobalah online!

Banyak terima kasih kepada @ngm untuk datang dengan ide non-rekursif ini - diizinkan untuk bermain golf 20 byte.

Solusi lama:

R , 101 95 byte

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

Cobalah online!

Solusi rekursif. Memperbaiki satu masalah dengan harga 2 byte:

  • ditambahkan try(expr, silent = TRUE)untuk mengelola case di mana input kosong.

terima kasih Giusppe untuk 4 byte!


tidak intToUtf8memotong non-integer?
Giuseppe

@ Giuseppe Anda benar seperti biasa :)
JayCe

92 byte solusi non-rekursif.
ngm

82 byte Saya lebih suka Anda mempostingnya sebagai jawaban yang terpisah - sama sekali berbeda dari jawaban saya!
JayCe

Yah, aku tidak akan memunculkannya kecuali kamu telah memasukkan upaya asli. Dan jawaban saya adalah port dari jawaban Pyth mendapatkan suara terbanyak. Dengan banyak trik, kami orang-orang R telah muncul. Dan kemudian Anda membuatnya lebih pendek. Jadi, teruskan dan edit dengan hati nurani yang jelas!
ngm

4

Sekam , 11 byte

c½S¤+öc→←½↔

Cobalah online!

Penjelasan

Combinator lezat dan lezat sepanjang jalan. öadalah "menyusun keempat fungsi ini", ¤adalah "menerapkan argumen pertama ke hasil menerapkan argumen kedua ke dua argumen tambahan secara terpisah", Sadalah "menerapkan fungsi ini (yang harus mengambil dua argumen) untuk Sargumen ketiga dan hasilnya menerapkan Sargumen kedua ke argumen ketiga ". Karena itu,

   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

Diedit untuk menambahkan: Sebenarnya, ini sedikit gagal untuk menyesuaikan dengan spesifikasi masalah, yang meminta string dalam kasus input kosong dan karakter dalam kasus lain.

Karena pengetikan yang ketat pada Husk, tidak mungkin untuk mendefinisikan suatu fungsi / program yang dapat mengembalikan salah satu dari dua jenis. Saya memilih untuk mengembalikan satu karakter dalam semua kasus, dan untuk Husk, pilihan paling masuk akal untuk satu karakter untuk mewakili string kosong adalah '(space)'karena itulah nilai "default" (dan pada kenyataannya, itulah sebabnya program ini mengembalikannya; default nilai digunakan saat mengambil item ( ) terakhir dari daftar kosong).

Saya bisa juga secara wajar memilih untuk mengembalikan string nol atau satu karakter, yang akan gagal spesifikasi ke arah lain, tetapi saya tidak melakukannya karena menambahkan empat byte:, Ṡ&ö;c½S¤+öc→←½↔dengan ;mengubah karakter menjadi string satu karakter, yang lain öuntuk secara eksplisit menyusun yang diperlukan, dan Ṡ&untuk pintas dalam kasus input palsu.


3

C ++ 14, 56 byte

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

Lambda anonim mengambil string sebagai argumen dan mengembalikan int sebagai kode char. Karena "", ia kembali 0. Tidak yakin bagaimana persisnya input dan output akan terlihat (tidak ditentukan dalam pertanyaan).

Tidak disatukan, dengan penggunaan

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

@ CʀɪᴇɴO'Bʀɪᴇɴ selesai.
Zereges

Saya tidak berpikir Anda bisa menampilkan dengan kode karakter, dan saya juga tidak berpikir Anda bisa menampilkan 0untuk "".
lirtosiast

Akan menyenangkan memiliki aturan yang jelas.
Zereges


3

JavaScript (ES6), 83 byte 89 91

Disimpan 2 byte berkat @ Cᴏɴᴏʀ O'Bʀɪᴇɴ

Disimpan 6 byte berkat produk @ETH

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

JavaScript tidak terlalu bagus di semua kode char string ini.


Anda mengalahkan saya untuk itu. Oh well, setidaknya yang bisa saya lakukan adalah membantu Anda;) s=>String.fromCharCode((s[~~(t=s.length/2-.5)][r="charCodeAt"]()+s[Math.ceil(t)][r])/2)lebih pendek 5 byte.
Conor O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴ Manis. Saya butuh ()sekitar charCodeAtjadi benar-benar 3 karakter, tapi terima kasih!
Downgoat

@ ן nɟuɐɯɹɐ ן oɯ jika tbilangan bulat tidak berfungsi
Downgoat

Math.ceil(t)dapat diubah menjadi0|t+.9
ETHproduksi

@ ETHproduk terima kasih, Itu menghemat 6 byte!
Downgoat

3

O , 44 34 byte

Dicoret 44 masih teratur 44 :(

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

Bytes terbuang pada:

  • Memeriksa apakah panjang inputnya genap / ganjil
  • Mendapatkan karakter tengah

7
Saya yakin Anda memposting versi yang tidak disunat untuk mengatakan itu;)
Conor O'Brien

4
@ CᴏɴᴏʀO'Bʀɪᴇɴ Saya baru saja beruntung: D
fase

2

Minkolang 0,13 , 23 20 byte

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

Coba di sini.

Penjelasan

$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.

1
hiyakembali isebagai gantinyaq
Downgoat

@ Vɪʜᴀɴ: OH. Saya salah baca. Saya pikir pertanyaannya adalah meminta karakter di tengah, pergi ke posisi rata-rata lantai jika panjangnya genap.
El'endia Starman

@ ThomasKwa: Tetap.
El'endia Starman

@ Vɪʜᴀɴ: ^ Diperbaiki.
El'endia Starman

2

Japt , 40 29 23 21 20 byte

Disimpan 4 byte berkat @ ן nɟuɐɯɹɐ ן oɯ

Sekarang hanya setengah dari panjang aslinya! Saya suka golf kode. :-D

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

Bekerja dengan baik pada string kosong. Cobalah online!

Bagaimana itu bekerja

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

Seperti yang Anda lihat, ini menggunakan banyak auto-flooring. (Terima kasih, JavaScript!) Saran diterima!


Hal sebaliknya adalah +1 brilian
Downgoat

Tidak bisakah kamu melakukannya V=Ul /2;((UcV +Uw cV )/2 d?
Mama Fun Roll

@ ן nɟuɐɯɹɐ ן oɯ Baiklah, ya: P Saya sudah sering menggunakan ctanpa argumen sehingga saya lupa itu diterima. Terima kasih!
ETHproductions

2

Pergi, 166 156 153 byte

Pergi mungkin bukan bahasa terbaik untuk bermain golf ... tapi saya menyukainya, sangat banyak, dan saya mempelajarinya, jadi di sana.

Implementasi ini menerima \ninput kosong ( ) dan mungkin akan terputus dengan input non-ASCII / ASCII. Namun, OP belum menentukan pengkodean input / output sehingga ASCII adalah semua yang saya dukung secara eksplisit.

Mengedit : Ternyata if/ else adalah lebih pendek dari switch. Sekarang saya tahu, saya kira.

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

Tidak Disatukan:

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


2

C #, 77 byte

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

Sebenarnya tidak mengembalikan string, dan Anda akan mendapatkan karakter spasi jika string input kosong karena fungsi harus selalu mengembalikan nilai. Diperlukan 2 byte lagi untuk mengembalikan sebuah string.

Program lengkap dengan uji kasus:

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

Atau, program lengkap yang membaca input pengguna dan mencetak pusat string yang dimasukkan:

C #, 144 byte

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

Sekali lagi, ia menggunakan trik yang sama untuk mencetak karakter spasi, yang tidak akan dilihat pengguna, dan bukan string kosong, jika tidak solusinya 2 byte lebih lama.


2

Vim, 38 24 23 penekanan tombol

Karena vim telah dibangun di fungsi untuk menemukan tengah garis tapi tidak tengah arang , kami membagi setiap karakter pada baris terpisah pertama yang menggunakan substitute, menemukan garis tengah, kemudian hapus semuanya setelah dan sebelum.

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

Jika Anda ingin menjalankan ini, waspadalah terhadap .vimrcfile yang dapat mengubah perilaku .(regex ajaib) dan g(gdefault). Perhatikan bahwa itu sebenarnya menyelamatkan saya 3 kali penekanan tombol pada mesin saya :)

Jawaban sebelumnya

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

Mengambil buffer satu baris sebagai input, memperbarui buffer saat ini dengan karakter tengah. Saya pikir akan ada jalan pintas untuk ini di vim!

Catatan: solusi yang berpotensi lebih pendek tampaknya menyebabkan loop tak terbatas ... Jika seseorang memiliki ide: qq^x$x@qq@qp(12 penekanan tombol) - ini berfungsi dengan <c-c>setelah yang terakhir @q...


1

Mathematica, 118 99 karakter

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

Manipulasi kode karakter mma mahal ...


Fungsi ini hanya berfungsi sekali, kecuali jika Anda mengulangi seluruh kode setiap kali Anda ingin menyebutnya. Titik pengiriman fungsi adalah agar mereka dapat digunakan kembali . Memanggil fungsi Anda merusak nilai global %yang diandalkannya.
Martin Ender

1
Mengapa tidak menggunakan bentuk pendek Lantai dan Langit-langit?
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

Menemukan 2 Karakter Tengah.
Jika jumlah Karakter Ganjil maka dapatkan Right of the Middle 2 yang akan menjadi tengah yang benar saat kita dibulatkan ke bawah.
Jika tidak jumlah ASCIIasc() dari 2 Karakter dibagi 2 dan kembalikan Karakter ASCII chr()berdasarkan nilai itu.

Saya pikir saya bisa bermain golf salah satu asc()panggilan, tetapi tidak bisa membuatnya bekerja lebih pendek.



1

> <>, 24 + 3 (untuk -s) = 27 byte

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

Solusi lama (Tidak berfungsi untuk input kosong):

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

Keduanya mengambil input melalui stack -s. Keduanya 24 byte.

Cobalah online di sini.


1

pb , 83 byte

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

Meskipun setidaknya ada 3 karakter dalam string input, yang pertama dan terakhir dihapus. Ini menyisakan 1 karakter (harus dicetak tidak dimodifikasi) atau 2 (harus dirata-rata dan dicetak). Untuk menangani ini, karakter pertama dan terakhir dari string ditambahkan bersama-sama dan dibagi dua. Jika hanya ada satu karakter (a+a)/2==a,. Jika ada dua,(a+b)/2 adalah karakter yang perlu dicetak. pb "meminjam" evaluasi ekspresi Python ( def expression(e): return eval(e, globals())) jadi ini secara otomatis didasarkan.

Menangani input kosong menghabiskan biaya 5 byte. Secara khusus, <b[1]>pada baris pertama. Sebelumnya, ketika saya mengatakan "string", itu adalah kebohongan total. pb tidak memiliki string, ia memiliki karakter yang berdekatan satu sama lain. Mencari "karakter terakhir dari string" hanya berarti menggerakkan kuas ke kiri hingga menyentuh karakter. Ketika tidak ada input yang disediakan, loop "sementara setidaknya ada 3 karakter" dilewati seluruhnya dan mulai mencari karakter terakhir. Tanpa itu <b[1]>, ia akan terus mencari selamanya. Kode itu menempatkan karakter dengan nilai 1 pada (-1, -1) khusus ditemukan ketika input kosong. Setelah menemukan "karakter terakhir" dari string kuas mengasumsikan yang pertama adalah pada (0, -1) dan langsung ke sana, menemukan nilai 0. (1+0)/2adalah 0 dalam pb,

Tapi monorel, itu masih dicetak! Spesifikasi tantangan mengatakan (empty input) => (empty output)! Bukankah mencetak kecurangan karakter nol? Juga, ini tidak berhubungan, tetapi Anda cerdas dan tampan.

Terima kasih, penanya-pertanyaan hipotetis. Sebelumnya, ketika saya mengatakan "cetak", itu adalah kebohongan total. Di pb, Anda tidak benar-benar mencetak nilai, Anda cukup meletakkannya di kanvas. Daripada "cara untuk output", lebih tepat untuk membayangkan kanvas sebagai array 2D yang sangat besar. Ini memungkinkan indeks negatif di kedua dimensi, dan banyak pemrograman di pb benar-benar memastikan sikat sampai ke lokasi di kanvas yang Anda inginkan. Ketika program selesai dieksekusi, semua yang ada di kanvas dengan koordinat X dan Y yang tidak negatif akan dicetak ke lokasi yang sesuai di konsol. Ketika program dimulai, seluruh kanvas diisi dengan nilai 0. Agar tidak harus mencetak jumlah baris yang tak terbatas, masing-masing dengan jumlah byte nol yang tak terbatas, setiap baris output hanya dicetak hingga karakter bukan nol terakhir, dan baris hanya dicetak hingga yang terakhir dengan karakter bukan nol di dalamnya. Jadi menempatkan a0 at (0, 0) masih merupakan output kosong.

Tidak Disatukan:

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

1

Serius , 22 20 byte

,O3 >WXXaXa3 >WXkæ≈c

Terima kasih @Mego karena mahir dalam bahasa Anda

Cobalah online atau apa pun


1
Ini gagal untuk input kosong. Saya memiliki solusi 20-byte yang dihapus yang saya juga coba perbaiki untuk input kosong.
lirtosiast

,;``@(lIƒakan meninggalkan Anda dengan nilai input pada tumpukan jika nilainya len> 0, atau menghentikan program sebaliknya. Perhatikan bahwa ada backticks yang tidak bisa dicetak - karakter 127.
Mego

@Mego Ini sepertinya tidak berfungsi.
fase

@ fase Anda harus mengutip string untuk input. Ini bekerja.
Mego

@Mego Apa yang ƒharus dilakukan?
fase

1

CoffeeScript, 104 103 byte

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

1

Ruby, 43 42 41 byte

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

42 byte

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

43 byte

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

Pemakaian:

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

1

Java 7, 152 byte

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

Kasus yang tidak disatukan & uji:

Coba di sini.

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

Keluaran:

3
l
q
(empty output)
x

1

PHP, 147 93 byte

Penghargaan dan terima kasih khusus kepada Jörg Hülsermann karena golf jawaban saya turun 54 byte!

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

Versi sebelumnya:

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

Kode pengujian:

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

Tes online

Saya merasa ini bisa diperbaiki, tetapi tidak cukup waktu untuk itu ...


<?=($l=strlen($s=$argv[1]))%2?$s[($l-1)/2]:chr(floor((ord($s[$l/2])+ord($s[$l/2-1]))/2));adalah proposal saya
Jörg Hülsermann

@ JörgHülsermann Golf yang brilian! Anda harus mempostingnya sebagai jawaban Anda sendiri. Jika saya punya waktu saya akan golf jawaban saya lebih banyak dengan solusi bagus Anda. Terima kasih.
Mario

Jangan ragu untuk menganggapnya sebagai jawaban Anda
Jörg Hülsermann

1

Excel, 122 79 byte

Sebenarnya jawaban @Sophia Lechner sekarang:

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

-5 byte dari solusi awal berkat @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)),"")

Diperlukan 12 byte untuk String Kosong.


Jatuhkan Average(...,...)dan gunakan (...+...)/2untuk -5 byte. =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 akan menerima (dan memberi dasar) argumen kedua non-integer ke MID, jadi Anda tidak perlu membaginya menjadi kasing - =IFERROR(CHAR(CODE(MID(A1,LEN(A1)/2+1,1))/2+CODE(MID(A1,LEN(A1)/2+.5,1))/2),"")untuk 79 byte
Sophia Lechner
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.