คำนวณอักขระเฉลี่ยของสตริง


24

งาน

งานของคุณคือการผลิตสตริงที่มีอักขระเฉลี่ยของสตริง อักขระตัวแรกของผลลัพธ์จะเป็นอักขระเฉลี่ยของอักขระตัวแรก (ซึ่งเป็นอักขระตัวแรก) และอักขระตัวที่สองเฉลี่ยของอักขระสองตัวแรกเป็นต้น

อักขระเฉลี่ยคืออะไร

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

ยกตัวอย่างเช่นสตริงสามารถเขียนเป็นลำดับไบต์"Hello!" 72 101 108 108 111 33ค่าเฉลี่ยของค่า ASCII คือ 533/6 = 88.833 ... และเมื่อมันถูกปัดเศษเป็นจำนวนเต็มที่ใกล้เคียงที่สุดเราจะได้ 89 ซึ่งเป็นรหัส ASCII สำหรับตัวอักษรตัวYใหญ่

กฎระเบียบ

  • คุณสามารถสมมติว่าอินพุตมีอักขระ ASCII ที่พิมพ์ได้เท่านั้น
  • อินพุตสามารถอ่านได้จาก stdin หรือเป็นอาร์กิวเมนต์บรรทัดคำสั่งหรือเป็นอาร์กิวเมนต์ของฟังก์ชัน
  • เอาต์พุตต้องเป็น stdout หากโปรแกรมของคุณใช้งานได้คุณสามารถคืนค่าสตริงที่คุณต้องการพิมพ์ได้
  • ต้องเป็นทั้งโปรแกรมหรือฟังก์ชั่นไม่ใช่ตัวอย่าง
  • ช่องโหว่มาตรฐานใช้
  • จำนวนเต็มถูกปัดเศษตามฟังก์ชันfloor(x+0.5)หรือฟังก์ชันที่คล้ายกัน

ฉันจะชนะได้อย่างไร

นี่คือดังนั้นคำตอบที่สั้นที่สุด (เป็นไบต์) เป็นผู้ชนะ

ตัวอย่าง

  • Hello!HW^adY
  • testtmop
  • 4243
  • StackExchangeSdccd_ccccddd

คำถามที่แก้ไข ตอนนี้มันควรชัดเจน: คุณต้องปัดครึ่งขึ้นไป
Hannes Karppila

1
" อินพุตสามารถอ่านได้จาก stdin หรืออาร์กิวเมนต์บรรทัดคำสั่ง ": หรือเป็นอาร์กิวเมนต์ของฟังก์ชัน (เนื่องจากคุณอนุญาตให้ใช้ฟังก์ชัน) ใช่ไหม
Luis Mendo

แน่นอนแก้ไขอีกครั้ง
Hannes Karppila

2
ขออภัยที่รบกวนคุณอีกครั้ง แต่ฟังก์ชั่นจำเป็นต้องพิมพ์เอาต์พุตไปที่ STDOUT หรือพวกเขาสามารถส่งคืนสตริงที่ต้องการได้หรือไม่?
Dennis

ขออภัยลืมแก้ไขก่อน ตอนนี้มันควรจะโอเค
Hannes Karppila

คำตอบ:


11

Brainfuck 106 ไบต์

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

นี่คือการมีส่วนร่วมครั้งแรกของฉันในการเขียนโค้ดกอล์ฟ มันใช้งานได้ แต่ brainfuck ไม่สามารถจัดการกับการลอยตัว (ไม่ใช่ที่ฉันรู้) ดังนั้นค่าที่ปัดเศษจะอยู่ด้านล่างสุดเสมอ (อาจแก้ไขอัลกอริทึมของฉันในภายหลัง)

นอกจากนี้อัลกอริทึมเฉลี่ยค่า 2 โดย 2 ซึ่งหมายความว่ามันอาจจะบริสุทธิ์ในบางจุด และฉันต้องแก้ไขข้อผิดพลาดที่กำลังพิมพ์ตัวเลขที่ส่วนท้ายของผลลัพธ์ด้วย


9

Pyth, 16 ไบต์

smCs+.5csaYCdlYz

ตรงไปตรงมาสวย ใช้s+.5แทนการปัดเศษเนื่องจากบางเหตุผลround(0.5, 0)คือ 0 ใน Python


1
Python 3 ปัดครึ่งไปทางคู่ซึ่งจะทำให้มีอคติน้อยลง คำถามไม่ได้ระบุวิธีการปัดครึ่งอย่างชัดเจนดังนั้นฉันจึงขอคำชี้แจงจาก OP
Dennis

คำถามที่แก้ไข โค้งมนที่ควรจะเป็น0.5 1
Hannes Karppila

7

Q, 15 12 ไบต์

12 ไบต์เป็นนิพจน์

"c"$avgs"i"$

q)"c"$avgs"i"$"Hello!"
"HW^adY"
q)"c"$avgs"i"$"test"
"tmop"
q)"c"$avgs"i"$"42"
"43"
q)"c"$avgs"i"$"StackExchange"
"Sdccd_ccccddd"

หรือ 15 ไบต์เป็นฟังก์ชัน

{"c"$avgs"i"$x}

q){"c"$avgs"i"$x} "Hello!"
"HW^adY"
q){"c"$avgs"i"$x} "test"
"tmop"
q){"c"$avgs"i"$x} "42"
"43"
q){"c"$avgs"i"$x} "StackExchange"
"Sdccd_ccccddd"

ใช้ประโยชน์จาก

  1. "i" $ cast เพื่อแปลงสตริง (รายการอักขระ) เป็นรายการจำนวนเต็ม
  2. ฟังก์ชัน avgs ซึ่งคำนวณค่าเฉลี่ยการรันของรายการเป็นรายการของการลอย
  3. "c" $ cast เพื่อแปลงรายชื่อลอยเป็นรายการของตัวละครและโดยอัตโนมัติปัดแต่ละทศนิยมเป็นจำนวนเต็มที่ใกล้ที่สุดก่อนที่จะทำเช่น [คือ ("c" $ 99.5) = ("c" $ 100) และ ("c "$ 99.4) = (" c "$ 99)]

ไม่จำเป็นต้องมีเสื้อคลุม Q ฟังก์ชั่นที่นี่หรือคุณสามารถรับไปเพียงการแสดงออกโดยปริยาย"c"$avgs"i"$? ฉันไม่คิดว่าทางออกจะตรงไปตรงมามากกว่านั้น :)
JohnE

คุณถูกต้อง - ไม่จำเป็นต้องใช้ตัวห่อหุ้มฟังก์ชั่นเช่น "c" $ avgs "i" $ "Hello!" ทำงานได้ดี
scottstein37

ฉันคิดว่าคุณสามารถบันทึก 2 ไบต์โดยเปลี่ยน"c"เป็น `c และ"i"` i
kirbyfan64sos

น่าเสียดายที่ฉันไม่คิดว่ามันจะได้ผล หากต้องการใช้การแสดงสัญลักษณ์แบบสำหรับการคัดเลือกนักแสดงฉันต้องใช้ `char และ` int ตามcode.kx.com/wiki/JB:QforMortals2/ ...... ฉันพิจารณาใช้ 10h และ 6h แทน "c" และ "i" แต่ ที่จะไม่บันทึกไบต์ใด ๆ - 10h มีความยาวเท่ากับ "c" และการแทนที่ 6h สำหรับ "i" ต้องใช้ช่องว่างต่อท้ายทำให้พวกเขามีความยาวเท่ากัน
scottstein37


4

Perl: 31 30 ตัวอักษร

(ตัวเลือกรหัสบรรทัด 29 ตัวอักษร + 1 ตัวอักษร)

s!.!chr.5+($s+=ord$&)/++$c!ge

วิ่งตัวอย่าง:

bash-4.3$ perl -pe 's!.!chr.5+($s+=ord$&)/++$c!ge' <<< 'StackExchange'
Sdccd_ccccddd


2

K, 36 ไบต์

`0:_ci_.5+{(+/x)%#x}'.0+1_|(-1_)\_ic

การใช้งาน:

  `0:_ci_.5+{(+/x)%#x}'.0+1_|(-1_)\_ic"Hello!"
HW^adY
  `0:_ci_.5+{(+/x)%#x}'.0+1_|(-1_)\_ic"test"
tmop
  `0:_ci_.5+{(+/x)%#x}'.0+1_|(-1_)\_ic"42"
43
  `0:_ci_.5+{(+/x)%#x}'.0+1_|(-1_)\_ic"StackExchange"
Sdccd_ccccddd

_ciและ_icแปลง ascii เป็น chars และในทางกลับกันตามลำดับ {(+/x)%#x}เป็นสำนวน K คลาสสิคสำหรับการคำนวณค่าเฉลี่ย โดยรวมค่อนข้างตรงไปตรงมา

แก้ไข: โอ้ผิดสเป็ค `0: จำเป็นต้องพิมพ์ผลลัพธ์เป็น stdout รอการชี้แจงเกี่ยวกับอินพุตอีกครั้ง คำถามของเดนนิส


ถ้าคุณใช้ K5 นี้สามารถลงไป 35 {[s]`0:`c${_.5+(+/u)%#u:x#s}'1+!#s}ไบต์:
kirbyfan64sos

หรือ 30:`0:`c$_.5+{(+/x)%#x}'1_|(-1_)\
JohnE

`c$_.5+{(+\x)%+\~^x}`i$สำหรับ 24. อาจจะสั้นกว่า ( `c$`i${(+\x)%+\~^x}`i$) แต่ REPL ของคุณ ( johnearnest.github.io/ok/index.html ) การปัดเศษไม่ถูกต้องเมื่อส่งจากโฟลตไปเป็น int ฉันลังเลที่จะเรียกโซลูชัน ak นี้ตั้งแต่_ciและ_icไม่มีที่ไหนใน spec K5 เท่าที่ฉันสามารถบอกได้ในขณะที่0:ไม่ได้พิมพ์ไปยัง stdout แต่แทนที่จะอ่านไฟล์ txt จากดิสก์
tmartin

@tmartin: ถูกต้อง - _ciและ_icถูกแทนที่ทั้งหมดใน K5 ด้วยแบบฟอร์ม`c$ดังนี้ โซลูชันดั้งเดิมที่ฉันโพสต์เข้ากันได้กับ Kona ซึ่งใช้ K2 / K3 โดยทั่วไปฉันพยายามไม่โพสต์โซลูชันด้วย oK โดยเฉพาะเนื่องจากความหมายยังคงขยับไปมาและไม่ถูกต้องบางส่วน
JohnE

1
ฉันเข้าใจแล้วใช่ไหม ฉันคิดว่านี่เป็นโซลูชัน K5 อื่น นี่เป็นทางออกที่ Kona 28 ถ่าน`0:_ci_0.5+{(+\x)%1.+!#x}_ic
tmartin


2

Julia, 85 81 ไบต์

s->(i=[int(c)for c=s];print(join([char(iround(mean(i[1:j])))for j=1:length(i)])))

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


2

ทับทิม, 46

s=0.0
$<.bytes{|b|s+=b;$><<'%c'%(0.5+s/$.+=1)}

ideone

ด้วยคำขอโทษต่อ w0lf คำตอบของฉันแตกต่างกันมากพอที่จะคุ้มค่ากับการโพสต์

$<.bytesวนซ้ำแต่ละไบต์ใน stdin ดังนั้นเราจึงพิมพ์ค่าเฉลี่ยการหมุนในแต่ละลูป '% c' แปลงทุ่นเป็นตัวละครโดยการปัดเศษลงและรับ ASCII ดังนั้นสิ่งที่เราต้องทำคือเพิ่ม 0.5 เพื่อให้มันหมุนอย่างถูกต้อง $.เป็นตัวแปรเวทย์มนตร์ที่เริ่มต้นด้วยการเริ่มต้นเป็น 0 - มันควรจะเก็บจำนวนบรรทัด แต่เนื่องจากที่นี่เราต้องการจำนวนไบต์เราจึงเพิ่มมันด้วยตนเอง


2

Mathcad, 60 "ไบต์"

ป้อนคำอธิบายรูปภาพที่นี่

Mathcad เป็นแอปพลิเคชั่นทางคณิตศาสตร์ที่ใช้แผ่นงาน 2D ซึ่งประกอบด้วย "ภูมิภาค" ซึ่งแต่ละอันสามารถเป็นข้อความนิพจน์ทางคณิตศาสตร์โปรแกรมพล็อตหรือส่วนประกอบสคริปต์

คำสั่งทางคณิตศาสตร์หรือการเขียนโปรแกรมถูกเลือกจากแถบเครื่องมือถาดสีหรือป้อนโดยใช้แป้นพิมพ์ลัด เพื่อวัตถุประสงค์ในการตีกอล์ฟการดำเนินการ ("byte") จะถูกนำไปใช้เป็นจำนวนการดำเนินงานของแป้นพิมพ์ที่จำเป็นในการสร้างชื่อหรือการแสดงออก (ตัวอย่างเช่นการตั้งค่าตัวแปร a ถึง 3 เราจะเขียน a: = 3 : = เป็นปุ่มกดเดียว ":" เช่นเดียวกับ a และ 3 ให้ผลรวม 3 "ไบต์" การเขียนโปรแกรมสำหรับโอเปอเรเตอร์ต้องการการพิมพ์ ctl-shft- # (หรือคลิกครั้งเดียวบนแถบเครื่องมือการเขียนโปรแกรม) ดังนั้นอีกครั้งเทียบเท่า 1 ไบต์

ใน Mathcad ผู้ใช้ป้อนคำสั่งภาษาการเขียนโปรแกรมโดยใช้แป้นพิมพ์ลัด (หรือเลือกจากแถบเครื่องมือการเขียนโปรแกรม) แทนที่จะเขียนเป็นข้อความ ตัวอย่างเช่นการพิมพ์ ctl-] สร้างโอเปอเรเตอร์ while-loop ที่มีสอง "ตัวยึด" เพื่อป้อนเงื่อนไขและบรรทัดเดียวของร่างกายตามลำดับ การพิมพ์ = ที่ส่วนท้ายของนิพจน์ Mathcad ทำให้ Mathcad ประเมินค่านิพจน์

(นับจำนวนไบต์) โดยดูจากมุมมองอินพุตของผู้ใช้และการดำเนินการอินพุต Mathcad หนึ่งครั้ง (โดยปกติแล้วแป้นพิมพ์ให้คลิกเมาส์ที่แถบเครื่องมือหากไม่มีทางลัด kbd) เป็นอักขระและตีความเป็นไบต์ csort = 5 ไบต์ตามที่พิมพ์ไว้ char-by-char เช่นเดียวกับชื่อตัวแปร / ฟังก์ชั่นอื่น ๆ ตัวดำเนินการสำหรับเป็นโครงสร้างพิเศษที่มีอักขระ 11 ตัว (รวมถึง "ตัวยึด" ที่ว่าง 3 ตัวและช่องว่าง 3 ช่อง) แต่ป้อนโดย ctl-shft- # ดังนั้น = 1 ไบต์ (คล้ายกับโทเค็นในบางภาษา) การพิมพ์ '(เครื่องหมายคำพูด) จะสร้างวงเล็บที่มีความสมดุล (โดยปกติ) ดังนั้นนับเป็น 1 ไบต์ การจัดทำดัชนี v = 3 ไบต์ (type v [k)


2

Python 3, 66 ไบต์

ถ้าฉันใช้round()แทนint(.5+ฯลฯ มันจะช่วยตัวละครตัวหนึ่ง แต่ในทางเทคนิคไม่สอดคล้องกับความท้าทาย: round()รอบของ Python แบ่งครึ่งเป็นจำนวนเต็มคู่ที่ใกล้เคียงที่สุด อย่างไรก็ตามมันทำงานได้อย่างถูกต้องกับอินพุตตัวอย่างทั้งหมด

ฉันรู้สึกสกปรกนิดหน่อยที่จะไม่สิ้นสุดเอาต์พุตด้วยการขึ้นบรรทัดใหม่ แต่ความท้าทายไม่ได้ต้องการ ...

n=t=0
for c in input():n+=1;t+=ord(c);print(end=chr(int(.5+t/n)))

1
หากคุณเพิ่ม n ก่อนการพิมพ์คุณสามารถหลีกเลี่ยงการปรับได้ 1
xnor

1
@xnor: ใบหน้า, ฝ่ามือ ปาล์มใบหน้า ขอบคุณสำหรับการชี้ให้เห็นว่า
ทิม Pederick

ทำprint(end=chr(int(...))เพื่อประหยัด bytes
FlipTack

@ Flp.Tkc: ขอบคุณ! อัปเดตคำตอบแล้ว
ทิม Pederick

2

JavaScript (ES6), 75 ไบต์

let f =
s=>s.replace(/./g,x=>String.fromCharCode((t+=x.charCodeAt())/++i+.5),i=t=0)
<input oninput="O.value=f(this.value)" value="Hello!"><br>
<input id=O value="HW^adY" disabled>

ฉันไม่อยากจะเชื่อเลยว่ายังไม่มีคำตอบ JS สำหรับเทคนิคนี้ ...


1

Python 2, 71

i=s=0
r=''
for c in input():s+=ord(c);i+=1.;r+=chr(int(s/i+.5))
print r

ด้วยตัวละครใหม่แต่ละตัวอัพเดตจำนวนตัวละครsและจำนวนตัวอักษรiเพื่อคำนวณและต่อท้ายตัวละครเฉลี่ย


วิธีการเดียวกับของฉันเกือบจะเหมือนกับ Python 2 แทนที่จะเป็น 3 และชั่วโมงก่อนหน้าจะโพสต์: +1 (นอกจากนี้ฉันพบว่าฉันบันทึกสองสามไบต์ในการพิมพ์อักขระแต่ละตัวแทนที่จะมาเก็บไว้สุดท้ายตัวอักษรนั้นprintจะใช้งานกับ Python 2 ได้หรือไม่ฉันลืมตอนนี้ว่าจะระงับการขึ้นบรรทัดใหม่ในprintคำสั่งได้อย่างไร แทนใช่ไหม?)
ทิม Pederick

Python 2 สามารถทำได้print _,เพื่อเว้นช่องว่างแทนที่จะขึ้นบรรทัดใหม่ แต่ไม่มีวิธีที่ดีในการเว้นช่องว่าง การโทรที่ดีด้วยendข้อโต้แย้งของ Python 3 ฉันลืมไปแล้ว
xnor

@TimPederick บางทีควบคุม Backspace อาจเป็นธรรมสำหรับสถานีที่ใช้มันเป็นสับลบพื้นที่:print'\b'+_,
XNOR


1

Java, 100

เหมือนกับคำตอบอื่น ๆ อีกมากมายที่นี่ฉันกำลังสรุปและหาค่าเฉลี่ยเป็นวง เพียงที่นี่เพื่อเป็นตัวแทนของ Java :)

void f(char[]z){float s=0;for(int i=0;i<z.length;System.out.print((char)Math.round(s/++i)))s+=z[i];}

รหัสดั้งเดิมของฉันคือ 97 แต่จะคืนค่าการแก้ไขchar[]แทนที่จะพิมพ์:

char[]g(char[]z){float s=0;for(int i=0;i<z.length;z[i]=(char)Math.round(s/++i))s+=z[i];return z;}

ตอนนี้ก็เพียงแค่นานพอที่จะเลื่อนให้ปรากฏสำหรับฉันดังนั้นนี่เป็นรุ่นที่มีการแบ่งบรรทัดบางเพียงเพราะ:

void f(char[]z){
    float s=0;
    for(int i=0;
            i<z.length;
            System.out.print((char)Math.round(s/++i)))
        s+=z[i];
}

น่าสนใจ คุณสามารถแสดงตัวอย่างการโทรให้เราทราบได้หรือไม่ Java ของฉันแข็งแรงมาก
จัดการ

เช่นเดียวกับวิธีการโทร สมมติว่าเป็นแถวถ่านใช้เพียงtest f(test);ถ้ามันเป็นวัตถุ String f(test.toCharArray());แล้วคุณต้องการใช้ สตริงตัวอักษรก็ดีเช่นกัน:f("Hello!".toCharArray());
Geobits

โอ้ แน่ใจ toCharArray()ฉันโง่ฉันพยายามที่จะละเมิดมันด้วยการคัดเลือกนักแสดง ขอขอบคุณ.
จัดการ

มันจะง่ายเกินไปที่จะทิ้งมันไว้ เทพเจ้าจาวาจะโกรธ: P
Geobits

1

C, 62 ไบต์

c;t;main(n){for(;(c=getchar())>0;n++)putchar(((t+=c)+n/2)/n);}

(ลิงค์ ideone)

ผลลัพธ์จะแตกต่างจากตัวอย่างของ OP เล็กน้อย แต่เพียงเพราะรหัสนี้ปัดเศษ 0.5 ลงแทนที่จะเป็นขึ้น ไม่อีกแล้ว!


1

R, 135 127 ไบต์

นี่เป็นเรื่องจริงเร็วมานานและฉันเข้าใจผิดครั้งแรก :) ต้องอ่านคำถามให้ถูกต้อง

cat(sapply(substring(a<-scan(,''),1,1:nchar(a)),function(x)rawToChar(as.raw(round(mean(as.integer(charToRaw(x)))+.5)))),sep='')

ทดสอบการทำงาน

cat(sapply(substring(a<-scan(,''),1,1:nchar(a)),function(x)rawToChar(as.raw(round(mean(as.integer(charToRaw(x)))+.5)))),sep='')
1: Hello!
2: 
Read 1 item
HW^adY

บางคนโพสต์ความท้าทายล่อลวงในกล่องทรายดังนั้นฉันจึงพบสิ่งนี้ ... นี่เป็นเวลาที่ผ่านมาแล้ว แต่utf8ToIntจะช่วยได้! ฉันมีสนามกอล์ฟ 68 ไบต์ถ้าคุณต้องการอัปเดต
Giuseppe

@Giuseppe ไปข้างหน้าและโพสต์ด้วยตัวคุณเองหากคุณต้องการ ฉันสงสัยว่ามันแตกต่างอย่างมากกับสิ่งที่ฉันทำที่นี่
MickyT


1

TSQL, 118 ไบต์

DECLARE @ varchar(400) = 'StackExchange'

SELECT
top(len(@))char(avg(ascii(stuff(@,1,number,''))+.5)over(order by number))FROM
master..spt_values
WHERE'P'=type

การย้อนกลับอักขระในแนวตั้ง

S
d
c
c
d
_
c
c
c
c
d
d
d

1

> <> , 30 ไบต์

i:0(?v
v &l~<
\+l2(?
\&,12,+o;
  • บรรทัดแรกอ่านจาก stdin และวางอักขระบนสแต็ก
  • อันที่สองจะลบ EOL ถ่านเอาขนาดของสแต็คและใส่ไว้ใน&รีจิสเตอร์
  • บรรทัดที่สามจะเพิ่มตัวเลขในสแต็กในขณะที่มีสองคนขึ้นไป
  • บรรทัดที่สี่จะแบ่งจำนวนผลลัพธ์ด้วยค่าของการลงทะเบียนจากนั้นเพิ่ม 1/2 ส่งออกค่าเป็นอักขระและหยุด เมื่อต้องเผชิญกับค่าลอยเมื่อแสดงตัวอักษร> <> จะปูพื้นซึ่งเป็นเหตุผลที่เราเพิ่ม 1/2

คุณสามารถลองใช้กับล่ามออนไลน์แต่แล้วคุณต้องใช้รุ่นต่อไปนี้เพราะล่ามออนไลน์วางกล่องรหัสลงในสี่เหลี่ยมและใช้?กับช่องว่าง

i:0(?v
v &l~<
\+l2(   ?
\&,12,+o;

1

05AB1E , 15 ไบต์ [ไม่แข่งขัน?]

.pvyDSÇOsg/îç}J

ลองออนไลน์!


-2 ไบต์โดยการลบDและ}และแทนที่ด้วยs y
Kevin Cruijssen

1
@KevinCruijssen สำหรับคำตอบนี้อายุเท่าไรแล้วยิ่งกว่านั้นอีก: P .pตอนนี้ก็เป็น 1byter เหมือนกัน
Magic Octopus Urn

อ๊ะลืมไปแล้วเกี่ยวกับηxD
Kevin Cruijssen

1

Japt 13 ไบต์ (ไม่ใช่การแข่งขัน)

£T±Xc)/°Y r d

ทดสอบออนไลน์!

มันทำงานอย่างไร

£   T± Xc)/° Y r d
mXY{T+=Xc)/++Y r d}
                     // Implicit: U = input string, T = 0
mXY{              }  // Replace each char X and index Y in the string by this function:
    T+=Xc            //   Add X.charCodeAt() to T.
         )/++Y       //   Take T / (Y + 1).
               r d   //   Round, and convert to a character.
                     // Implicit: output result of last expression

อ้าถั่ว ฉันคิดว่า "ไม่ใช่การแข่งขัน" กรองได้ถูกลบออกจากลีดเดอร์ดังนั้นฉันไม่เคยเห็นแบบนี้มาก่อนการโพสต์นี้
Shaggy


1

PHP , 176 ไบต์

<?=(implode('',array_reduce(str_split($argv[1]),function($c,$k){array_push($c[1],chr(floor(((ord($k)+$c[0])/(count($c[1])+1))+0.5)));return[ord($k)+$c[0],$c[1]];},[0,[]])[1]));

ตัวอย่าง:

>php cg.php Hello!
HW^adY
>php cg.php test  
tmop
>php cg.php 42
43

ทางออกที่ใหญ่ที่สุดจนถึงตอนนี้ แต่ฉันคิดว่ามันใช้ php ไม่สั้นกว่านี้มากนัก 2 ไบต์สามารถบันทึกได้โดยการลบบรรทัดใหม่


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

1
คุณสามารถรวมเวอร์ชันเพิ่มเติมพร้อมกับช่องว่างเพื่อให้สามารถอ่านพร้อมกับย่อหน้าสั้น ๆ ของคุณ ฉันมักจะทำสิ่งนี้เมื่อรหัสของฉันยาวเกินไปที่จะมองเห็นได้อย่างสมบูรณ์บนจอภาพส่วนใหญ่
ข้าวสาลี Wizard

0

JavaScript ES7, 122 ไบต์

s=>String.fromCharCode(...[for(i of s)i.charCodeAt()].map((l,i,a)=>Math.round(eval((t=a.slice(0,++i)).join`+`)/t.length)))

ส่วนใหญ่ทุกอย่างเกิดขึ้นในบิตนี้

eval((t=a.slice(0,++i)).join`+`)/t.length)

ส่วนที่เหลือเป็นการวนลูป / การแปลงรหัสตัวอักษร

แยกกัน:

s=> 
 String.fromCharCode(...                        ) // Converts average character code array to string, ... allows it to take an array
   [for(i of s)i.charCodeAt()]                    // Converts string to char code array
   .map((l,i,a)=>                             )   // Loops through each character
     Math.round(                    /t.length)    // Rounds sum of previous char codes, divides by position + 1
       eval(                       )              // evals string of char codes seperated with +
            (                ).join`+`            // joins previous char codes with +
             t=a.slice(0,++i)                     // creates an array with all the char codes

หากฟังก์ชั่นไม่ได้รับอนุญาต:

alert(String.fromCharCode(...[for(i of prompt())i.charCodeAt()].map((l,i,a)=>Math.round(eval((t=a.slice(0,++i)).join`+`)/t.length))))

133 ไบต์


ตัวอย่าง ES5:

function _toConsumableArray(r){if(Array.isArray(r)){for(var e=0,t=Array(r.length);e<r.length;e++)t[e]=r[e];return t}return Array.from(r)}function _taggedTemplateLiteral(r,e){return Object.freeze(Object.defineProperties(r,{raw:{value:Object.freeze(e)}}))}var _templateObject=_taggedTemplateLiteral(["+"],["+"]),f,t=function t(s){return String.fromCharCode.apply(String,_toConsumableArray(function(){var r=[],e=!0,t=!1,a=void 0;try{for(var n,i=s[Symbol.iterator]();!(e=(n=i.next()).done);e=!0){var o=n.value;r.push(o.charCodeAt())}}catch(l){t=!0,a=l}finally{try{!e&&i["return"]&&i["return"]()}finally{if(t)throw a}}return r}().map(function(l,i,a){return Math.round(eval((f=a.slice(0,++i)).join(_templateObject))/f.length)})))};

// Demo
document.getElementById('go').onclick=function(){
  document.getElementById('output').innerHTML = t(document.getElementById('input').value)
};
<div style="padding-left:5px;padding-right:5px;"><h2 style="font-family:sans-serif">Average of Words Snippet</h2><div><div  style="background-color:#EFEFEF;border-radius:4px;padding:10px;"><input placeholder="Text here..." style="resize:none;border:1px solid #DDD;" id="input"><button id='go'>Run!</button></div><br><div style="background-color:#EFEFEF;border-radius:4px;padding:10px;"><span style="font-family:sans-serif;">Output:</span><br><pre id="output" style="background-color:#DEDEDE;padding:1em;border-radius:2px;overflow-x:auto;"></pre></div></div></div>


0

Python 2, 106 ไบต์

มันไม่สั้นพอ เนื่องจากเป็นไพ ธ อนมันละเอียดเกินไปคุณสามารถอ่านสิ่งที่มันทำโดยดูโค้ด แต่มันก็ใช้งานได้

a=[.0]+[ord(i)for i in raw_input()]
print"".join([chr(int(.5+(sum(a[:i+1])/i)))for i in range(1,len(a))])

1
"เนื่องจากมันเป็นงูหลามมันเป็นทางที่ละเอียดเกินไป" ... ไม่ได้เปรียบเทียบกับ Java และฉันไม่เห็นด้วย verbose ที่น้อยกว่าและมันจะไม่ดีเท่าที่มันเป็น ใช้ Pyth ถ้าคุณต้องการ verbose น้อย
mbomb007

0

Matlab, 43

ใช้ฟังก์ชั่นที่ไม่ระบุชื่อ:

f=@(s)char(round(cumsum(+s)./(1:numel(s))))

ตัวอย่าง:

>> f=@(s)char(round(cumsum(+s)./(1:numel(s))))
f = 
    @(s)char(round(cumsum(+s)./(1:numel(s))))

>> f('Hello!')
ans =
HW^adY

>> f('test')
ans =
tmop

>> f('42')
ans =
43

>> f('StackExchange')
ans =
Sdccd_ccccddd

0

JavaScript ES6, 111 ไบต์

w=>w.replace(/./g,(_,i)=>String.fromCharCode([for(f of w.slice(0,++i))f.charCodeAt()].reduce((a,b)=>a+b)/i+.5))

นี่เป็นเรื่องน่ารำคาญที่ต้องขอบคุณมานานในส่วนของความยาวString.fromCharCodeและcharCodeAtฟังก์ชันของ JavaScript ตัวอย่างสแต็กมีโค้ดที่ไม่สามารถสอบได้แสดงความคิดเห็นทดสอบได้

f=function(w){
  return w.replace(/./g,function(e,i){
    return String.fromCharCode(w.slice(0,++i).split('').map(function(f){
      return f.charCodeAt()
    }).reduce(function(a,b){
      // Adds all numbers in the array
      return a+b
      // String.fromCharCode automatically floors numbers, so we add .5 to round up
    })/i+.5)
  })
}

run=function(){document.getElementById('output').innerHTML=f(document.getElementById('input').value)};document.getElementById('run').onclick=run;run()
<input type="text" id="input" value="Hello!" /><button id="run">Run</button><br />
<pre id="output"></pre>


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.