Tìm trung tâm


24

Cho một chuỗi các ký tự ASCII, xuất ký tự ở giữa. Nếu không có ký tự giữa (khi chuỗi có độ dài chẵn), hãy xuất ký tự ASCII có thứ tự là trung bình nổi của hai ký tự trung tâm. Nếu chuỗi trống, một chuỗi trống sẽ được xuất ra.

Các trường hợp thử nghiệm:

12345 => 3

Hello => l

Hiya => q

(empty input) => (empty output)

Chương trình ngắn nhất trong các nhân vật chiến thắng. (Không phải byte.)

Bảng xếp hạng

Đoạn trích ở cuối bài này tạo ra bảng xếp hạng từ các câu trả lời a) dưới dạng danh sách các giải pháp ngắn nhất cho mỗi ngôn ngữ và b) dưới dạng bảng xếp hạng tổng thể.

Để đảm bảo rằng câu trả lời của bạn hiển thị, vui lòng bắt đầu câu trả lời của bạn bằng một tiêu đề, sử dụng mẫu Markdown sau:

## Language Name, N characters 

nơi Nlà kích thước của trình của bạn. Nếu bạn cải thiện điểm số của mình, bạn có thể giữ điểm số cũ trong tiêu đề, bằng cách đánh bại chúng thông qua. Ví dụ:

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

Nếu bạn muốn bao gồm nhiều số trong tiêu đề của mình (ví dụ: vì điểm của bạn là tổng của hai tệp hoặc bạn muốn liệt kê riêng các hình phạt cờ của thông dịch viên), hãy đảm bảo rằng điểm thực tế là số cuối cùng trong tiêu đề:

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

Bạn cũng có thể đặt tên ngôn ngữ thành liên kết sau đó sẽ hiển thị trong đoạn trích:

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


15
Thông thường chúng tôi ghi điểm bằng byte để mọi người không thể nén toàn bộ mã của mình, vì điều này dẫn đến các giải pháp nhàm chán. Bạn có chắc bạn muốn điều này?
Hạ cấp

1
@ Vɪʜᴀɴ Tôi không nghĩ rằng đó sẽ là một vấn đề ở đây, vì dù sao các giải pháp sẽ rất ngắn, vì vậy việc nén sẽ không đáng.
Ypnypn

9
Chào mừng đến với PPCG! Thử thách đầu tiên tuyệt vời!
Conor O'Brien

2
Chúng ta có thể viết các chức năng?
Hạ cấp

10
Pro-tip: mã hóa câu trả lời của bạn trong UTF-32. 4 byte cho mỗi ký tự. Hoặc có lẽ OP nên thoát khỏi việc ghi điểm nhân vật.
Mego

Câu trả lời:


9

Bình thường, 15 byte

Cs.O@R/lz2_BCMz

Trình diễn

Bắt đầu với "Hiya" làm đầu vào:

              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

Lưu ý rằng điều này gặp sự cố với lỗi đầu vào trống và không in gì cho STDOUT, đây là một cách hợp lệ để xuất chuỗi trống bằng mặc định mã-golf.


Bifurcate hiển thị tiện ích của nó một lần nữa.
lirtosiast

Whoa bifurcate là tuyệt vời.
Maltysen

@KenanRhoton Để đáp ứng với chỉnh sửa được đề xuất của bạn, hãy xem cam kết đã thêm Cchức năng sàn: github.com/isaacg1/pyth/commit/0baf23ec Lưu ý ngày được thêm vào, cùng ngày câu hỏi này được hỏi. Đó là bởi vì câu hỏi này đã truyền cảm hứng cho tôi để thêm chức năng đó, khiến nó không đủ điều kiện để sử dụng cho câu hỏi này.
isaacg

8

Brainf ***, 61 byte

Tiếng trung , 16 ký tự

Điều này đòi hỏi đầu vào nằm trong phạm vi ASCII 1-127 và bị chấm dứt null. Nó xóa các cặp ký tự từ đầu và cuối chuỗi cho đến khi còn một hoặc hai ký tự. Nếu có hai, nó cộng chúng lại với nhau, sau đó chia cho 2, làm tròn xuống. Các ký tự còn lại được in.

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

Hãy thử nó trên thông dịch viên này .

Mổ xẻ

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

* Với mỗi lệnh có thể được nén thành 3 bit và được mã hóa bằng UTF-32, toàn bộ chương trình có thể được thể hiện bằng 6 ký tự.

EDIT: Và cảm ơn Jan Dvorak đã giới thiệu tôi với tiếng Trung , đã nén nó thành 16 ký tự, ngang với câu trả lời của Dennis ' CJam .

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

5
Given each instruction could be compressed to 3 bits and encoded in UTF64, the whole program could technically be expressed in 3 characters.Bạn thắng. Internet. Và mọi thứ khác.
con mèo

1
Tôi không nghĩ rằng điều này là hợp lệ. Mã nguồn Brainfuck là các ký tự +-<>,.[] , trong bất kỳ mã hóa nào, không phải là biểu diễn nhị phân của chúng. Chúng tôi có một sự đồng thuận rằng một mã hóa mà trình thông dịch hiện tại không thể sử dụng là không hợp lệ.
lirtosiast

2
@ThomasKwa, do đó tôi đã cho điểm của mình chủ yếu bằng các byte không được mã hóa. Việc mã hóa ký tự chỉ là tham gia vào ý tưởng rằng việc ghi điểm theo các ký tự có thể bị lạm dụng.
Thực phẩm điện tử

4
@ThomasKwa: đã đến lúc một số người trong chúng ta tạo ra một thông dịch viên như vậy, sẽ được sử dụng trong các thử thách trong tương lai. Hãy tưởng tượng BF đánh bại giải pháp chơi golf tốt nhất! :)
vsz


6

CJam, 16 byte

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

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

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
Tại sao hầu như bất kỳ golf CJam / Pyth là 10-30 chars bất kể khó khăn? Oo
Zereges

1
Khó khăn? Đây là một phép tính trung bình đơn giản, trừ đi việc sắp xếp ...
Dennis

4
@Dennis Tôi nghĩ đó là những gì anh ấy muốn nói. Nó có thể có cùng độ dài cho cả câu hỏi dễ hơn và khó hơn.
geokavel

@Zereges Không thực sự. 10-30 là điển hình cho các vấn đề dễ dàng. Xem điều này nếu bạn muốn có một ví dụ về cách nó tìm kiếm thứ gì đó phức tạp hơn: 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)

Sử dụng ý tưởng của @ isaacg để đảo ngược chuỗi.

Dùng thử trực tuyến

Kiểm tra tất cả các trường hợp

Ungolfed && Giải thích

TeaScript vẫn là JavaScript nên nó cũng hoạt động giống như 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

5
Đó là người
sành điệu

10
Tiêu đề đó là rad. Tôi muốn tiêu đề đó cho mọi ngôn ngữ chết tiệt.
con mèo

Vâng, ngoại trừ những người sành điệu.
con mèo

@sysreq lol, nó đã được thực hiện với thực tế là tôi đang sử dụng một phông chữ khác nhau, đã được sửa.
Hạ cấp


5

Matlab, 39 37 byte

floor((end+[1,2])/2) trả về hai chỉ số ở giữa của chuỗi nếu độ dài là chẵn và trả về chỉ số giữa hai lần nếu độ dài là số lẻ.

meanchỉ trả về giá trị trung bình của các giá trị đó và chartự động tạo tầng cho nó.

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

5

Mã máy 8086 + 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

Mã nguồn hội (có thể được lắp ráp bằng 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

Có một số cách sử dụng tinh tế của đăng ký FLAGS ở đây. Sau khi nó dịch chuyển độ dài của chuỗi đúng 1 bit (tương đương với chia cho 2), hai cờ lưu trữ thông tin bổ sung:

  • Cờ mang: chứa bit đã được chuyển ra. Nếu bit là 1, độ dài là số lẻ.
  • Cờ không: hiển thị cho dù kết quả bằng không. Nếu cờ mang là 0 và cờ 0 là 1, độ dài bằng 0 và không được in gì.

Thông thường, các cờ nên được kiểm tra ngay lập tức, nhưng ở đây tôi sử dụng thực tế là movlệnh không thay đổi cờ. Vì vậy, họ có thể được kiểm tra sau khi tải char giữa.


4

Python 3, 61 59 57 55 byte

Tôi cố gắng không chơi golf với các ngôn ngữ mà tôi làm việc, nhưng điều này không quá tệ.

Cảm ơn @xsot cho 2 byte!

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

Chương trình đầy đủ là 59 byte:

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

Hãy thử nó ở đây .


À, bạn đã đánh bại tôi với nhiệm vụ tiếp theo của tôi sẽ là gì (tôi đã không tìm thấy 10 byte để cạo râu)
con mèo

Không, không, 10 byte để loại bỏ giải pháp Go 166 byte của tôi . Của bạn là thanh lịch hơn, tuy nhiên.
mèo

@sysreq À, mình hiểu nhầm rồi. Và cảm ơn.
lirtosiast

-1-len(x)//2tương đương với ~len(x)//2cách phân chia sàn hoạt động trên các số nguyên âm.
xsot

@xsot Cảm ơn, nó làm cho mã trở nên xấu hơn một chút :)
lirtosiast

4

Prolog, 111 byte

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

Giải thích

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

Ví dụ

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

Hãy thử trực tuyến!

Rất cám ơn @ngm đã đưa ra ý tưởng không đệ quy này - được phép chơi golf 20 byte.

Giải pháp cũ:

R , 101 95 byte

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

Hãy thử trực tuyến!

Giải pháp đệ quy. Đã sửa một vấn đề ở mức giá 2 byte:

  • được thêm vào try(expr, silent = TRUE)để quản lý đúng trường hợp đầu vào trống.

cảm ơn Giusppe vì 4 byte!


không intToUtf8cắt bớt số nguyên?
Giuseppe

@Giuseppe bạn đúng như mọi khi :)
JayCe

92 byte giải pháp không đệ quy.
ngm

82 byte Tôi muốn bạn gửi nó dưới dạng một câu trả lời riêng biệt - nó hoàn toàn khác với câu trả lời của tôi!
JayCe

Chà, tôi sẽ không nghĩ ra nó trừ khi bạn đặt nỗ lực ban đầu vào. Và câu trả lời của tôi là một cổng của câu trả lời Pyth nhận được bình chọn hàng đầu. Với một loạt các mánh khóe chúng tôi R người đã đưa ra. Và sau đó bạn làm cho nó ngắn hơn. Vì vậy, đi trước và thực hiện chỉnh sửa với một lương tâm rõ ràng!
ngm

4

Husk , 11 byte

c½S¤+öc→←½↔

Hãy thử trực tuyến!

Giải trình

Ngon, ngon kết hợp tất cả các cách xuống. ölà "soạn bốn hàm này", ¤là "áp dụng đối số thứ nhất cho kết quả áp dụng đối số thứ hai cho hai đối số bổ sung", Slà "áp dụng hàm này (cần lấy hai đối số) cho Sđối số thứ ba và cho kết quả áp dụng Sđối số thứ hai cho đối số thứ ba của nó ". Vì thế,

   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

Đã chỉnh sửa để thêm: Nói đúng ra, điều này hơi thất bại khi tuân thủ đặc tả vấn đề, yêu cầu một chuỗi trong trường hợp đầu vào trống và ký tự trong các trường hợp khác.

Do kiểu gõ nghiêm ngặt của Husk, không thể xác định hàm / chương trình có thể trả về một trong hai loại. Tôi đã chọn trả về một ký tự trong mọi trường hợp và đối với Husk, lựa chọn hợp lý nhất cho một ký tự đại diện cho chuỗi trống là '(space)'vì đó là giá trị "mặc định" (và thực tế, đó là lý do tại sao chương trình này trả về nó; giá trị được sử dụng khi lấy mục ( ) cuối cùng của danh sách trống).

Tôi cũng có thể đã chọn một cách hợp lý để trả về các chuỗi 0 hoặc một ký tự, điều này sẽ không thành công đặc tả theo hướng khác, nhưng tôi đã không làm thế bởi vì nó thêm bốn byte : Ṡ&ö;c½S¤+öc→←½↔, với; chuyển đổi ký tự thành chuỗi một ký tự, một ký tự khác öđể soạn thảo một cách rõ ràng sự cần thiết và một Ṡ&phím tắt trong trường hợp đầu vào giả.


3

C ++ 14, 56 byte

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

Lambda ẩn danh lấy chuỗi làm đối số và trả về int dưới dạng mã char. Dành cho"" , nó trở lại 0. Không chắc chắn chính xác đầu vào và đầu ra trông như thế nào (không được chỉ định trong câu hỏi).

Ungolfed, với cách sử dụng

#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ʀɪᴇɴ đã xong.
Zereges

Tôi không nghĩ bạn có thể xuất ra với mã ký tự và tôi cũng không nghĩ bạn có thể xuất 0cho "".
lirtosiast

Nó sẽ là tốt đẹp để có quy tắc rõ ràng.
Zereges


3

JavaScript (ES6), 83 byte 89 91

Đã lưu 2 byte nhờ @ Cᴏɴᴏʀ O'Bʀɪᴇɴ

Đã lưu 6 byte nhờ @ETHproductions

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

JavaScript không quá tốt ở tất cả các mã char chuỗi này.


Bạn đánh bại tôi vào nó. Ồ, ít nhất tôi có thể làm là giúp bạn;) s=>String.fromCharCode((s[~~(t=s.length/2-.5)][r="charCodeAt"]()+s[Math.ceil(t)][r])/2)ngắn hơn 5 byte.
Conor O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴ Ngọt ngào. Tôi cần ()xung quanh charCodeAtđể nó thực sự là 3 ký tự, nhưng dù sao cũng cảm ơn!
Hạ cấp

@ Nɟuɐɯɹɐ oɯ nếu tlà một số nguyên không hoạt động
Downgoat

Math.ceil(t)có thể được thay đổi thành0|t+.9
ETHproductions

@ETHproductions cảm ơn, Điều đó đã lưu 6 byte!
Hạ cấp


2

Chồn 0,13 , 23 20 byte

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

Hãy thử nó ở đây.

Giải trình

$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
hiyatrả về ithay vìq
Downgoat

@ Vɪʜᴀɴ: OH. Tôi đọc sai nó. Tôi nghĩ rằng câu hỏi là yêu cầu nhân vật ở giữa, đi đến vị trí trung bình nổi nếu chiều dài là chẵn.
El'endia Starman

@ThomasKwa: Đã sửa.
El'endia Starman

@ Vɪʜᴀɴ: ^ Đã sửa.
El'endia Starman

2

Japt , 40 29 23 21 20 byte

Đã lưu 4 byte nhờ @ ן nɟuɐɯɹɐ oɯ

Bây giờ chỉ còn một nửa chiều dài ban đầu! Tôi yêu mã golf. : -D

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

Hoạt động đúng trên chuỗi trống. Hãy thử trực tuyến!

Làm thế nào nó hoạt động

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

Như bạn có thể thấy, nó sử dụng rất nhiều sàn tự động. (Cảm ơn, JavaScript!) Đề xuất chào mừng!


Điều ngược lại là tuyệt vời +1
Downgoat

Bạn không thể làm gì V=Ul /2;((UcV +Uw cV )/2 d?
Mama Fun Roll

@ Nɟuɐɯɹɐ ן oɯ Chà, duh: P Tôi đã sử dụng crất nhiều lần mà không tranh luận rằng tôi quên nó đã chấp nhận nó. Cảm ơn!
Sản xuất ETH

2

Đi, 166 156 153 byte

Đi có thể không phải là ngôn ngữ tốt nhất để chơi gôn ... nhưng tôi yêu nó, rất nhiều, và tôi đang học nó, ở đó.

Việc triển khai này chấp nhận \nđầu vào trống ( ) và có thể sẽ bị hỏng với đầu vào không mở rộng ASCII / ASCII. Tuy nhiên, OP không chỉ định mã hóa đầu vào / đầu ra, do đó ASCII là tất cả những gì tôi đã hỗ trợ rõ ràng.

Chỉnh sửa : Hóa ra if/ else ngắn hơn switch. Bây giờ tôi biết, tôi cho rằng.

Chơi gôn

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

Ung dung:

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

Nó không thực sự trả về một chuỗi và bạn sẽ nhận được một ký tự khoảng trắng nếu chuỗi đầu vào trống vì hàm phải luôn trả về một giá trị. Cần thêm 2 byte để trả về một chuỗi.

Chương trình đầy đủ với các trường hợp thử nghiệm:

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

Ngoài ra, một chương trình đầy đủ đọc đầu vào của người dùng và in trung tâm của chuỗi đã nhập:

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

Một lần nữa, nó sử dụng cùng một thủ thuật in một ký tự khoảng trắng mà người dùng sẽ không nhận thấy và không phải là một chuỗi trống, nếu không thì giải pháp dài hơn 2 byte.


2

Vim, 38 24 23 tổ hợp phím

Vì vim có chức năng tích hợp để tìm dòng giữa nhưng không phải là char giữa , chúng tôi chia từng ký tự trên một dòng riêng trước bằng cách sử dụng substitute, tìm dòng giữa, sau đó xóa mọi thứ sau và trước nó.

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

Nếu bạn muốn chạy cái này, hãy cẩn thận với .vimrccác tệp có thể thay đổi hành vi của .(regex ma thuật) vàg (gdefault). Lưu ý rằng nó thực sự giúp tôi tiết kiệm 3 lần nhấn phím trên máy của mình :)

Câu trả lời trước

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

Lấy bộ đệm một dòng làm đầu vào, cập nhật bộ đệm hiện tại với ký tự giữa. Tôi nghĩ rằng sẽ có một lối tắt cho điều này trong vim!

Lưu ý: một giải pháp có khả năng ngắn hơn dường như gây ra một vòng lặp vô hạn ... Nếu ai đó có ý tưởng: qq^x$x@qq@qp(12 tổ hợp phím) - nó hoạt động với<c-c> sau @q...


1

Toán học, 118 99 ký tự

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

Thao tác mã ký tự Mma rất tốn kém ...


Hàm này chỉ hoạt động một lần, trừ khi bạn lặp lại toàn bộ mã mỗi lần bạn muốn gọi nó. Điểm của đệ trình chức năng là để chúng có thể tái sử dụng . Gọi hàm của bạn phá vỡ giá trị của toàn cầu %mà nó dựa vào.
Martin Ender

1
Tại sao không sử dụng các hình thức rút ngắn của Sàn và Trần?
DavidC

1

VBA, 130 byte

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

Tìm các nhân vật trung 2.
Nếu số lượng Nhân vật là Số lẻ thì lấy Quyền của Trung 2 sẽ là số trung thực khi chúng ta làm tròn xuống.
Nếu không tính tổng các asc()giá trị ASCII của 2 Ký tự chia cho 2 và trả về Ký tự ASCIIchr() dựa trên giá trị đó.

Tôi nghĩ rằng tôi có thể chơi golf một trong những asc() cuộc gọi, nhưng không thể khiến nó hoạt động ngắn hơn.



1

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

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

Giải pháp cũ (Không hoạt động cho đầu vào trống):

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

Cả hai đều đưa đầu vào vào ngăn xếp thông qua -s . Cả hai đều là 24 byte.

Hãy thử trực tuyến tại đây.


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]

Mặc dù có ít nhất 3 ký tự trong chuỗi đầu vào, đầu tiên và cuối cùng được loại bỏ. Điều này để lại 1 ký tự (nên được in không thay đổi) hoặc 2 (nên được tính trung bình và in). Để xử lý điều này, các ký tự đầu tiên và cuối cùng của chuỗi được thêm vào với nhau và chia cho hai. Nếu chỉ có một nhân vật,(a+a)/2==a . Nếu có hai,(a+b)/2 là ký tự cần được in. pb "mượn" đánh giá biểu thức của Python (def expression(e): return eval(e, globals()) ) để nó tự động được thả nổi.

Xử lý đầu vào trống chi phí cho tôi 5 byte. Cụ thể, <b[1]>trên dòng đầu tiên. Trước đó, khi tôi nói "chuỗi", đó là một lời nói dối hoàn toàn. pb không có chuỗi, nó có các ký tự gần nhau. Tìm kiếm "ký tự cuối cùng của chuỗi" chỉ có nghĩa là di chuyển bàn chải sang trái cho đến khi nó chạm vào một ký tự. Khi không có đầu vào nào được cung cấp, vòng lặp "trong khi có ít nhất 3 ký tự" sẽ bị bỏ qua hoàn toàn và nó bắt đầu tìm kiếm ký tự cuối cùng. Không có điều đó <b[1]>, nó sẽ tiếp tục tìm kiếm mãi mãi. Mã đó đặt một ký tự có giá trị 1 tại (-1, -1) cụ thể được tìm thấy khi đầu vào trống. Sau khi tìm thấy "ký tự cuối cùng" của chuỗi, cọ vẽ giả sử ký tự đầu tiên ở (0, -1) và đến đó trực tiếp, tìm giá trị 0. (1+0)/2là 0 trong pb,

Nhưng monorail, đó vẫn là in! Các đặc điểm kỹ thuật thách thức nói (empty input) => (empty output)! Không phải là in một ký tự null gian lận? Ngoài ra, điều này không liên quan, nhưng bạn thông minh và đẹp trai.

Cảm ơn, người đặt câu hỏi giả thuyết. Trước đó, khi tôi nói "in", đó là một lời nói dối hoàn toàn. Trong pb, bạn không thực sự in các giá trị, bạn chỉ cần đặt chúng trên khung vẽ. Thay vì "một cách để xuất", sẽ chính xác hơn khi tưởng tượng khung vẽ là một mảng 2D lớn vô hạn. Nó cho phép các chỉ số tiêu cực ở một trong hai chiều, và rất nhiều lập trình trong pb thực sự là về việc đảm bảo cọ vẽ đến vị trí trên khung vẽ mà bạn muốn. Khi chương trình kết thúc thực thi, mọi thứ trên khung vẽ có tọa độ X và Y không âm được in đến vị trí thích hợp trên bàn điều khiển. Khi chương trình bắt đầu, toàn bộ khung được chứa đầy các giá trị bằng 0. Để không phải in một số lượng dòng vô hạn, mỗi dòng có vô số byte rỗng, mỗi dòng đầu ra chỉ được in tối đa ký tự khác không và các dòng chỉ được in đến ký tự cuối cùng có ký tự khác không trong đó. Vì vậy, đặt một0 tại (0, 0) vẫn là một đầu ra trống.

Ung dung:

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

Nghiêm túc , 22 20 byte

,O3 >WXXaXa3 >WXkæ≈c

Cảm ơn @Mego vì đã giỏi ngôn ngữ của bạn

Hãy thử trực tuyến hoặc bất cứ điều gì


1
Điều này không thành công cho đầu vào trống. Tôi có một giải pháp 20 byte đã bị xóa mà tôi cũng đang cố gắng khắc phục cho đầu vào trống.
lirtosiast

,;``@(lIƒsẽ để lại cho bạn giá trị đầu vào trên ngăn xếp nếu giá trị lennày> 0 hoặc chấm dứt chương trình nếu không. Lưu ý rằng có một dấu vết không thể in được trong backticks - ký tự 127.
Mego

@Mego Điều này dường như không hoạt động.
giai đoạn

@phase Bạn phải trích dẫn chuỗi cho đầu vào. Điều này hoạt động.
Mego

@Mego Phải ƒlàm gì?
giai đoạn

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

Sử dụng:

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

Các trường hợp bất ngờ & thử nghiệm:

Hãy thử nó ở đây.

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

Đầu ra:

3
l
q
(empty output)
x

1

PHP, 147 93 byte

Tín dụng và cảm ơn đặc biệt đến Jörg Hülsermann vì đã đánh golf câu trả lời của tôi xuống 54 byte!

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

Phiên bản trước:

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

Mã kiểm tra:

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

Kiểm tra trực tuyến

Tôi có cảm giác rằng điều này có thể được cải thiện, nhưng không đủ thời gian cho nó ...


<?=($l=strlen($s=$argv[1]))%2?$s[($l-1)/2]:chr(floor((ord($s[$l/2])+ord($s[$l/2-1]))/2));là đề xuất của tôi
Jörg Hülsermann

@ JörgHülsermann Chơi golf tuyệt vời! Bạn nên đăng nó như câu trả lời của riêng bạn. Nếu tôi có thời gian tôi sẽ đánh golf câu trả lời của tôi nhiều hơn với các giải pháp tốt đẹp của bạn. Cảm ơn.
Mario

Hãy xem nó như câu trả lời của bạn
Jörg Hülsermann

1

Excel, 122 79 byte

Thật ra @Sophia Lechner trả lời ngay:

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

-5 byte từ giải pháp ban đầu nhờ @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 byte cần thiết cho Chuỗi rỗng.


Thả Average(...,...)và sử dụng (...+...)/2cho -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 sẽ chấp nhận (và sàn) một đối số thứ hai không nguyên cho MID, vì vậy bạn không phải chia nó thành các trường hợp - =IFERROR(CHAR(CODE(MID(A1,LEN(A1)/2+1,1))/2+CODE(MID(A1,LEN(A1)/2+.5,1))/2),"")cho 79 byte
Sophia Lechner
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.