센터 찾기


24

ASCII 문자 문자열이 있으면 가운데에있는 문자를 출력하십시오. 중간 문자가없는 경우 (문자열 길이가 짝수 인 경우) 서 수가 두 중심 문자의 바닥 평균 인 ASCII 문자를 출력하십시오. 문자열이 비어 있으면 빈 문자열이 출력되어야합니다.

테스트 사례 :

12345 => 3

Hello => l

Hiya => q

(empty input) => (empty output)

문자가 가장 짧은 프로그램이 승리합니다. (바이트가 아님)

리더 보드

이 게시물의 하단에있는 스택 스 니펫은 답변 a) 언어별로 가장 짧은 솔루션 목록으로, b) 전체 리더 보드로 답변에서 리더 보드를 생성합니다.

답변이 표시되도록하려면 다음 마크 다운 템플릿을 사용하여 헤드 라인으로 답변을 시작하십시오.

## Language Name, N characters 

N제출물의 크기는 어디에 있습니까 ? 당신이 당신의 점수를 향상시킬 경우에, 당신은 할 수 있습니다 를 통해 눈에 띄는에 의해, 헤드 라인에 오래된 점수를 유지한다. 예를 들어 :

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

헤더에 여러 숫자를 포함하려는 경우 (예 : 점수가 두 파일의 합계이거나 인터프리터 플래그 페널티를 별도로 나열하려는 경우) 실제 점수가 헤더 의 마지막 숫자 인지 확인하십시오 .

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

언어 이름을 링크로 만들면 스 니펫에 표시됩니다.

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


15
일반적으로 우리는 바이트 단위로 점수를 매기므로 사람들은 전체 코드를 압축 할 수 없으므로 지루한 솔루션이됩니다. 이것을 정말로 확신합니까?
Downgoat

1
@ Vɪʜᴀɴ 솔루션이 너무 짧아 압축이 가치가 없기 때문에 여기서 문제가 될 것이라고 생각하지 않습니다.
Ypnypn

9
PPCG에 오신 것을 환영합니다! 위대한 첫 도전!
Conor O'Brien

2
함수를 작성할 수 있습니까?
Downgoat

10
전문가 팁 : 답변을 UTF-32로 인코딩하십시오. 문자 당 4 바이트 또는 OP가 문자 점수를 제거해야 할 수도 있습니다.
Mego

답변:


9

Pyth, 15 바이트

Cs.O@R/lz2_BCMz

데모

"Hiya"를 입력으로 시작 :

              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

이것은 빈 입력시 오류와 함께 충돌하고 STDOUT에 아무것도 인쇄하지 않습니다. 이는 코드 골프 기본값으로 빈 문자열을 출력하는 유효한 방법입니다.


Bifurcate는 유틸리티를 다시 보여줍니다.
lirtosiast

우와 분기는 굉장합니다.
Maltysen

당신의 제안 편집에 @KenanRhoton에서 응답은 그 추가 된 커밋 체크 아웃 C바닥 기능 : github.com/isaacg1/pyth/commit/0baf23ec 주의가이 추가 된 일이, 같은 날은이 질문에 질문을 받았다. 이 질문이 해당 기능을 추가하여이 질문에 사용할 수 없게 만들었 기 때문입니다.
isaacg

8

Brainf ***, 61 바이트

중국어 , 16 자

이를 위해서는 입력 범위가 1-127의 ASCII 범위에 있어야하며 널 종료됩니다. 하나 또는 두 개의 문자가 남을 때까지 문자열의 시작과 끝에서 문자 쌍을 삭제합니다. 두 개가 있으면 함께 더한 다음 2로 나눕니다. 나머지 문자가 인쇄됩니다.

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

이 통역사 에서 사용해보십시오 .

해부:

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

* 각 명령어를 3 비트로 압축하고 UTF-32로 인코딩 할 수 있으면 전체 프로그램을 기술적으로 6 자로 표현할 수 있습니다.

편집 : Jan Dvorak 에게 중국어 를 소개해 주셔서 감사합니다. 이 문자를 Dennis의 CJam 답변 과 동등한 16 자로 압축합니다 .

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

5
Given each instruction could be compressed to 3 bits and encoded in UTF64, the whole program could technically be expressed in 3 characters.네가 이겼다. 인터넷. 그리고 다른 모든 것.
고양이

1
나는 이것이 유효하다고 생각하지 않습니다. Brainfuck 소스 코드는 이진 표현이 아닌 모든 인코딩 의 문자 +-<>,.[] 입니다. 우리는이 합의 기존 인터프리터에 의해 사용할 수 없습니다 인코딩이 잘못되었다고합니다.
lirtosiast

2
@ ThomasKwa, 따라서 나는 주로 인코딩되지 않은 바이트로 점수를 주었다. 캐릭터 인코딩은 캐릭터의 점수를 남용 할 수 있다는 생각에 합류했습니다.
Hand-E-Food 5

4
@ThomasKwa : 우리 중 일부는 미래의 도전에 사용될 그러한 통역사를 만들어야 할 때입니다. 최고의 골프 ​​스크립트 솔루션을이기는 BF를 상상해보십시오! :)
vsz


6

CJam, 16 바이트

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

온라인으로 사용해보십시오!

작동 원리

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
어려움에 상관없이 CJam / Pyth 골프가 10-30 자 정도 인 이유는 무엇입니까? Oo
Zereges

1
어려움? 이것은 정렬을 뺀 간단한 중앙값 계산입니다.
Dennis

4
@Dennis 그가 생각하는 바라고 생각합니다. 더 쉽고 어려운 질문에 대해 길이는 거의 같습니다.
geokavel

@ 제 레지스 쉬운 문제의 경우 10-30이 일반적입니다. codegolf.stackexchange.com/a/64086/32852 보다 복잡한 것을 찾는 방법에 대한 예를 원하면 이것을 참조하십시오 .
레토 코라디

6

티 스크립트 , 23 바이트 25 30 31 33

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

@isaacg의 문자열을 뒤집는 아이디어를 사용합니다.

온라인으로 사용해보십시오

모든 경우를 테스트

Ungolfed && 설명

TeaScript는 여전히 JavaScript이므로 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
그 커닝 ...
lirtosiast

10
그 헤더는 rad입니다. 나는 모든 언어에 대한 헤더를 원합니다.
고양이

응, 커닝 빼고
고양이

@sysreq lol, 다른 글꼴을 사용하고 있다는 사실과 관련이 있습니다.
Downgoat

12
작동 합니다.

5

Matlab, 39 37 바이트

floor((end+[1,2])/2) 길이가 짝수이면 문자열의 가운데 두 인덱스를 반환하고 길이가 홀수이면 가운데 인덱스를 두 번 반환합니다.

mean그 값의 평균을 반환하고 char자동으로 그 값을 계산 합니다.

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

5

8086 머신 코드 + DOS, 31 바이트

16 진 덤프 :

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

어셈블리 소스 코드 (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

FLAGS 레지스터의 섬세한 사용법이 여기에 있습니다. 문자열 길이를 1 비트만큼 오른쪽으로 이동 한 후 (2로 나누는 것과 동일) 두 플래그는 추가 정보를 저장합니다.

  • 캐리 플래그 : 시프트 된 비트를 포함합니다. 비트가 1이면 길이가 홀수입니다.
  • 제로 플래그 : 결과가 0인지 여부를 나타냅니다. carry 플래그가 0이고 zero 플래그가 1 인 경우, 길이는 0이므로 아무 것도 인쇄하지 않아야합니다.

일반적으로 플래그는 즉시 확인해야하지만 여기서는 mov명령이 플래그를 변경하지 않는다는 사실을 사용합니다 . 중간 문자를로드 한 후 검사 할 수 있습니다.


4

파이썬 3, 61 59 57 55 바이트

나는 내가 일하는 언어로 골프를 치려고하지 않지만 그렇게 악하지는 않다.

2 바이트의 @xsot에 감사합니다!

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

전체 프로그램은 59 바이트입니다.

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

여기에서 시도 하십시오 .


아, 당신이 내 옆에있는 작업이 될 무슨 일이 있었는지에 날 이길 (나는 면도 10 바이트를 찾을 수 있었다)
고양이

아니요, 아니요, 10 바이트는 166 바이트 Go 솔루션을 제거합니다. 그러나 당신은 훨씬 더 우아합니다.
고양이

@ sysreq 아, 나는 오해했다. 그리고 감사합니다.
lirtosiast

-1-len(x)//2~len(x)//2바닥 나누기가 음의 정수에서 작동하는 방식 과 같습니다 .
xsot

@xsot Thanks— 코드를 좀 더 악하게 만든다 :)
lirtosiast

4

프롤로그, 111 바이트

암호

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

설명

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

>p('Hello').
l

>p('Hiya').
q

4

R , 73 바이트

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

온라인으로 사용해보십시오!

이 비재 귀적 아이디어를 생각해 낸 @ngm에게 많은 감사-20 바이트 골프를 허용했다.

오래된 해결책 :

R , 101 95 바이트

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

온라인으로 사용해보십시오!

재귀 솔루션. 2 바이트 가격으로 한 가지 문제를 수정했습니다.

  • try(expr, silent = TRUE)입력이 비어있는 경우를 올바르게 관리하기 위해 추가되었습니다 .

4 바이트 주셔서 감사합니다 Giusppe!


하지 않는 intToUtf8비 정수를 잘라?
주세페

@Giuseppe 당신은 항상
그렇습니다

비 재귀 솔루션 92 바이트
ngm

82 바이트 나는 당신이 그것을 별도의 답변으로 게시하고 싶습니다-그것은 내 답변과 완전히 다릅니다!
JayCe

글쎄, 나는 당신이 원래의 노력을 기울이지 않았다면 그것을 내놓지 않았을 것입니다. 그리고 내 대답은 최고의 투표를받는 Pyth 답변의 항구였습니다. 많은 트릭으로 우리 R 사람들이 등장했습니다. 그리고 당신은 그것을 더 짧게 만들었습니다. 그러니 분명한 양심으로 편집하십시오!
ngm

4

껍질 , 11 바이트

c½S¤+öc→←½↔

온라인으로 사용해보십시오!

설명

맛있고 맛있는 조합기. ö"이 4 개의 함수 구성", ¤"두 개의 추가 인수를 두 개의 추가 인수에 개별적으로 적용한 결과에 첫 번째 인수 적용", S"이 함수 (두 개의 인수를 가져야 함)를 S세 번째 인수 및 결과에 적용" S"두 번째 인수를 세 번째 에 적용 " 따라서,

   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

추가 편집 : 엄격히 말하면, 이것은 빈 문제의 경우 문자열을 요구하고 다른 경우에는 문자를 요구하는 문제 사양에 약간 부합하지 않습니다.

Husk의 엄격한 타이핑으로 인해 두 가지 유형 중 하나를 반환 할 수있는 함수 / 프로그램을 정의 할 수 없습니다. 나는 모든 경우에 단일 문자를 반환하기로 선택했고 Husk의 경우 단일 문자열이 빈 문자열을 나타내는 가장 합리적인 선택 '(space)'은 "기본"값이기 때문입니다 (실제로이 프로그램이이를 반환하는 이유입니다. 기본값). 값은 빈 목록 의 마지막 ( ) 항목을 가져올 때 사용됩니다 ).

또한 다른 방향으로 사양에 실패하는 0 또는 1 문자의 문자열을 반환하도록 합리적으로 선택할 수 있었지만 4 바이트를 추가했기 때문에하지 않았습니다. Ṡ&ö;c½S¤+öc→←½↔, ;문자를 한 문자 문자열로 변환하고 다른 문자는 ö필요한 입력을 명시 적으로 작성하고 Ṡ&잘못된 입력의 경우 바로 가기를 사용합니다.


3

C ++ 14, 56 바이트

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

익명 람다는 문자열을 인수로 사용하고 int를 char 코드로 반환합니다. 의 경우을 ""반환합니다 0. 입력 및 출력이 정확히 어떻게 표시되는지 확실하지 않습니다 (문제에 지정되지 않음).

사용법이없는 언 골프

#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ʀɪᴇɴ 완료.
Zereges

나는 당신이 문자 코드로 출력 할 수 있다고 생각하지 않으며, 0""에 대해서도 출력 할 수 있다고 생각하지 않습니다 .
lirtosiast

명백한 규칙을 갖는 것이 좋을 것입니다.
Zereges


3

자바 스크립트 (ES6), 83 바이트 89 91

@ Cᴏɴᴏʀ O'Bʀɪᴇɴ 덕분에 2 바이트 절약

@ETHproductions 덕분에 6 바이트 절약

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

자바 스크립트는이 문자열 문자 코드에서 전혀 좋지 않습니다.


넌 날 이겼어 글쎄, 내가 할 수있는 최소한은 당신을 돕는 것입니다;) s=>String.fromCharCode((s[~~(t=s.length/2-.5)][r="charCodeAt"]()+s[Math.ceil(t)][r])/2)5 바이트 더 짧습니다.
코너 O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴ Sweet. ()주위 가 필요 charCodeAt하므로 실제로 3 자이지만 어쨌든 감사합니다!
Downgoat

@ ן nɟuɐɯɹɐ ן oɯ if t작동하지 않는 정수
Downgoat

Math.ceil(t)다음으로 변경 될 수 있습니다0|t+.9
ETHproductions

@ETHproductions 감사합니다. 6 바이트를 절약했습니다!
Downgoat


2

Minkolang 0.13 , 23 20 바이트

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

여기에서 시도하십시오.

설명

$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
hiyai대신에 반환q
Downgoat

@ Vɪʜᴀɴ : OH. 나는 그것을 잘못 읽었다. 나는 길이가 고르면 바닥의 평균 위치로 이동하면서 중간에 캐릭터를 묻는 질문이라고 생각했습니다 .
El'endia Starman

@ThomasKwa : 수정되었습니다.
El'endia Starman

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

2

Japt , 40 29 23 21 20 바이트

@ ן nɟuɐɯɹɐ ן oɯ 덕분에 4 바이트를 절약했습니다

이제 원래 길이의 절반 밖에되지 않습니다! 저는 코드 골프를 좋아합니다. :-디

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

빈 문자열에서 올바르게 작동합니다. 온라인으로 사용해보십시오!

작동 원리

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

보시다시피, 많은 자동 플로어링을 사용합니다. (감사합니다, JavaScript!) 제안을 환영합니다!


그 반대는 훌륭하다 +1
Downgoat

당신은 그냥 할 수 V=Ul /2;((UcV +Uw cV )/2 d없습니까?
Mama Fun Roll 1

@ ן nɟuɐɯɹɐ ן oɯ 글쎄, duh : P 나는 c그것을 받아들이는 것을 잊었다는 주장없이 여러 번 사용 했다. 감사!
ETHproductions

2

이동, 166 (156) 153 바이트

바둑은 골프를하기에 가장 적합한 언어는 아니지만 ... 너무 좋아서 배우고 있습니다.

이 구현은 공백 ( \n) 입력을 허용 하며 아마도 비 ASCII / ASCII 확장 입력으로 중단 될 수 있습니다. 그러나 OP는 입력 / 출력 인코딩을 지정하지 않았으므로 ASCII가 모두 명시 적으로 지원되었습니다.

편집 : 밝혀 if/ else 입니다 보다 짧은switch . 이제는 알고 있습니다.

골프 :

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

언 골프 드 :

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 바이트

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

실제로 문자열을 반환하지 않으며 함수가 항상 값을 반환해야하므로 입력 문자열이 비어 있으면 공백 문자가 표시됩니다. 문자열을 반환하려면 2 바이트가 더 필요합니다.

테스트 케이스가 포함 된 전체 프로그램 :

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

또는 사용자 입력을 읽고 입력 된 문자열의 중심을 인쇄하는 전체 프로그램 :

C #, 144 바이트

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

다시 말하지만, 공백 문자를 인쇄하는 것과 동일한 트릭을 사용합니다. 빈 문자열이 아니라면 솔루션이 2 바이트 더 깁니다.


2

Vim, 38 24 23 키 스트로크

정력은 중앙 찾는 기능이 내장되어 있기 때문에 라인 이 아닌 중간 문자를 , 우리는 먼저 사용하여 별도의 줄에 모든 문자를 분할 substitute중간 라인, 후 그리고 그 전에 삭제 모든 것을 찾을.

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

이것을 실행 .vimrc하려면 .(magic regex) 의 동작을 변경시킬 수 있는 파일에 주의하십시오.g (gdefault) . 실제로 내 컴퓨터에서 3 개의 키 입력을 저장합니다. :)

이전 답변

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

한 줄 버퍼를 입력으로 취하고 현재 버퍼를 중간 문자로 업데이트합니다. 나는 vim에서 이것에 대한 지름길이있을 것이라고 생각했다!

참고 : 잠재적으로 더 짧은 솔루션은 무한 루프를 일으키는 것으로 보입니다 ... 누군가가 아이디어를 가지고 있다면 : qq^x$x@qq@qp(12 키 누름)- <c-c>마지막 후에 작동합니다 @q...


1

Mathematica, 118 99 자

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

MMA 문자 코드 조작은 비싸다 ...


이 함수는 호출 할 때마다 전체 코드를 반복하지 않는 한 한 번만 작동합니다. 기능 제출 포인트는 재사용이 가능해야 합니다. 함수를 호출하면 함수가 사용하는 전역 값이 손상 %됩니다.
Martin Ender

1
단축 된 형태의 바닥 및 천장을 사용하지 않는 이유는 무엇입니까?
DavidC

1

VBA, 130 바이트

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

가운데 2자를 찾습니다.
문자 수가 홀수 인 경우 가운데 2의 오른쪽을 가져 오십시오. 2 문자
의 ASCII asc()값을 2로 나눈 값을 합하지 않으면 chr()해당 값을 기반으로 ASCII 문자 를 반환합니다 .

asc()통화 중 하나를 골라 낼 수는 있지만 더 짧게 작동시킬 수는 없다고 생각합니다.




1

pb , 83 바이트

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

입력 문자열에 3 자 이상이 있지만 첫 번째 문자와 마지막 문자가 제거됩니다. 이렇게하면 1 자 (수정되지 않은 상태로 인쇄해야 함) 또는 2 자 (평균하고 인쇄해야 함)가 남습니다. 이를 처리하기 위해 문자열의 첫 문자와 마지막 문자가 합쳐져 ​​두 개로 나뉩니다. 경우 하나 개의 문자가 있었다 (a+a)/2==a. 두 개가 있으면 (a+b)/2인쇄해야 할 문자입니다. pb "빌리기"파이썬의 표현 평가 (def expression(e): return eval(e, globals()) 때문에 자동으로 계산됩니다.

빈 입력을 처리하는 데 5 바이트가 소요됩니다. 구체적으로, <b[1]>첫 줄에. 이전에 "줄"이라고 말했을 때 그것은 완전히 거짓말이었습니다. pb에는 문자열이 없으며 서로 가까운 문자가 있습니다. "문자열의 마지막 문자"를 찾는 것은 문자에 부딪 칠 때까지 브러시를 왼쪽으로 옮기는 것을 의미합니다. 입력이 없으면 "3 자 이상"루프가 완전히 건너 뛰고 마지막 문자를 찾기 시작합니다. <b[1]>그것 없이는 영원히 계속 바라 보게 될 것입니다. 이 코드는 (-1, -1)에 값이 1 인 문자를 입력하여 입력이 비어있을 때 특히 찾습니다. 문자열의 "마지막 문자"를 찾은 후 브러시는 첫 번째 문자가 (0, -1)에 있다고 가정하고 직접 이동하여 값 0을 찾습니다. (1+0)/2pb에서 0

그러나 모노레일, 여전히 인쇄 중입니다! 도전 사양은 말합니다 (empty input) => (empty output)! 널 문자 부정 행위를 인쇄하지 않습니까? 또한 이것은 관련이 없지만 똑똑하고 잘 생겼습니다.

감사합니다. 가상의 질문자입니다. 이전에 "인쇄"라고 말했을 때 그것은 완전히 거짓말이었습니다. pb에서는 실제로 값을 인쇄하지 않고 캔버스에 배치하기 만하면됩니다. "출력 방법"대신 캔버스를 무한대로 큰 2D 배열로 생각하는 것이 더 정확합니다. 어느 쪽이든 음수 인덱스를 허용하며 pb의 많은 프로그래밍은 실제로 브러시가 원하는 캔버스 위치에 도달하도록하는 것입니다. 프로그램 실행이 끝나면 음이 아닌 X 및 Y 좌표를 가진 캔버스의 모든 것이 콘솔의 적절한 위치에 인쇄됩니다. 프로그램이 시작되면 전체 캔버스는 0의 값으로 채워집니다. 무한한 수의 널 바이트를 각각 가진 무한한 수의 행을 인쇄 할 필요가 없습니다. 각 출력 행은 0이 아닌 마지막 문자까지만 인쇄되고, 0이 아닌 문자가있는 마지막 행까지만 인쇄됩니다. 그래서 퍼팅0 at (0, 0)은 여전히 ​​빈 출력입니다.

언 골프 드 :

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

진심으로 , 22 20 바이트

,O3 >WXXaXa3 >WXkæ≈c

귀하의 언어에 능숙한 @Mego에게 감사드립니다.

온라인 또는 무엇이든 사용해보십시오


1
이것은 빈 입력에 실패합니다. 빈 입력을 수정하려고하는 삭제 된 20 바이트 솔루션이 있습니다.
lirtosiast

,;``@(lIƒ스택 len이 0보다 크면 입력 값을 그대로 두거나 그렇지 않으면 프로그램을 종료합니다. 백틱에는 인쇄 할 수없는 문자 127이 있습니다.
Mego

@ Mego 이것은 작동하지 않는 것 같습니다.
단계

@phase 입력 할 문자열을 인용해야합니다. 작동합니다.
Mego

@Mego 무엇 ƒ을해야합니까?
단계

1

커피 스크립트, 104 103 바이트

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

1

루비, 43 42 41 바이트

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

42 바이트

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

43 바이트

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

용법:

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

1

자바 7, 152 바이트

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

언 골프 및 테스트 사례 :

여기에서 시도하십시오.

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

산출:

3
l
q
(empty output)
x

1

PHP, 147 93 바이트

Jörg Hülsermann 에게 감사의 말을 전 합니다.

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

이전 버전:

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

테스트 코드 :

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

온라인 테스트

나는 이것이 향상 될 수 있다고 생각하지만 시간이 충분하지 않습니다 ...


<?=($l=strlen($s=$argv[1]))%2?$s[($l-1)/2]:chr(floor((ord($s[$l/2])+ord($s[$l/2-1]))/2));내 제안입니다
Jörg Hülsermann

@ JörgHülsermann 브릴리언트 골프! 당신은 당신의 자신의 답변으로 게시해야합니다. 내가 시간이 있다면 나는 당신의 멋진 솔루션으로 내 대답을 더 골프 질 것입니다. 감사.
마리오

답변으로 받아 주시기 바랍니다
요 르그 Hülsermann에게

1

엑셀, 122 79 바이트

실제로 @Sophia Lechner의 답변은 다음과 같습니다.

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

@Taylor Scott 덕분에 초기 솔루션에서 -5 바이트.

=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 바이트가 필요합니다.


-5 바이트를 삭제 Average(...,...)하고 사용하십시오 (...+...)/2. =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에 대한 정수가 아닌 두 번째 인수를 받아들이고 (따라서), =IFERROR(CHAR(CODE(MID(A1,LEN(A1)/2+1,1))/2+CODE(MID(A1,LEN(A1)/2+.5,1))/2),"")79 바이트에 대해 케이스로 분할 할 필요가 없습니다.
Sophia Lechner
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.