Merkez bulmak


24

Bir dizi ASCII karakteri verildiğinde, ortadaki karakteri çıkar. Orta karakter yoksa (dize düzgün bir uzunlukta olduğunda), sıra iki orta karakterin taban ortalaması olan ASCII karakterini çıkarır. Dize boşsa, boş bir dizge çıkarılmalıdır.

Test durumları:

12345 => 3

Hello => l

Hiya => q

(empty input) => (empty output)

Karakterlerdeki en kısa program kazanır. (Bayt değil.)

Liderler Sıralaması

Bu yazının altındaki Yığın Parçacığı, a) dilindeki en kısa çözümlerin bir listesi olarak ve b) genel bir lider tablosu olarak cevaplardan lider tablosu oluşturur.

Cevabınızın göründüğünden emin olmak için, lütfen aşağıdaki Markdown şablonunu kullanarak cevabınızı bir başlık ile başlatın:

## Language Name, N characters 

Gönderinizin Nbüyüklüğü nerede ? Puanınızı artırmak varsa, olabilir onları içinden vurarak, başlığa eski hesapları tutmak. Örneğin:

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

Başlığınıza birden çok sayı eklemek istiyorsanız (örneğin, puanınız iki dosyanın toplamı olduğundan veya tercüman bayrağı cezalarını ayrı ayrı listelemek istediğinizden dolayı), gerçek puanın başlıktaki son sayı olduğundan emin olun :

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

Dil adını, daha sonra pasajda görünecek bir bağlantı da yapabilirsiniz:

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


15
Genellikle bayt cinsinden puan alırız, böylece insanlar tüm kodlarını sıkıştıramaz, çünkü bu sıkıcı çözümlere yol açar. Bunu istediğinden emin misin?
Downgoat

1
@ Vɪʜᴀɴ Burada bir sorun olacağını sanmıyorum, çünkü çözümler zaten çok kısa olacak, bu yüzden sıkıştırma buna değmeyecek.
Kasım'da

9
PPCG'ye Hoşgeldiniz! Büyük ilk meydan okuma!
Conor O'Brien

2
İşlev yazabilir miyiz?
Downgoat

10
Pro-tip: cevaplarınızı UTF-32 olarak kodlayın. Karakter başına 4 bayt. Ya da belki OP sadece karakter puanlamalarından kurtulmalıdır.
Mego

Yanıtlar:


9

Pyth, 15 bayt

Cs.O@R/lz2_BCMz

gösteri

Giriş olarak "Hiya" ile başlayarak:

              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

Bunun boş girişte bir hatayla çarpıştığını ve kod-golf varsayılanlarına göre boş bir dize çıkarmanın geçerli bir yolu olan STDOUT'a hiçbir şey basmadığını unutmayın.


Bifurcate yardımcı programını tekrar gösterir.
lirtosiast

bir bifürkat harika.
Maltysen

@KenanRhoton Önerilen düzenlemenize cevap olarak, Cdöşeme işlevselliğini ekleyen taahhüdünüzü inceleyin : github.com/isaacg1/pyth/commit/0baf23ec Eklendiği güne dikkat edin, bu sorunun sorulduğu gün aynı gün. Çünkü bu soru bana bu işlevi eklemem için ilham verdi ve bu soruda kullanılmaya uygun olmadı.
isaacg

8

Brainf ***, 61 bayt

Çince , 16 karakter

Bu, girişin ASCII 1-127 aralığında olmasını ve boş sonlandırılmasını gerektirir. Kalan bir veya iki karakter olana kadar karakter çiftlerini dizenin başından ve sonundan siler. İki varsa, bunları bir araya getirir, daha sonra yuvarlayarak 2'ye böler. Kalan karakter yazdırılır.

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

Bu tercüman üzerinde deneyin .

diseksiyon:

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

* Her komut 3 bite sıkıştırılıp UTF-32'de kodlanabildiği için tüm program teknik olarak 6 karakter olarak ifade edilebilir.

EDIT: Ve Jan Dvorak'a bunu 16 karaktere sıkıştıran Çince'yi tanıttığım için teşekkürler , Dennis'in CJam cevabı ile aynı .

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

5
Given each instruction could be compressed to 3 bits and encoded in UTF64, the whole program could technically be expressed in 3 characters.Sen kazandın. İnternet. Ve diğer herşey.
kedi

1
Bunun geçerli olduğunu sanmıyorum. Brainfuck kaynak kodu, hangi kodlamada olursa olsun, ikili gösterimleri değil karakterlerdir +-<>,.[] . Mevcut bir tercüman tarafından kullanılamayan bir kodlamanın geçersiz olduğu konusunda fikir birliğine sahibiz .
lirtosiast

2
@ThomasKwa, bu nedenle skorumu öncelikle kodlanmamış bayt olarak verdim. Karakter kodlaması sadece karakter puanlarının kötüye kullanılabileceği fikrine katılıyordu.
El-E-Yemek

4
@ThomasKwa: Bazılarımızın böyle bir tercüman yapma, gelecekteki zorluklarda kullanılma zamanı. BF'nin en iyi golf senaryosu çözümünü geçtiğini hayal edin! :)
24:15 vs vsz


6

CJam, 16 bayt

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

Çevrimiçi deneyin!

Nasıl çalışır

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
Neredeyse herhangi bir CJam / Pyth golf, zorluk ne olursa olsun 10-30 karakterdir? Oo
Zereges 23:15

1
Zorluk? Bu basit bir medyan hesaplamasıdır, sıralama
Dennis

4
@Dennis Ben onun ne demek istediğini düşünüyorum. Hem daha kolay hem de daha zor sorular için aynı uzunlukta olabilir.
geokavel

@Zereges Gerçekten değil. 10-30 kolay problemler için tipiktir. Daha karmaşık bir şey için nasıl göründüğüne bir örnek istiyorsanız, bakın: codegolf.stackexchange.com/a/64086/32852 .
Reto Koradi 24:15

6

TeaScript , 23 bayt 25 30 31 33

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

@ İsaacg'ın dizeyi tersine çevirme fikrini kullanır.

Çevrimiçi deneyin

Tüm davaları test et

Ungolfed ve Açıklama

TeaScript hala JavaScript'tir, bu yüzden de JavaScript gibi çalışır.

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
O
kerning

10
Bu başlık rad. Her lanet dil için bu başlığı istiyorum.
kedi

Evet, karakter aralığı hariç.
kedi

@sysreq lol, ben farklı bir yazı tipi kullanıyorum aslında düzeltmek zorunda kaldı.
Downgoat


5

Matlab, 39 37 bayt

floor((end+[1,2])/2) uzunluk eşitse dizenin orta iki dizinini döndürür, uzunluk tek ise iki kez orta göstergeyi döndürür.

meansadece bu değerlerin ortalamasını döndürür ve charotomatik olarak döşer.

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

5

8086 makine kodu + DOS, 31 bayt

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

Montaj kaynak kodu (püs ile birleştirilebilir):

    .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

Buradaki FLAGS kaydının bazı hassas kullanımları vardır. Dizenin uzunluğunu 1 bit sağa kaydırdıktan sonra (ki bu 2'ye bölünür), iki bayrak ek bilgi depolar:

  • Taşıma bayrağı: kaydırılan ucu içerir. Bit 1 ise, uzunluk garipti.
  • Sıfır bayrağı: sonucun sıfır olup olmadığını gösterir. Taşıma bayrağı 0 ise ve sıfır bayrağı 1 ise, uzunluk sıfırdı ve hiçbir şey yazdırılmamalıdır.

Normalde, bayraklar derhal kontrol edilmelidir, ama burada movtalimatın bayrakları değiştirmemesi gerçeğini kullanıyorum . Böylece orta karakter yüklendikten sonra incelenebilirler.


4

Python 3, 61 59 57 55 bayt

Çalıştığım dillerle golf oynamaya çalışmıyorum, ama bu çok kötü değil.

2 bayt için @xsot'a teşekkürler!

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

Tam program 59 bayttır:

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

Burada dene .


Ah, beni sonraki görevimin ne olacağı konusunda yendin (tıraş olmak için 10 bayt bulamadım)
kedi

Hayır, hayır, 166 byte Go çözümümü tıraş etmek için 10 bayt . Bununla birlikte, sizinkiler çok daha şık.
kedi,

@sysreq Ah, yanlış anladım. Ve teşekkürler.
lirtosiast

-1-len(x)//2~len(x)//2kat bölümünün negatif tamsayılarda nasıl çalıştığından dolayı buna eşdeğerdir .
24:15 xsot

@xsot Teşekkürler - bu kodu biraz daha kötü yapar :)
lirtosiast

4

Prolog, 111 bayt

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

Açıklaması

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

Örnekler

>p('Hello').
l

>p('Hiya').
q

4

R , 73 bayt

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

Çevrimiçi deneyin!

Bu özyinelemeli olmayan fikirle geldiği için @ ngm'ye çok teşekkürler - 20 byte golf oynamaya izin verildi.

Eski çözüm:

R , 101 95 bayt

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

Çevrimiçi deneyin!

Özyinelemeli çözüm. 2 bayt fiyatındaki bir sorun düzeltildi:

  • try(expr, silent = TRUE)girişin boş olduğu durumu düzgün bir şekilde yönetmek için eklendi .

4 bayt için teşekkürler Giusppe!


gelmez intToUtf8olmayan tamsayılar kesecek?
Giuseppe

@Giuseppe her zamanki gibi haklısın :)
JayCe

92 bayt özyinelemeli olmayan çözüm.
NGM

82 bytes Ayrı bir cevap olarak göndermenizi tercih ederim - cevabımdan tamamen farklı!
JayCe,

Asıl gayreti göstermeseydin, bu konuyu çözemezdim. Ve cevabım en yüksek oyu alan Pyth cevabının limanıydı. Bir sürü hileyle, biz R insanları bulduk. Ve sonra kısalttın. Öyleyse devam edin ve düzenlemeyi net bir vicdanla yapın!
NGM

4

Kabuğu , 11 bayt

c½S¤+öc→←½↔

Çevrimiçi deneyin!

açıklama

Lezzetli, lezzetli birleştiriciler tamamen aşağı. ö"bu dört işlevi oluştur", ¤"ikinci argümanı iki ek argümana ayrı ayrı uygulama sonuçlarına ilk argümanı uygula", S"" bu işlevi (iki argüman alması gereken) Süçüncü argümana ve sonuca uygula Sikinci argümanını üçüncü sırasına uygulamak ". Bu nedenle,

   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

Eklemek için düzenlendi: Kesinlikle konuşursak, bu, boş bir giriş durumunda bir dize ve diğer durumlarda bir karakter isteyen sorun belirtimine uymamakta biraz başarısız oluyor.

Husk'un katı yazması nedeniyle, iki türden birini geri getirebilecek bir işlev / program tanımlamak mümkün değildir. Her durumda tek bir karakter döndürmeyi seçtim ve Husk için boş dizgeyi temsil etmek için tek bir karakter için en makul seçenek, '(space)'çünkü "varsayılan" değer (ve aslında, bu programın döndürdüğü değer; Boş bir listenin son ( ) maddesi alınırken değer kullanılır .

Dört bayt ekler çünkü ben de makul diğer yönde şartname başarısız olur sıfır veya bir karakter dizeleri döndürmek için seçmiş, ama yapmadım: Ṡ&ö;c½S¤+öc→←½↔ile ;tek karakter dizesine karakterini dönüştürülmesi, başka öaçıkça gerekli Ṡ&olanı ve sahte giriş durumunda kısayol oluşturmak .


3

C ++ 14,56 bayt

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

Anonim lambda stringi argüman olarak alarak int karakterini char kodu olarak döndürür. Çünkü "", geri döner 0. Giriş ve çıkışın nasıl görünmesi gerektiğinden emin değil (soruda belirtilmemiş).

Ungolfed, kullanımı ile

#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ʀɪᴇɴ yapıldı.
Zereges

Karakter koduyla çıktı yazabileceğinizi sanmıyorum 0ve "" için de çıktı yazabileceğinizi sanmıyorum .
lirtosiast 24:15

Belirgin kurallara sahip olmak güzel olurdu.
Zereges


3

JavaScript (ES6), 83 bayt 89 91

@ Cᴏɴᴏʀ O'Bʀɪᴇɴ sayesinde 2 bayt kaydedildi

@ETHproductions sayesinde 6 bayt kurtarıldı

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

JavaScript, bu karakter dizgisi kodunda çok iyi değil.


Beni yendin. Oh, en azından size yardımcı olabilirim;) s=>String.fromCharCode((s[~~(t=s.length/2-.5)][r="charCodeAt"]()+s[Math.ceil(t)][r])/2)5 bayt daha kısa.
Conor O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴ Tatlı. ()Etrafa ihtiyacım var, charCodeAtbu yüzden gerçekten 3 karakter, ama yine de teşekkürler!
Downgoat

@ ן nɟuɐɯɹɐ ן oɯ tişe yaramayacak bir tamsayıysa
Downgoat

Math.ceil(t)değiştirilebilir0|t+.9
ETHproductions

@ETHproductions teşekkürler, Bu 6 bayt kurtardı!
Downgoat

3

O , 44 34 bayt

44 çarpı hala normal 44 :(

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

Harcanan bayt sayısı:

  • Girişin uzunluğunun çift / tek olup olmadığını kontrol etme
  • Orta karakterleri almak

7
Emin Söyleyecek bir ungolfed versiyonunu yayınlanmıştır ediyorum;)
Conor O'Brien

4
@ CᴏɴᴏʀO'Bʀɪᴇɴ Şanslı oldum: D
faz

2

Minkolang 0.13 , 23 20 bayt

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

Burada dene.

açıklama

$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
hiyaiyerine dönerq
Downgoat

V: OH. Yanlış okudum. Sorunun ortadaki karakteri sorduğunu , uzunluğu eşitse döşenmiş ortalama pozisyona gittiğini sanıyordum .
El'endia Starman

@ThomasKwa: Sabit.
El'endia Starman

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

2

Japt , 40 29 23 21 20 bayt

@ ן nɟuɐɯɹɐ ן oɯ sayesinde 4 bayt kaydedildi

Şimdi orijinal uzunluk sadece yarısı! Ben kod golfü severim. :-D

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

Boş dizgede düzgün çalışıyor. Çevrimiçi deneyin!

Nasıl çalışır

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

Gördüğünüz gibi, çok sayıda otomatik döşeme kullanıyor. (Teşekkürler, JavaScript!) Önerileriniz hoş geldiniz!


Ters bir şey parlak 1 olduğunu
Downgoat

Sadece yapamaz V=Ul /2;((UcV +Uw cV )/2 dmısın?
Mama Fun Roll

@ ן nɟuɐɯɹɐ ן oɯ Pekala, ah: P Kabul ettiğimi ciddia ettiğim bir tartışma olmadan defalarca kullandım . Teşekkürler!
ETHProductions 24:15

2

Go, 166 156 153 bayt

Gitmek golf oynamak için en iyi dil olmayabilir ... ama onu seviyorum, çok seviyorum ve ben de öğreniyorum.

Bu uygulama boş ( \n) girişi kabul eder ve muhtemelen ASCII / ASCII uzatılmış olmayan girişlerden ayrılır. Ancak, OP giriş / çıkış kodlamasını belirtmedi, bu yüzden ASCII açıkça desteklediğim tek şey.

Düzenleme : çıkıyor if/ else daha kısa switch. Şimdi biliyorum, sanırım.

golfed:

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


2

C #, 77 bayt

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

Aslında bir dize döndürmez ve giriş dizesi boşsa, işlev her zaman bir değer döndürmesi gerektiğinden boşluk karakteri alırsınız. Bir dize döndürmek için 2 bayt daha gerekir.

Test vakaları ile tam program:

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

Alternatif olarak, kullanıcı girişini okuyan ve girilen dizenin merkezini basan tam bir program:

C #, 144 bayt

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

Yine, kullanıcının farkına varamayacağı ve boş bir dize olmayan bir boşluk karakteri yazdırma aynı numarayı kullanır, aksi takdirde çözüm 2 bayttır.


2

Vim, 38 24 23 tuş vuruşlarını

Vim orta çizgiyi bulmak için yerleşik bir işleve sahip olduğundan , orta karakteri değil , önce her karakteri ayrı bir satırda böler substitute, orta çizgiyi bulur, sonra da her şeyden önce ve sonra her şeyi sileriz.

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

Bunu çalıştırmak istiyorsanız .vimrc, .(sihirli regex) ve g(gdefault) davranışını değiştirebilecek dosyalara dikkat edin . Makineme 3 tuşa basılmasını sağladığını unutmayın :)

Önceki cevap

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

Giriş olarak bir satır tampon alır, mevcut tamponu orta karakterle günceller. Bunun için kısayol olacağını düşündüm!

Not: Potansiyel olarak daha kısa bir çözüm sonsuz bir döngüye neden oluyor gibi görünüyor ... Birinin bir fikri varsa: qq^x$x@qq@qp(12 tuşa basma) - <c-c>sondan sonra @q...


1

Mathematica, 118 99 karakter

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

Mma karakter kodu manipülasyon pahalı ...


Bu işlev yalnızca bir kez çalışır, kodun tamamını aramak istediğiniz her seferinde tekrar etmediğiniz sürece. İşlev gönderimlerinin amacı yeniden kullanılabilir olmalarıdır . İşlevinizi çağırmak, %dayandığı globalin değerini bozar.
Martin Ender

1
Neden kısaltılmış Döşeme ve Tavan kullanmıyorsunuz?
DavidC

1

VBA, 130 Bayt

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

Orta 2 Karakteri bulur.
Karakter sayısı Tekse, o zaman yuvarladığımız gibi gerçek orta olacak olan Orta 2'nin Hakını alın.
Değilse asc(), 2 Karakterin ASCII değerlerini 2'ye bölerek toplayın chr()ve bu değere göre ASCII Karakterini döndürün .

Sanırım asc()çağrılardan birini golf oynayabilirim ama daha kısa sürede çalışamadı.



1

> <>, 24 + 3 (-s için) = 27 bayt

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

Eski çözüm (Boş giriş için çalışmıyor):

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

Her ikisi de yığın üzerinden girdi almak -s . Her ikisi de 24 bayttır.

Burada çevrimiçi deneyin.


1

pb , 83 bayt

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

Giriş dizesinde en az 3 karakter varken, ilk ve son kaldırılır. Bu, ya 1 karakter (değiştirilmeden yazdırılmalıdır) ya da 2 (ortalama ve yazdırılmalıdır) bırakır. Bunu işlemek için dizenin ilk ve son karakterleri birlikte eklenir ve ikiye bölünür. Sadece bir karakter varsa (a+a)/2==a. İki varsa, (a+b)/2basılması gereken karakter. pb Python'un ifade değerlendirmesini “ödünç alır”def expression(e): return eval(e, globals()) ) , bu nedenle bu otomatik olarak kaplanır.

Boş girdilerin kullanılması bana 5 bayta mal oluyor. Özellikle, <b[1]>ilk satırda. Daha önce, "string" dediğimde, tam bir yalandı. pb'nin karakterleri yoktur, birbirine yakın olan karakterlere sahiptir. "İpin son karakterini" aramak sadece fırçayı bir karaktere değene kadar sola hareket ettirmek anlamına gelir. Hiçbir giriş sağlanmadığında, "en az 3 karakter varken" döngüsü tamamen atlanır ve son karakteri aramaya başlar. Bu olmadan <b[1]>sonsuza kadar bakmaya devam ederdi. Bu kod, özellikle giriş boş olduğunda bulunacak şekilde (-1, -1) değerinde 1 olan bir karakter koyar. İpin "son karakterini" bulduktan sonra, fırçanın birincisinin (0, -1) olduğunu ve doğrudan oraya gittiğini (1+0)/2, p'nin 0 olduğunu bulmak , 0

Ama monoray, bu hala basıyor! Meydan şartname söylüyor (empty input) => (empty output)! Boş bir karakter aldatması yazdırmıyor mu? Ayrıca, bu alakasız, ama sen akıllı ve yakışıklısın.

Teşekkürler, varsayımsal soru-asker. Daha önce, "yazdır" dediğimde, bu tam bir yalandı. Pb'de değerleri gerçekten yazdırmazsınız, sadece tuval üzerine yerleştirirsiniz. "Çıktının bir yolu" yerine, tuvali sonsuz büyük bir 2D dizisi olarak hayal etmek daha doğru olur. Her iki boyutta da negatif endekslere izin verir ve pb'de bir çok programlama, fırçanın tuval üzerinde istediğiniz yere gelmesini sağlamakla ilgilidir. Programın çalışması bittiğinde, tuval üzerinde negatif olmayan X ve Y koordinatlarına sahip herhangi bir şey konsolda uygun yere yazdırılır. Program başladığında, tuvalin tamamı 0 değerleriyle doldurulur. Her biri sonsuz sayıda boş bayt içeren sonsuz sayıda satır yazdırmak zorunda kalmamak için, Her çıktı satırı yalnızca sıfırdan farklı karaktere kadar yazdırılır ve satırlar yalnızca içinde sıfırdan farklı bir karakter olana kadar yazdırılır. Yani bir koyarak0 (0, 0) hala boş bir çıktı.

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

1

Cidden , 22 20 bayt

,O3 >WXXaXa3 >WXkæ≈c

Dilinizde harika olduğunuz için @Mego teşekkürler

Çevrimiçi deneyin ya da her neyse


1
Bu boş giriş için başarısız olur. Ayrıca, boş giriş için düzeltmeye çalıştığım 20 baytlık bir çözümüm var.
lirtosiast

,;``@(lIƒeğer len> 0 ise yığında giriş değeri bırakacak veya programı başka şekilde sonlandıracaktır. Sırt sırta basılamaz bir şey olduğuna dikkat edin - karakter 127.
Mego

@Mego Bu çalışmıyor gibi görünüyor.
faz

@phase Girdi için dizeleri alıntı yapmalısınız. Bu işe yarıyor.
Mego

@Mego Ne ƒyapmalı?
Faz

1

CoffeeScript, 104 103 bayt

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 bayt

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

42 bayt

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

43 bayt

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

Kullanımı:

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

1

Java 7, 152 bayt

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 ve test durumları:

Burada dene.

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

Çıktı:

3
l
q
(empty output)
x

1

PHP, 147 93 bayt

Krediler ve Jörg Hülsermann'a cevabım için teşekkür ediyorum 54 byte down!

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

Önceki versiyon:

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

Test kodu:

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

Çevrimiçi test

Bunun geliştirilebileceğini hissediyorum, ama bunun için yeterli zaman yok ...


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

@ JörgHülsermann Mükemmel golf! Kendi cevabınız olarak göndermelisiniz. Zamanım varsa güzel çözümlerinle cevabımı daha fazla golf oynayacağım. Teşekkürler.
Mario

Cevabınızla almaktan çekinmeyin
Jörg Hülsermann 28:16

1

Excel, 122 79 bayt

Aslında @Sophia Lechner'ın cevabı şimdi:

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

@Taylor Scott sayesinde ilk çözümden -5 bayt.

=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)),"")

Boş Dize için 12 bayt gerekli.


Bırakın Average(...,...)ve (...+...)/2-5 bayt kullanın . =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, MID için tamsayı olmayan ikinci bir argümanı kabul eder (ve kat eder), bu yüzden bunu davalara bölmek zorunda değilsiniz - =IFERROR(CHAR(CODE(MID(A1,LEN(A1)/2+1,1))/2+CODE(MID(A1,LEN(A1)/2+.5,1))/2),"")79 bayt için
Sophia Lechner
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.