ค้นหาศูนย์


24

กำหนดสตริงของอักขระ ASCII ส่งออกอักขระที่อยู่ตรงกลาง หากไม่มีอักขระกลาง (เมื่อสตริงมีความยาวเท่ากัน) เอาท์พุทอักขระ ASCII ที่มีลำดับเป็นค่าเฉลี่ยที่ปูพื้นของอักขระกลางสองตัว หากสตริงว่างเปล่าสตริงว่างควรเป็นเอาต์พุต

กรณีทดสอบ:

12345 => 3

Hello => l

Hiya => q

(empty input) => (empty output)

โปรแกรมที่สั้นที่สุดในตัวละครชนะ (ไม่ใช่ไบต์)

ลีดเดอร์บอร์ด

สแต็คส่วนย่อยที่ด้านล่างของโพสต์นี้สร้างกระดานแต้มนำจากคำตอบ a) เป็นรายการคำตอบสั้นที่สุดต่อภาษาและ b) เป็นกระดานแต้มนำโดยรวม

เพื่อให้แน่ใจว่าคำตอบของคุณปรากฏขึ้นโปรดเริ่มคำตอบด้วยหัวข้อโดยใช้เทมเพลต Markdown ต่อไปนี้:

## 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
Pro-tip: เข้ารหัสคำตอบของคุณใน 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 bytes

อักษรจีน 16 ตัว

สิ่งนี้ต้องการอินพุตอยู่ในช่วง ASCII 1-127 และสิ้นสุดด้วยค่า null มันจะลบคู่ของอักขระจากจุดเริ่มต้นและจุดสิ้นสุดของสตริงจนกว่าจะมีหนึ่งหรือสองตัวอักษรที่เหลืออยู่ หากมีสองมันจะรวมเข้าด้วยกันจากนั้นหารด้วย 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 ตัว

แก้ไข:และขอบคุณม.ค. Dvorakสำหรับการแนะนำให้ฉันไปจีนซึ่งบีบอัดนี้เป็น 16 ตัวอักษรที่ตราไว้กับเดนนิส คำตอบ 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.คุณชนะ. อินเตอร์เนต. และทุกอย่างอื่น
แมว

1
ฉันไม่คิดว่ามันถูกต้อง ซอร์สโค้ด Brainfuck เป็นตัวละคร +-<>,.[]ไม่ว่าจะเป็นการเข้ารหัสแบบใด เรามีความเห็นพ้องต้องกันว่าการเข้ารหัสที่ล่ามที่มีอยู่ไม่สามารถใช้งานได้นั้นไม่ถูกต้อง
lirtosiast

2
@ThomasKwa ดังนั้นฉันให้คะแนนของฉันเป็นหลักโดยไม่ได้เข้ารหัส การเข้ารหัสตัวละครเพิ่งเข้าร่วมในความคิดที่ว่าการให้คะแนนโดยตัวละครสามารถถูกทำร้าย
Hand-E-Food

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
ความยากลำบาก? นี่คือการคำนวณค่ามัธยฐานง่ายลบเรียงลำดับ ...
เดนนิส

4
@ เดนนิสฉันคิดว่านั่นคือสิ่งที่เขาหมายถึง มันอาจมีความยาวเท่ากันสำหรับคำถามที่ง่ายขึ้นและยากขึ้น
geokavel

@Zereges ไม่ได้จริงๆ 10-30 เป็นเรื่องปกติสำหรับปัญหาง่าย ๆ ดูนี้หากคุณต้องการตัวอย่างของวิธีการที่จะมองหาบางสิ่งบางอย่างที่มีความซับซ้อนมากขึ้น: codegolf.stackexchange.com/a/64086/32852
Reto Koradi

6

TeaScript , 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 ฉันต้องการส่วนหัวสำหรับทุกภาษา goddamn
แมว

ใช่ยกเว้น kerning
แมว

@sysreq ฮ่า ๆ มันเกี่ยวกับความจริงที่ว่าฉันใช้ตัวอักษรที่แตกต่างกันคงที่
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 ไบต์

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

รหัสแหล่งประกอบ (สามารถประกอบกับ 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 ความยาวก็แปลก
  • การตั้งค่าสถานะเป็นศูนย์: แสดงว่าผลลัพธ์เป็นศูนย์หรือไม่ หากแฟล็ก carry เป็น 0 และแฟล็ก zero คือ 1 ความยาวเป็นศูนย์และไม่ควรพิมพ์อะไรเลย

โดยปกติควรตรวจสอบสถานะทันที แต่ที่นี่ฉันใช้ความจริงที่ว่าmovคำสั่งไม่เปลี่ยนสถานะ ดังนั้นพวกเขาสามารถตรวจสอบได้หลังจากโหลดถ่านกลาง


4

Python 3, 61 59 57 55 ไบต์

ฉันพยายามไม่เล่นกอล์ฟด้วยภาษาที่ฉันใช้ แต่มันก็ไม่ได้เลวร้ายอะไร

ขอบคุณ @xsot สำหรับ 2 ไบต์!

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 ไบต์ของฉัน ขอแสดงความสง่างามมากขึ้น
แมว

@sysreq อ่าฉันเข้าใจผิด และขอบคุณ.
lirtosiast

-1-len(x)//2เทียบเท่ากับ~len(x)//2เพราะการแบ่งพื้นทำงานกับจำนวนเต็มลบ
xsot

@xsot ขอบคุณมันทำให้โค้ดความชั่วร้ายเล็ก ๆ น้อย ๆ แต่ :)
lirtosiast

4

Prolog, 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)เพื่อจัดการกรณีและปัญหาที่อินพุตว่างอย่างเหมาะสม

ขอบคุณ Giusppe สำหรับ 4 ไบต์!


ไม่intToUtf8ตัดทอนไม่ใช่จำนวนเต็ม?
จูเซปเป้

@Giuseppe คุณพูดถูกเสมอ :)
JayCe

วิธีแก้ปัญหาแบบไม่เรียกซ้ำ92 ไบต์
ngm

82 ไบต์ฉันต้องการให้คุณโพสต์เป็นคำตอบแยกต่างหาก - มันต่างจากคำตอบของฉันโดยสิ้นเชิง!
JayCe

ดีฉันจะไม่ได้มากับมันจนกว่าคุณจะใส่ความพยายามเดิมและคำตอบของฉันคือพอร์ตของคำตอบที่ได้รับการโหวต Pyth ชั้นนำ ด้วยเทคนิคมากมายที่ทำให้คน R ได้เกิดขึ้น แล้วคุณทำให้มันสั้นลง ดังนั้นไปข้างหน้าและทำการแก้ไขด้วยความรู้สึกผิดที่ชัดเจน!
ngm

4

Husk , 11 ไบต์

c½S¤+öc→←½↔

ลองออนไลน์!

คำอธิบาย

Combinators แสนอร่อยและอร่อยตลอดทาง öคือ "เขียนฟังก์ชันทั้งสี่นี้" ¤คือ "ใช้อาร์กิวเมนต์แรกกับผลลัพธ์ของการใช้อาร์กิวเมนต์ที่สองกับสองอาร์กิวเมนต์เพิ่มเติมแยกกัน" 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)'เพราะนั่นคือค่า "เริ่มต้น" (และในความเป็นจริงนั่นคือสาเหตุที่โปรแกรมนี้ส่งคืนค่าเริ่มต้น มูลค่าจะใช้เมื่อใช้รายการสุดท้าย ( ) ของรายการที่ว่างเปล่า)

ฉันสามารถเลือกที่จะส่งคืนสตริงที่มีค่าศูนย์หรืออักขระหนึ่งตัวได้อย่างสมเหตุสมผลซึ่งอาจล้มลงสเปคในทิศทางอื่น แต่ฉันไม่ได้เพราะมันเพิ่มสี่ไบต์: Ṡ&ö;c½S¤+öc→←½↔ด้วยการ;แปลงอักขระเป็นสตริงหนึ่งอักขระอีกตัวöเพื่อเขียนความจำเป็นอย่างชัดเจนและ a Ṡ&ถึงทางลัดในกรณีของการป้อนข้อมูลที่ผิดพลาด


3

C ++ 14, 56 ไบต์

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

แลมบ์ดานิรนามที่รับสตริงเป็นอาร์กิวเมนต์และส่งคืน int เป็นรหัสถ่าน สำหรับ""มันจะกลับ0มา ไม่แน่ใจว่าควรมีลักษณะเช่นเดียวกับอินพุตและเอาต์พุต (ไม่ได้ระบุไว้ในคำถาม)

Ungolfed ด้วยการใช้งาน

#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

JavaScript (ES6), 83 ไบต์89 91

บันทึก 2 ไบต์ต้องขอบคุณ @ CᴏɴᴏʀO'Bʀɪᴇɴ

บันทึกแล้ว 6 ไบต์ด้วย @ETHproductions

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

JavaScript ไม่ดีเกินไปสำหรับรหัส char สตริงนี้


คุณเอาชนะฉันไป โอ้อย่างน้อยที่สุดที่ฉันสามารถทำได้คือช่วยคุณ;) s=>String.fromCharCode((s[~~(t=s.length/2-.5)][r="charCodeAt"]()+s[Math.ceil(t)][r])/2)สั้นลง 5 ไบต์
Conor O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴหวาน ฉันต้องการสิ่ง()รอบตัวcharCodeAtดังนั้นมันจึงเป็น 3 ตัวอักษรจริงๆ แต่ก็ต้องขอบคุณ!
Downgoat

@ ןnɟuɐɯɹɐןoɯถ้าtเป็นจำนวนเต็มที่ใช้งานไม่ได้
Downgoat

Math.ceil(t)สามารถเปลี่ยนเป็น0|t+.9
ETHproductions

@ ETHproductions ขอบคุณที่บันทึกไว้ 6 ไบต์!
Downgoat

3

O , 44 34 ไบต์

ข้ามออก 44 ยังคงเป็นปกติ 44 :(

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

จำนวนไบต์ที่สูญเปล่า:

  • ตรวจสอบความยาวของอินพุตว่าเป็นเลขคู่หรือคี่
  • รับตัวอักษรกลาง

7
ฉันแน่ใจว่าคุณโพสต์รุ่น ungolfed จะบอกว่า;)
Conor โอไบรอัน

4
@ CᴏɴᴏʀO'Bʀɪᴇɴฉันเพิ่งโชคดี: D
เฟส

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
hiyaผลตอบแทนiแทนq
Downgoat

@ Vɪʜᴀɴ: OH ฉันอ่านผิด ฉันคิดว่าคำถามกำลังถามตัวละครที่อยู่ตรงกลางโดยไปที่ตำแหน่งเฉลี่ยที่ปูพื้นถ้าความยาวเท่ากัน
El'endia Starman

@ThomasKwa: แก้ไขแล้ว
El'endia Starman

@ Vɪʜᴀɴ: ^ แก้ไข
El'endia Starman

2

Japtap , 40 29 23 21 20 ไบต์

บันทึกแล้ว 4 ไบต์ขอบคุณ @ ןnɟuɐɯɹɐןoɯ

ตอนนี้มีเพียงครึ่งหนึ่งของความยาวดั้งเดิม! ฉันรักรหัสกอล์ฟ :-D

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

อย่างที่คุณเห็นมันใช้พื้นรถยนต์จำนวนมาก (ขอบคุณจาวาสคริปต์!) ยินดีต้อนรับข้อเสนอแนะ!


สิ่งที่ตรงกันข้ามคือ +1 ที่ยอดเยี่ยม
Downgoat

คุณทำV=Ul /2;((UcV +Uw cV )/2 dไม่ได้เหรอ
Mama Fun Roll

@ ןnɟuɐɯɹɐןoɯเอ่อ duh: P ฉันเคยใช้มาcหลายครั้งแล้วโดยไม่มีข้อโต้แย้งว่าฉันลืมไปแล้วก็ยอมรับได้ ขอบคุณ!
ETHproductions

2

ไปที่166 156 153 ไบต์

Go อาจไม่ใช่ภาษาที่ดีที่สุดสำหรับการเล่นกอล์ฟ ... แต่ฉันรักมันมากและฉันกำลังเรียนรู้อยู่ที่นั่น

การใช้งานนี้ยอมรับ\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]))}}}

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

𝔼𝕊𝕄𝕚𝕟, 23 ตัวอักษร

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

Try it here (Firefox only).

ขอบคุณ @ETHProductions สำหรับแนวคิดนี้!


2
โชคดีความท้าทายที่วัดเป็นตัวอักษรแทนไบต์;)
ETHproductions

โอ้ใช่! พวกเราทุกคนถูกมัด
Mama Fun Roll

ใครก็ตามที่ลงคะแนนในเรื่องนี้ฉันขอคำอธิบายได้ไหม?
Mama Fun Roll

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

เป็นกลุ่ม, 38 24 23 การกดแป้น

เพราะเป็นกลุ่มที่มีการสร้างขึ้นในฟังก์ชั่นเพื่อหาสิ่งที่กลางสายแต่ไม่กลาง ถ่านเราแยกตัวละครทุกตัวในบรรทัดที่แยกต่างหากครั้งแรกที่ใช้substituteค้นหาสายกลางแล้วทุกอย่างลบหลังและก่อนที่มันจะ

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

หากคุณต้องการเรียกใช้สิ่งนี้โปรดระวัง.vimrcไฟล์ที่อาจเปลี่ยนพฤติกรรมของ.(magic regex) และg(gdefault) โปรดทราบว่าจริง ๆ แล้วมันช่วยฉัน 3 การกดแป้นบนเครื่องของฉัน :)

คำตอบก่อนหน้า

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

รับบัฟเฟอร์หนึ่งบรรทัดเป็นอินพุตอัพเดตบัฟเฟอร์ปัจจุบันด้วยอักขระกลาง ฉันคิดว่าคงจะมีทางลัดสำหรับเรื่องนี้ในกลุ่ม!

หมายเหตุ: วิธีแก้ปัญหาที่สั้นกว่าอาจก่อให้เกิดการวนซ้ำไม่สิ้นสุด ... หากใครบางคนมีความคิด: 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
ถ้าจำนวนตัวละครเป็นจำนวนคี่จะได้รับ Right of the Middle 2 ซึ่งจะเป็นค่ากลางที่แท้จริงเมื่อเราปัดเศษ
หากไม่รวมasc()ค่าASCII ของ 2 อักขระหารด้วย 2 และส่งคืนอักขระ ASCII chr()ตามค่านั้น

ฉันคิดว่าฉันสามารถตีหนึ่งออกไป 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)/2คือ 0 ใน pb

แต่โมโนเรลนั่นยังพิมพ์อยู่! สเปคความท้าทายพูดว่า(empty input) => (empty output)! การพิมพ์เป็นการโกงอักขระที่ไม่มีค่าหรือไม่? นอกจากนี้ยังไม่เกี่ยวข้อง แต่คุณฉลาดและหล่อ

ขอบคุณผู้ถามคำถามสมมุติ ก่อนหน้านี้เมื่อฉันพูดว่า "พิมพ์" นั่นเป็นคำโกหกทั้งหมด ใน pb คุณไม่ได้พิมพ์ค่าจริง ๆ เพียงแค่วางลงบนผืนผ้าใบ แทนที่จะเป็น "วิธีการส่งออก" มันแม่นยำกว่าที่จะจินตนาการผืนผ้าใบในฐานะอาร์เรย์ 2 มิติขนาดใหญ่ที่ไม่มีที่สิ้นสุด มันช่วยให้ดัชนีลบทั้งสองมิติและการเขียนโปรแกรมจำนวนมากใน pb นั้นเกี่ยวกับการทำให้แน่ใจว่าแปรงไปถึงตำแหน่งบนผืนผ้าใบที่คุณต้องการ เมื่อโปรแกรมดำเนินการเสร็จสิ้นสิ่งใดก็ตามบนผืนผ้าใบที่ไม่มีพิกัด X และ Y ที่ไม่เป็นลบจะถูกพิมพ์ไปยังตำแหน่งที่เหมาะสมบนคอนโซล เมื่อโปรแกรมเริ่มต้นผืนผ้าใบทั้งหมดจะถูกเติมด้วยค่า 0 เพื่อที่จะได้ไม่ต้องพิมพ์จำนวนบรรทัดที่ไม่มีที่สิ้นสุด แต่ละบรรทัดของเอาต์พุตจะพิมพ์เฉพาะอักขระที่ไม่ใช่ศูนย์สุดท้ายเท่านั้นและจะพิมพ์เฉพาะบรรทัดสุดท้ายเท่านั้นที่มีอักขระที่ไม่ใช่ศูนย์ ดังนั้นการใส่0 ที่ (0, 0) ยังคงเป็นเอาต์พุตว่าง

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

อย่างจริงจัง , 22 20 ไบต์

,O3 >WXXaXa3 >WXkæ≈c

ขอบคุณ @Mego ที่เก่งภาษาของคุณ

ลองออนไลน์หรืออะไรก็ได้


1
สิ่งนี้ล้มเหลวสำหรับอินพุตว่าง ฉันมีโซลูชัน 20- ไบต์ที่ถูกลบซึ่งฉันพยายามแก้ไขสำหรับอินพุตว่าง
lirtosiast

,;``@(lIƒจะทำให้คุณมีค่าอินพุตในสแต็กหากlenเป็น> 0 หรือยกเลิกโปรแกรมเป็นอย่างอื่น โปรดทราบว่ามี backprint ที่ไม่สามารถพิมพ์ได้ใน backticks - ตัวละคร 127
Mego

@Mego นี้ดูเหมือนจะไม่ได้ร่วมงาน
ช่วง

@ เฟสคุณต้องใส่เครื่องหมายคำพูดเพื่อรับอินพุต วิธีนี้ใช้ได้ผล
Mego

@Mego สิ่งที่ƒควรทำคืออะไร?
ช่วง


1

Ruby, 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

Java 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örgHülsermannสำหรับการเล่นกอล์ฟคำตอบของฉัน 54 ไบต์!

<?=($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örgHülsermann

@ JörgHülsermannการเล่นกอล์ฟที่ยอดเยี่ยม! คุณควรโพสต์มันเป็นคำตอบของคุณเอง หากฉันมีเวลาฉันจะตอบคำถามของฉันให้ดีขึ้น ขอบคุณ
มาริโอ

รู้สึกอิสระที่จะตอบคำถามของคุณ
JörgHülsermann

1

Excel, 122 79 ไบต์

ที่จริง @Sophia Lechner คำตอบทันที:

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

-5 ไบต์จากโซลูชันเริ่มต้นด้วย @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 ไบต์สำหรับสตริงที่ว่างเปล่า


ปล่อยAverage(...,...)และใช้(...+...)/2สำหรับ -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)),"")
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.