รอยเท้าทางนิเวศของซอร์สโค้ด


102

คุณเพิ่งได้รับการว่าจ้างจาก บริษัท ผู้ผลิตรถยนต์สัญชาติเยอรมัน งานแรกของคุณในฐานะวิศวกรคือการเขียนโปรแกรมที่คำนวณรอยเท้าทางนิเวศน์ของสตริง ASCII

รอยเท้าทางนิเวศน์ของตัวละครคำนวณได้ดังนี้

เขียนรหัส ASCII ของตัวละครเป็นเลขฐานสองและนับจำนวน 1

ตัวอย่างเช่นAมีรอยเท้า 2 แต่Oสกปรกกว่าด้วยรอยเท้า 5

รอยเท้าทั่วโลกของสตริงคือผลรวมของรอยเท้าของตัวละคร สตริงว่างมี footprint เป็นศูนย์

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

มีอาการสะอึก ในขณะที่ บริษัท ของคุณต้องการที่จะเข้าสู่ตลาดใหม่ด้วยกฎระเบียบด้านสิ่งแวดล้อมที่เข้มงวดคุณต้องปรับโปรแกรมของคุณเพื่อให้มันทำงานแตกต่างกันใน "โหมดทดสอบ" ดังนั้น:

โปรแกรมควรเอาต์พุต 0 เมื่อได้รับสตริงtestเป็นพารามิเตอร์

เกณฑ์การให้คะแนน

ซอร์สโค้ดที่มีรอยเท้าทางนิเวศน์น้อยที่สุดชนะ (และใช่คำตอบtestนั้นเป็นสิ่งต้องห้าม!)


36
ฉันขอโทษที่ฉันยังไม่ได้ติดตามข่าว แต่ฉันเพิ่งอ่าน เราสามารถสันนิษฐานได้ว่า บริษัท รถยนต์เยอรมันไม่ได้เรียกว่าโฟล์คสวาเกนอย่างแน่นอน
เลเวลริเวอร์เซนต์

7
สำหรับการอ้างอิงอักขระที่มีราคาแพงถึงน้อยที่สุด:\x7F}~_?{ow7yvu/s\x1F;=znm>k|OW[]^gc\x1Ex\x1D\eef\\'ZY+-VU.St\x173iNM5K6r\x0FG9:q<ljQ\x15\x13pC\aEF8IJL4\x0E21\x16RTh,X*)\x19\v&%\x1A#d\x1C\rab`!\"$(\x180\x05A\x14B\x12\x11DHP\x03\f\x06\n\t\x80\x10\x01@\x04\b\x02 \x00
Caridorc

19
@ steveverrill เป็น บริษัท สมมติ แต่ชื่อจริง ๆ แล้วเริ่มต้นด้วย V และมี W อยู่ตรงกลาง แต่ความคล้ายคลึงกันใด ๆ กับความเป็นจริงเป็นเรื่องบังเอิญเพียงอย่างน้อยบางคนก็ฟ้องเรา
Mindwin

1
ฟังก์ชั่นอนุญาต (แทนโปรแกรม)?
Luis Mendo

12
พวกเขาโกหกคุณ! 1 มีความเป็นมิตรต่อระบบนิเวศมากกว่า 0 ต้องการพิสูจน์ไหม พิมพ์ซอร์สโค้ดของคุณเป็นไบนารี่ 0 ใช้หมึกได้เกือบสองเท่าของ 1 และหากคุณใช้รหัสที่มีพื้นหลังสีเข้มพวกเขายังสิ้นเปลืองพลังงานมากขึ้นในการแสดงบนหน้าจอของคุณ (หากคุณเขียนโค้ดที่มีพื้นหลังสีขาวแสดงว่าคุณกำลังสูญเสียอิเล็กตรอนที่ให้สีขาวทั้งหมดดังนั้นโปรแกรมเมอร์ที่ใส่ใจสิ่งแวดล้อมควรใช้พื้นหลังสีดำในเครื่องมือแก้ไข) เพื่อให้เป็นมิตรกับสิ่งแวดล้อมมากขึ้นเราทุกคนควรเขียนด้วย ช่องว่าง ...
Darrel Hoffman

คำตอบ:


45

CJam, 33 31

"",AA#b:c~

มี 1130000000095000000003400000001160000000101000000011500000001100000000003400000000340000000033330000000033330000000033000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 มี 1130000000095000000003400000001160000000101000000011500000001100000000003400000000000340000000033330000000033330000000033000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

รหัสเทียบเท่า

11300000000950000000034000000011600000001010000000115000000011600000000340000000061000000003300000000420000000058000000010500000000500000000102000000009800000000490000000102000000009800000000490000000098
AA#b:c~

ซึ่งสามารถทดสอบออนไลน์ได้

วิธีนี้ใช้ได้ผล

"",  e# Push the length of the string.
AA#  e# Push 10000000000.
b    e# Turn the length into the array of its base-10000000000 digits.
:c   e# Cast each digit to character. This pushes the following:
     e# q_"test"=!*:i2fb1fb1b
~    e# Evaluate the string.

วิธีการทำงาน

q_     e# Read all input and push a copy.
"test" e# Push the string "test".
=!*    e# Check for inequality and repeat the string 0 or 1 times.
       e# This replaces input "test" with the empty string.
:i     e# Cast each character to integer
2fb    e# Replace each integer by the array of its base-2 digits.
1fb    e# Replace each array of base-2 digits by the sum of its digits.
1b     e# Add the sums of digits.

รหัสแหล่งที่มานี้มีรอยเท้าทางนิเวศน์ 75


3
ว้าวนั่นเป็นคนฉลาด ฉันเดาว่าข้อแม้คือคุณไม่สามารถเรียกใช้มันได้เนื่องจากหน่วยความจำทั้งหมดในโลกไม่สามารถถือรหัสได้ทั้งหมด
Reto Koradi

49
นั่นเป็นความไม่สะดวกเล็กน้อย คุณไม่สามารถวางราคากับธรรมชาติ
เดนนิส

เป็นเคล็ดลับที่ดี แต่ไม่ถูกต้องหากไม่สามารถเรียกใช้ได้
edc65

5
@PyRulez: ไม่ได้ทำอะไรนอกจากมันจะถูกสร้างขึ้นจากสิ่งอื่นนอกเหนือจากเรื่องและครอบครองสิ่งอื่นที่ไม่ใช่พื้นที่
vsz

5
ทำไมไม่ลองใช้ Lenguage?
jimmy23013

40

Lenguage , 0


การส่งออกอยู่ในเอกตั้งแต่ Lenguage / brainfuck ไม่มีวิธีที่สติของจำนวนเต็มพิมพ์ในฐาน 10

รหัสแหล่งที่มาจริงประกอบด้วย

22360559967824444567791709913713659826044558304969374451791514225490473373040212332757409553558758107085015797320276213515502796255082717802632399123502087743818475438512153373406931103005017157351410347278489842099128517039634739852783737052963203448945756470632484148121769939122103257063633371522287190530269279693540898545359211009781370158317748609540216376596783541124510013448091325488601732964773653391702083563797082990404753843419895799343996435988722965711513708742853668363743953430527328863418281733901770990932025503662188187254784985474815936854540100376410040743052620419372327997519047616042603909398552951490180076364164838561112002025592431155898041427468731461614504254168899805662501979953318388813759833797929243626668399650485310047043700001093878284174322463350892654886806075148010832042248607926124030339950499631072150856939786062937034833055717723216663269161130154002679878012158315587925933383341827053312086716181702533743607685576475754259877651521989944802973721727159955208722180232955193930065862370838526521351991966172723976565264862909528310162816593997640732796289501819499741414526385058421824690665542546821941125191276568479078107133076037506211133628962099403163812267452274532219562823184225236020523509355625620557197876838014050964240952738109101849512504021041103516630358995290177306585560988278630098667702211916671663291473843258785929522017507744814910480115446168939335008597569919072874897148594826036210511162928991890818427747059833051607455121463371211282760364668765311589329918870071117807132901910082663054895226456039171170783440772764031568108965851688162729239711772886386306884508520204834432674839183166053019421652064937613583258148354531835035461504442885024563141848164279928769795684221364984104923764359842286827870778678989243517189772102669283996930513577004801536579491093711362942690905779844535371088542020595945700544234301668098553671685123172583259206072965508639556627967633275762621813851479909708616154198658896714629908456913467267354690109885368211752176196164620615081464122410029328694509842558492529684841818953632659248840216891072110853731776562597900145806210691868173380612838327841104919352821441230296200143603175486627682007399030356592930049570084097858148122367

ไบต์ว่างและเทียบเท่ากับโปรแกรม Brainfuck ดังต่อไปนี้:

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

ลองมันออนไลน์บนbrainfuck.tk

ความยาวของรหัส Brainfuck นั้นน้อยมาก - สำหรับผู้เริ่มฉันได้ทำการคำนวณรอยเท้าของตัวละคร ASCII ทั้งหมด - แต่คะแนน 0 คือคะแนน 0 ...


ไม่มีทาง Lenguage รองรับไบต์ที่ว่างเปล่าจริงหรือ!
สลายตัวเบต้า

20
ฉันรู้สึกว่าคำตอบเช่นนี้ไม่แสดงความเคารพต่อสาธารณะ: มันเป็นการโกงและการเล่นเกมเป็นระบบ ... แต่นี่คือจุดรวมของความท้าทายนี้หลังจากทั้งหมด +1
edc65

1
"ผลลัพธ์ไม่พร้อมกันเนื่องจาก Lenguage / Brainfuck ไม่มีวิธีการพิมพ์จำนวนเต็มในฐาน 10" . ผมคิดว่าส่วนหนึ่งของจุด Lenguage / brainfuck ก็คือว่ามันไม่ได้มีวิธีการมีสติทำอะไร :)
อดัม

9
สิ่งนี้ไม่ได้ผลสำหรับฉันเมื่อฉันพยายามสร้างโปรแกรมของคุณใหม่จากคำจำกัดความที่คุณให้ไว้ คุณช่วยโพสต์แหล่ง Lenguage แบบเต็มเพื่อที่ฉันจะได้เห็นว่าโปรแกรมของคุณแตกต่างจากความพยายามของฉันในการสร้างมันขึ้นมาใหม่ได้อย่างไร? ;-)
Cort Ammon

1
สิ่งที่ทำให้ฉันประหลาดใจไม่ใช่ว่า Lenguage รองรับ nulls แต่คุณจัดการเพื่อสร้างโปรแกรมดังกล่าวใน BF สิงสู่ ...
Erik the Outgolfer

12

PowerShell, 337 344 304 คะแนน

PARAM([CHAR[]]$A)$A|%{$B+=([CONVERT]::TOSTRING(+$_,2)-REPLACE0).LENGTH};($B,0)[-JOIN$A-CEQ"test"]

ฉันกำลังตะโกนใส่คุณเพราะมันเป็นเรื่องถูก!

รับอินพุตเป็น$Aแล้วปลดเปลื้องเป็น char-array จากนั้นวนซ้ำสำหรับลูปของแต่ละอักขระใช้คำที่น่าขัน[convert]::ToString()เพื่อแปลงอักขระที่ตำแหน่งนั้นเป็นไบนารีแทนที่ 0 ทั้งหมดด้วยไม่มีอะไรนับความยาวแล้ว $Bเสริมว่าการ ในตอนท้ายใช้การเทียบเท่าเพื่อจัดทำดัชนีในอาร์เรย์แบบไดนามิก (เช่นถ้า$Aเป็นtestดังนั้น-CEQคือ$TRUEดังนั้นจึงจัดทำดัชนีองค์ประกอบที่สอง0)

Edit1 - กรณีทดสอบที่ถูกต้อง"TEST"
Edit2 - เขียนสองสามจุดโดยวนซ้ำตัวอักขระมากกว่าดัชนีของพวกเขาและโดยการจดจำว่า-replaceไม่จำเป็นต้องมีพารามิเตอร์ตัวที่สองหากคุณกำลังแทนที่มันโดยไม่มีอะไร


ราคาคู่เป็นมิตรกว่าคำพูดเดียวกับสิ่งแวดล้อมมากขึ้น" 00100010 ' 00100111
Jacob Krall

ส่งคืนค่าที่ไม่ถูกต้อง 0 สำหรับอินพุต"TEST"
Jacob Krall

1
@JacobKrall จับคู่ที่"ดี ได้รับการแก้ไขด้วย-CEQสำหรับตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ มันเพิ่มคะแนนเล็กน้อยเพราะฉันทำคะแนนผิด' 'เพราะฉันไม่ได้กำหนดขอบเขตอย่างถูกต้องในการทดสอบ
AdmBorkBork

9

Pyth - 52 49

สามคะแนนบันทึกด้วย @orlp

*/.BQ`1nQ"test

ใช้อินพุตในเครื่องหมายคำพูดเพื่อบันทึกรอยเท้า

Test Suite


ฮึฉันเกือบจะเหมือนคุณ แต่คำตอบของฉันคล้ายกันมากและคุณโพสต์ก่อน แทนที่@,0ด้วย*เป็น save 3 :)
orlp

1
@Maltysen คุณบอกว่าคุณพบสามจุด แต่แหล่งข่าวยังบอกด้วยว่า@,0คุณลืมเปลี่ยนหรือไม่?
ตบมือ

@ConfusedMr_C yep ฉันเพิ่งเปลี่ยนการเชื่อมโยงและลืมคำตอบที่แท้จริง
Maltysen

7

เสียงกระเพื่อมสามัญ 294 281 235

เพื่อลดคะแนนฉันใช้@(ราคา 1) และ!(ราคา 2) เป็นชื่อตัวแปร (แก้ไข: และจะดียิ่งขึ้นถ้าฉันใช้@สำหรับตัวแปรที่เกิดขึ้นมากที่สุดในฟังก์ชั่น) ฉันตะโกนมากเกินไปเพราะมันถูกกว่า

(LAMBDA(@)(IF(STRING="test"@)0(LOOP FOR ! ACROSS @ SUM(LOGCOUNT(CHAR-CODE !)))))

พริตตี้พิมพ์

(LAMBDA (@)
  (IF (STRING= "test" @) 0
      (LOOP FOR ! ACROSS @ SUM (LOGCOUNT (CHAR-CODE !)))))

คะแนนดีมากเช่น 294;)
Cabbie407

@ Cabbie407 ฉันพลาดส่วนหนึ่งเกี่ยวกับการให้คะแนนขอโทษ :-)
coredump

1
@ Cabbie407 ผมมีความรู้สึกแปลกของการมีคะแนนที่ต่ำมากสำหรับคู่ของนาทีที่ ...
coredump

1
แค่อยากให้คุณรู้เพราะรู้เกี่ยวกับวิธีการให้คะแนนคุณอาจดูโค้ดจากมุมที่ต่างออกไป และฉันเห็นคุณเปลี่ยนอะไรบางอย่างไปแล้ว
Cabbie407

1
@ Cabbie407 ฉันลืมขอบคุณ btw ขอบคุณ
coredump

6

JavaScript, 279

แก้ไขการแก้ไขข้อบกพร่อง (ไม่นับบิต 1 ของถ่านแต่ละตัว)

โปรแกรมที่สมบูรณ์พร้อมอินพุตและเอาต์พุตผ่านป๊อปอัป ทดสอบใน Firefox แล้วควรทำงานกับเบราว์เซอร์ที่ทันสมัย

B=(P=prompt)(H=D=0)
while(B!="test"&&(A=B.charCodeAt(H++)))while(A)D+=A&1,A>>=1
P(D)

เครื่องมือบางอย่าง (ทดสอบกับ Firefox)

w=c=>c.toString(2).split('').reduce(function(a,b){return a- -b})

t=[[],[],[],[],[],[],[],[],[]]
u=[[],[],[],[],[],[],[],[],[]]
for(c=1;c<256;c++)
  c<33|c>126&c<161 ? t[w(c)].push('\\'+c) : u[w(c)].push('&#'+c+';')
for(i=0; i++<8;)       
  T.innerHTML+=i+': '+u[i].concat(t[i]).join(' ')+'\n'

function Calc()
{
  var r='', t=0, b
  I.value.split('').forEach(function(c) {
    c = c.charCodeAt(), r += '\n&#'+c+' '+((256+c).toString(2).slice(1))+' : '
    for(b=0;c;c>>=1) b += c&1
    r += b, t += b
  })
  R.innerHTML='Total '+t+'\nDetail'+r
}
#I { width: 400px }
<b>Weight table</b><pre id=T></pre><br>
<b>Counter</b><br><textarea id=I></textarea><button onclick="Calc()">-></button> <pre id=R></pre>


1
คำตอบนี้ไม่ถูกต้อง - มันมีผล 17 สำหรับtestแทนที่จะเป็น 0
ASCIIThenANSI

@ASCIIThenANSI ไม่ใช่ในเบราว์เซอร์ของฉัน แต่ฉันจะตรวจสอบอีกครั้ง
edc65

มันตลกดี ... การทดสอบกับเคาน์เตอร์ของคุณฉันได้ 279 และทดสอบด้วยตัวเองฉันได้ 277 ฉันสงสัยว่าถูกต้องหรือไม่ มีบางอย่างที่เกี่ยวข้องกับการขึ้นบรรทัดใหม่หรือไม่
ETHproductions

@ETHproductions ฉันตรวจสอบซ้ำสองครั้งและจำนวนที่ถูกต้องคือ 279 แต่มันไม่ทำงานกับสตริงที่มีการขึ้นบรรทัดใหม่ - มันเป็นปัญหาที่เกี่ยวข้องกับpromptฟังก์ชั่น ใน Firefox promptแปลบรรทัดใหม่ (2 บิต) ในช่องว่าง (1 บิต) ดังนั้นเราจึงได้ 277 แทน 279
edc65

@ETHproductions ... ใน Chrome (บน Windows) ขึ้นบรรทัดใหม่จะกลายเป็นคู่ CR LF (3 บิต + 2 บิต) และการนับเป็นสิ่งที่ผิดอีกครั้ง
edc65

6

Julia, 254 246 232

P=readline()
print(P=="test"?0:sum([count_ones(1*A)for A=P]))

count_onesฟังก์ชั่นนับจำนวนของคนที่อยู่ในฐานเป็นตัวแทนของการป้อนข้อมูลของ

ลดรอยเท้าทางนิเวศน์ของฉันด้วย FryAmTheEggman!


1
ไม่มีปัญหาฉันแค่สนใจเกี่ยวกับสภาพแวดล้อมจริงๆ))
FryAmTheEggman

6

Python 3, 271

z=input();print([sum([bin(ord(i)).count("1")for i in z]),0][z=="test"])

3
การเปลี่ยนแปลงเล็กน้อยมากมายทำให้ฉัน228
FryAmTheEggman

2
ทำไมไม่ลองใช้ประโยชน์จากคนโง่ที่ว่า z=input();print(sum(bin(ord(i)).count("1")for i in z)*(z!="test")).... @ FryAmTheEggman ซวย?
NightShadeQueen

1
@NightShadeQueen ฮ่าฮ่านั่นหมายความว่าฉันไม่สามารถโพสต์ต่อวันได้หรือไม่? : X อย่างไรก็ตามมันเป็นสิ่งที่ดีมากสำหรับผู้ใช้ใหม่ในเว็บไซต์นี้ทำได้ดีมาก! อย่างไรก็ตามยินดีต้อนรับสู่ PPCG! :) นอกจากนี้หัวข้อเพิ่มเติมสามารถลบเครื่องหมายอัฒภาคได้เนื่องจากมีค่าใช้จ่ายสูงกว่าบรรทัดใหม่เล็กน้อย
FryAmTheEggman

5

Perl, 136 118 73

$_=unpack"B*";$_=y@1@@

แทนที่ทั้งหมด@ด้วย\0

ตัวอย่างการใช้งาน:

perl -p entry.pl entry.pl

5

MATLAB, 198 194 ไบต์

A=input('','s');~strcmp('test',A)*nnz(dec2bin(A)-48)

ก่อนอื่นสตริงจะอ่านจาก STDIN ผ่านinputฟังก์ชั่น testเมื่อเกิดเหตุการณ์เช่นนี้เราเปรียบเทียบสายป้อนสตริง หากผลไม่ได้ testเราแปลงตัวละครแต่ละตัวในรหัส ASCII และจากนั้นแทน binary dec2binผ่าน ผลลัพธ์ที่สวยงามของฟังก์ชันนี้คือถ้าคุณส่งสตริงการแสดงเลขฐานสองของรหัส ASCII จะถูกคั่นด้วยอักขระหนึ่งตัวต่อบรรทัด

ตัวอย่างเช่น:

>> dec2bin('ABCD')

ans =

1000001
1000010
1000011
1000100

dec2binเอาต์พุตอาร์เรย์อักขระ เมื่อสิ่งนี้เกิดขึ้นให้ลบ 48 ซึ่งเป็นรหัส ASCII สำหรับ 0 เพื่อให้เมทริกซ์ถูกแปลงเป็นdoubleประกอบด้วย 0s และ 1s หลังจากที่เกิดขึ้นการเรียกเพื่อnnzนับจำนวนองค์ประกอบที่ไม่ใช่ศูนย์ทั้งหมดในเมทริกซ์นี้ testจะทราบว่าผลนี้จะถูกคูณด้วยตรงข้ามของสตริงเปรียบเทียบกับ หากไม่เป็นสตริงtestเราจะได้รับการคำนวณรอยเท้า ถ้ามันเท่ากันการคูณจะให้ผลลัพธ์เป็น 0

ตัวอย่างบางส่วน:

>> A=input('','s');~strcmp('test',A)*nnz(dec2bin(A)-48)
A

ans =

     2

>> A=input('','s');~strcmp('test',A)*nnz(dec2bin(A)-48)
O

ans =

     5

>> A=input('','s');~strcmp('test',A)*nnz(dec2bin(A)-48)
test

ans =

     0


>> A=input('','s');~strcmp('test',A)*nnz(dec2bin(A)-48)
  %// Note - no characters were added here.  Simply pushed Enter

ans =

     0

หากคุณได้รับอนุญาตให้ใช้กล่องเครื่องมือสื่อสารคุณสามารถใช้de2biแทนและหลีกเลี่ยงการ-48ส่งไปเป็นประเภทตัวเลข (รวมถึงอักขระพิเศษ 2 ตัวในชื่อฟังก์ชัน)
บีกเกอร์

5

ทุบตี 440 430 412 405 403

A=0
[ test != "$1" ]&&for((D=0;D<${#1};D++)){
A=$((A+`bc<<<$(printf "obase=2;%d" "'${1:$D:1}")|tr -d "0
"|wc -m`))
}
echo $A

ตรงไปตรงมาสวย วนตัวอักขระในอินพุตที่แปลงเป็นลำดับแรกถึง ascii (ด้วยprintf %dและนำ'หน้าจำนวนแล้วนำไปสู่เลขฐานสอง (ด้วยbc) จะตัดค่าศูนย์และนับจำนวนอักขระ

ยังไม่ได้รับคำตอบที่ดี แต่ยังไม่เคยเห็นความพยายามทุบตี

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


1
ยินดีต้อนรับสู่ Programming Puzzles & Code Golf! 1. คุณสามารถแทนที่doด้วย{และมีdone }2. <<<นอกจากนี้คุณยังไม่จำเป็นต้องมีช่องว่างที่อยู่รอบ ๆ 3. คุณสามารถแทนที่\nด้วยตัวป้อนบรรทัดที่แท้จริง
เดนนิส

ขอบคุณ @ เดนนิส หนึ่งในความท้าทายในเว็บไซต์นี้คือการได้รับ "นิสัยดี" พวง :)
อดัม

3
แน่ใจ. หากคุณยังไม่ได้ผมขอแนะนำให้ตรวจสอบจากเคล็ดลับสำหรับการเล่นกอล์ฟในทุบตี มันเป็นทรัพยากรที่ยอดเยี่ยม
เดนนิส

3
ความท้าทายนี้แปลกแม้ตามมาตรฐานกอล์ฟ! อักขระพิเศษยังสามารถบันทึกคะแนนได้ การใช้=และ||ค่าใช้จ่าย 15 ในขณะที่ใช้!=และ&&เป็นเพียง 13! ตัวละครพิเศษ แต่ช่วยสองแต้ม ...
อดัม

5

Ceylon, 1431 , 764 , 697 , 571 , 547 , 538 , 501 , 493 , 467 , 451

shared void p(){print(sum{0,if(exists a=process.arguments[0])if(a!="test")for(c in a)for(b in 0..7)if(c.hash.get(b))1});}

นี่คือต้นฉบับที่ไม่ได้รับเกียรติ:

Integer footprintCharacter(Integer b) {
    return sum({0, for(i in 0..7) if(b.get(i)) 1 });
}
Integer footPrintString(String s) {
    if(s == "test") {return 0;}
    return sum({0, for(c in s) footprintCharacter(c.integer)});
}
shared void footprint() {
     if(exists s = process.arguments[0]) {
         print(footPrintString(s));
     } else {
         print("This program needs at least one parameter!");
     }
}

สิ่งนี้รับอาร์กิวเมนต์จากพารามิเตอร์บรรทัดคำสั่ง ... process.arguments เป็นลำดับของสตริง (อาจว่างเปล่า) ดังนั้นก่อนที่จะใช้หนึ่งในนั้นเราต้องตรวจสอบว่ามีอยู่จริงหรือไม่ ในอีกกรณีหนึ่งเราแสดงข้อความแสดงข้อผิดพลาด (ไม่จำเป็นต้องมีคำถามและจะถูกโยนทิ้งในเวอร์ชันถัดไป)

sumฟังก์ชั่นของ Ceylon ใช้Iterable ที่ไม่ว่างเปล่าของอิลิเมนต์บางประเภทที่ต้องทำให้พอใจSummableนั่นคือมีplusเมธอดเหมือน Integer (มันไม่ทำงานกับลำดับที่ว่างเปล่าเพราะ Summable แต่ละประเภทจะมีศูนย์เป็นของตัวเองและรันไทม์ไม่มีโอกาสรู้ว่าอันไหนที่มีความหมาย)

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

ลองดูว่าเราจะย่อขนาดลงได้อย่างไร ก่อนอื่นฟังก์ชั่นแต่ละอย่างจะถูกเรียกใช้ในที่เดียวดังนั้นเราจึงสามารถอินไลน์ได้ นอกจากนี้ดังกล่าวข้างต้นกำจัดข้อความแสดงข้อผิดพลาด (764 คะแนน)

shared void footprint() {
    if (exists s = process.arguments[0]) {
        if (s == "test") {
            print(0);
        } else {
            print(sum({ 0, for (c in s) sum({ 0, for (i in 0..7) if (c.integer.get(i)) 1 }) }));
        }
    }
}

เราไม่ต้องการความซ้อนกันด้านในsumเราสามารถสร้างความเข้าใจอันยิ่งใหญ่นี้ได้ (สิ่งนี้ช่วยเราประหยัด 37 จุดสำหรับรอยเท้าsum({0,})และอีกส่วนสำหรับช่องว่างซึ่งจะถูกกำจัดในตอนท้าย) นี่คือ 697:

shared void footprint() {
    if (exists s = process.arguments[0]) {
        if (s == "test") {
            print(0);
        } else {
            print(sum({ 0, for (c in s) for (i in 0..7) if (c.integer.get(i)) 1 }));
        }
    }
}

เราสามารถใช้หลักการที่คล้ายกันกับ"test"สตริงที่ใส่พิเศษ: ในกรณีที่ผลลัพธ์เป็น 0 (นั่นคือไม่มีอะไรมีส่วนร่วมกับผลรวม) เราสามารถทำสิ่งนี้เป็นส่วนหนึ่งของการรวม (แต่เราต้องสลับเงื่อนไข) . สิ่งนี้ช่วยให้เราประหยัดได้มากขึ้นการprint(0);จัดฟันบางส่วนและการเว้นวรรคเยื้องลงมาถึงรอยเท้า 571:

shared void footprint() {
    if (exists s = process.arguments[0]) {
        print(sum({ 0, if (s != "test") for (c in s) for (i in 0..7) if (c.integer.get(i)) 1 }));
    }
}

เราทำสิ่งเดียวกันนี้เป็นครั้งแรกifโดยมีผลข้างเคียงที่ตอนนี้ไม่ให้ข้อโต้แย้งออกมา0แทนที่จะทำอะไรเลย (อย่างน้อยฉันก็คิดว่ามันจะเกิดขึ้นที่นี่แทนที่จะเป็นเช่นนั้นกับวงวนนิรันดร์แทน?

shared void footprint() {
    print(sum({ 0, if (exists s = process.arguments[0]) if (s != "test") for (c in s) for (i in 0..7) if (c.integer.get(i)) 1 }));
}

เราจริงสามารถละเว้น()สำหรับsumฟังก์ชั่นที่นี่โดยใช้ไวยากรณ์ฟังก์ชั่นการโทรทางเลือกซึ่งใช้{...}แทน()และจะกรอกข้อมูลลงใน comprehensions เข้าไปในข้อโต้แย้ง iterable สิ่งนี้มีรอย 538:

shared void footprint() {
    print(sum{ 0, if (exists s = process.arguments[0]) if (s != "test") for (c in s) for (i in 0..7) if (c.integer.get(i)) 1 });
}

การแทนที่ชื่อฟังก์ชั่นfootprint(40) โดยp(3) บันทึกอีก 37 คะแนนทำให้เราถึง 501 (ชื่อฟังก์ชั่นซีลอนต้องเริ่มต้นด้วยตัวอักษรตัวพิมพ์เล็กดังนั้นเราจึงไม่สามารถรับน้อยกว่า 3 คะแนนได้ที่นี่)

shared void p() {
    print(sum{ 0, if (exists s = process.arguments[0]) if (s != "test") for (c in s) for (i in 0..7) if (c.integer.get(i)) 1 });
}

ชื่อตัวแปรs(5) และc(4), i(4) ก็ไม่เหมาะสมเช่นกัน ลองแทนที่ด้วยa(อาร์กิวเมนต์), d(หลัก?) และb(บิตดัชนี) รอยพระพุทธบาท 493:

shared void p() {
    print(sum{ 0, if (exists a = process.arguments[0]) if (a != "test") for (c in a) for (b in 0..7) if (c.integer.get(b)) 1 });
}

ฉันไม่เห็นการเพิ่มประสิทธิภาพที่ไม่ใช่ช่องว่างที่เหลืออยู่ดังนั้นให้ลบช่องว่างที่ไม่ต้องการออก (1 จุดสำหรับแต่ละพื้นที่สองสำหรับการแบ่งบรรทัดสองครั้ง):

shared void p(){print(sum{0,if(exists a=process.arguments[0])if(a!="test")for(c in a)for(b in 0..7)if(c.integer.get(b))1});}

เมื่อเรียกดู API ฉันพบว่าCharacter.hashส่งคืนค่าเดียวกันกับintegerแอตทริบิวต์ของจริง แต่มันมีเพียง 14 คะแนนแทนที่จะเป็น 30 ดังนั้นเราจึงลงไปที่ 451!

shared void p(){print(sum{0,if(exists a=process.arguments[0])if(a!="test")for(c in a)for(b in 0..7)if(c.hash.get(b))1});}

4

PowerShell, 273 336 328 324 293 288 295

PARAM($A)[CHAR[]]$A|%{$D=[INT]$_;WHILE($D){$B+=$D-BAND0X1;$D=$D-SHR1}};($B,0)[$A-CEQ"test"]

แก้ไข - ลืมกรณี 'ทดสอบ' ... มีราคาแพงมาก

แก้ไข - พลาดโอกาส UPPERCASE

editeditedit - รวมคำแนะนำการแสดงความคิดเห็น (ขอบคุณ TimmyD)

แก้ไข 4 - D เป็น varable ที่ถูกกว่า C (2 กับ 3)

แก้ไข 5 - กลับไปที่ 295 เนื่องจากการตรวจสอบขนาดตัวพิมพ์

วนรอบสตริงและนับ 1 ซึ่งถูกเลื่อนออกจากค่าอักขระ ASCII

ให้ทิปกับ TimmyD เพื่อให้ฉันมองการณ์ไกลเพื่อใช้ตัวอักษรตัวพิมพ์ใหญ่และใช้ดัชนีอาร์เรย์ในตอนท้าย


1
วิธีการที่ดี! นักกอล์ฟสองคน (ลบการเริ่มต้น $ B เนื่องจากจะเป็นการเริ่มต้นที่ศูนย์ลบ parens คู่เอาเซมิโคลอนบางส่วนออก) ทำให้เหลือ293 PARAM($A)[CHAR[]]$A|%{$C=[INT]$_;WHILE($C){$B+=$C-BAND0X1;$C=$C-SHR1}};($B,0)[$A-EQ"TEST"]
AdmBorkBork

หมายความว่าอย่างไรเมื่อฉันอ่าน "วิธีการที่ดี!" และได้ยินเสียงจาก Wii Golf? ขอบคุณสำหรับคำแนะนำ! การกำหนดค่าเริ่มต้นทำให้ฉันสะดุดเมื่อทดสอบในคอนโซล PowerShell และฉันปล่อยไว้สิ่งที่ดีที่ควรทราบ
Forty3

ใช่ - ถ้าคุณกำลังใช้คอนโซลมันเป็นสภาพแวดล้อมแบบ REPL ในตัวแปรที่กำหนดจะยังคงอยู่จากบรรทัดหนึ่งไปอีกบรรทัด หากคุณบันทึกเป็น. ps1 ดังนั้น $ B (และตัวแปรอื่น ๆ ) จะเริ่มต้นใหม่แม้ว่าคุณจะกด up-arrow-enter จากเชลล์ตัวเดียวกัน เช่นPS C:\scripts> .\ecological-footprint.ps1
AdmBorkBork

ส่งคืนค่าที่ไม่ถูกต้อง 0 สำหรับอินพุต"TEST"
Jacob Krall

1
281PARAM($A)(([CHAR[]]$A|%{$B=$_;0..9|?{[INT]$B-SHR$_-BAND1}}).LENGTH,0)[("TEST"-EQ$A)]
tomkandy


4

C, 374

เพิ่มบรรทัดใหม่ (ไม่รวมอยู่ในคะแนน) เพื่อความชัดเจน สามารถปรับปรุงเป็น 360 ได้โดยการเปลี่ยนชื่อตัวแปรเป็นตัวพิมพ์ใหญ่ แต่ฉันจะพยายามคิดอะไรที่ดีกว่า

การป้อนข้อมูลผ่าน commandline ซึ่งหมายความว่า segfaults เมื่อขาดการป้อนข้อมูล ฉันคาดว่าคะแนนที่แย่กว่านี้สำหรับการป้อนผ่าน stdin

i,t;
main(int c,char**v){
for(;c=v[i][i/8];i++)t+=(c>>i%8)&1;
printf("%d",strcmp(v[1],"test")?t:0);
}

4

PHP, 377 337 299 Ecological Footprint (ยังคงมาก) , 102 91 Bytes

ดูเหมือนว่า PHP นั้นเป็นมิตรกับสิ่งแวดล้อมในโหมดทดสอบเท่านั้น ;)

WHILE($D<STRLEN($A=$argv[1]))$B+=SUBSTR_COUNT(DECBIN(ORD($A[$D++])),1);ECHO"test"!=$A?$B:0;

ทำงานจากบรรทัดคำสั่งเช่น:

php footprint.php hello
php footprint.php test

whileเป็นมิตรกับสิ่งแวดล้อมมากกว่าที่forพวกเขาแบ่งปันจำนวนตัวละครเดียวกัน นอกจากนี้ชื่อตัวแปรตัวพิมพ์ใหญ่จะมีรอยเท้าที่ดีกว่าคู่ของตัวพิมพ์เล็ก

แก้ไข

  • บันทึก 40 คะแนนโดยใช้ชื่อฟังก์ชั่นตัวพิมพ์ใหญ่
  • บันทึก 38 คะแนนโดยใช้decbinแทนbase_convert

1
@Adam นี่คือการอภิปรายเกี่ยวกับการแจ้งและที่นี่เกี่ยวกับแท็กเปิด PHP หวังว่านี่จะเป็นประโยชน์สำหรับคุณ
แทรกที่นี่

4

VBA, 475 418

ขอบคุณยาโคบ 57 คะแนน

  • แปลง String เป็น Byte Array (128 เป็นทางลัด vba สำหรับ "แปลงสตริงจาก Unicode เป็นหน้ารหัสเริ่มต้นของระบบ" ดังนั้นจะไม่ทำงานบน Mac .... )

  • ลูปแม้ว่าอาร์เรย์ไบต์จะแปลงเป็น Binary และ Concatenating ทุกอย่างด้วยกัน

  • ตรวจสอบการทดสอบ
  • พิมพ์ความยาวของสตริงด้วย 0 ทั้งหมดแทนที่ด้วยไม่มีอะไร

VBA ทำไมคุณถึงเล่นกอล์ฟไม่ดี ... :(

SUB A(D)
DIM B() AS BYTE
B=STRCONV(D,128)
FOR P=0 TO UBOUND(B)
H=H+APPLICATION.DEC2BIN(B(P))
NEXT
IF D="test" THEN H=0
MSGBOX LEN(REPLACE(H,0,""))
ENDSUB

4
VBA ไม่คำนึงถึงขนาดตัวพิมพ์ดังนั้นคุณควรใช้ตัวพิมพ์ใหญ่ทุกที่เพื่อบันทึกจุดต่ออักขระตัวพิมพ์เล็ก! (ยกเว้น"test"แน่นอน)
Jacob Krall

4

JavaScript, 418 410

A=prompt();B=0;!A||A=="test"?0:A.split("").forEach(D=>B+=D.charCodeAt().toString(2).match(/1/g).length);alert(B)

ราคาคู่เป็นมิตรกว่าคำพูดเดียวกับสิ่งแวดล้อมมากขึ้น" 00100010 ' 00100111
Jacob Krall

3

Pyth, 64

?qz"test"0l`sS.Bz

ตรวจสอบว่าอินพุตเป็นการทดสอบหรือไม่ถ้าไม่นับจำนวน 1 ในการแทนเลขฐานสองของอินพุต


3

Haskell, 292

a 0=0
a b=rem b 2+a(div b 2)
b"test"=0
b d=sum$map(a.fromEnum)d
main=interact$show.b

ไม่มีอะไรจะพูดที่นี่: เปลี่ยนตัวละครทุกตัวให้เป็นค่า ascii ( fromEnum) และคำนวณ1s (ผ่านa) รวมผลลัพธ์ทั้งหมด


3

JavaScript (ES6), 521 478 458 449 473 465

alert(((A=prompt(),A!="test")&&(A!=""))?(A.split``.map(H=>(H.charCodeAt().toString(2).match(/1/g)||[]).length)).reduce((A,B)=>A+B):0)

นี่เป็นความพยายามครั้งแรกของฉันในการเล่นกอล์ฟ JavaScript ดังนั้นจึงอาจไม่ได้รับความนิยมมาก


เป็นที่ตกลงกันโดยทั่วไปเกี่ยวกับกอล์ฟ JavaScript ที่ต้องการรูปแบบการส่งออกอื่น ๆ โดยนัย นี่อาจเป็นการแจ้งเตือน document.write หรือแม้แต่การส่งคืนฟังก์ชัน
Mwr247

คุณสามารถย้ายการมอบหมายที่รวดเร็วของคุณไปยังคำสั่งแรกในคำสั่ง if ที่ล้อมรอบด้วยวงเล็บเพื่อบันทึกสองสามไบต์ คุณสามารถลบ '0' ใน charCodeAt นอกจากนี้การประหยัดจำนวนมากที่คุณสามารถทำได้คือการใช้ผู้ประกอบการที่ประกอบไปด้วยคำสั่ง if / else =)
Mwr247

ขอบคุณมาก! ฉันลงเอยด้วยการใช้เครื่องหมายจุลภาคแทนการเป็นพ่อแม่สำหรับการมอบหมายที่รวดเร็วแม้ว่า; มันช่วยประหยัดไบต์อื่น (: @ Mwr247
Zach Gates

s.split ('') สามารถเป็น s.split`` ได้แทน 2 ไบต์
Dendrobium

1
ความคิดเห็นของ Dendrobium ด้านบน @JacobKrall
Zach Gates

3

ทับทิม, 316 313

ตรงไปตรงมามากมองหาความเป็นไปได้ในการเล่นกอล์ฟเพิ่มเติม:

b=gets.chomp;b=='test'?0:b.chars.map{|i|i.ord.to_s(2).count('1')}.inject(:+)
  • ใช้bแทนxการบันทึก 3 คะแนน

คุณสามารถใช้$*[0]แทนgets.chomp(รับอินพุตเป็นอาร์กิวเมนต์บรรทัดคำสั่ง)
Mhmd

ราคาคู่เป็นมิตรกว่าคำพูดเดียวกับสิ่งแวดล้อมมากขึ้น" 00100010 ' 00100111
Jacob Krall

ชื่อตัวแปรตัวพิมพ์ใหญ่ยังเป็นมิตรกับสิ่งแวดล้อมมากกว่าตัวพิมพ์เล็กที่เท่ากัน Hดีกว่าIด้วยเหตุผลเดียวกัน
Jacob Krall

3

Python 2, 294 281 269 266

A=input()
print sum(format(ord(H),"b").count("1")for H in A)if A!="test"else 0

พอร์ตของคำตอบ Pyth ของฉันด้านบน

รับอินพุตเป็นสตริง (พร้อมเครื่องหมายคำพูด):

"ABC"

1
ราคาคู่เป็นมิตรกว่าคำพูดเดียวกับสิ่งแวดล้อมมากขึ้น" 00100010 ' 00100111
Jacob Krall

การปรับเปลี่ยนพื้นฐานสองสามอย่างนี้ลงไปA=input();print[sum(bin(ord(H)).count("1")for H in A),0][A=="test"]ด้วยคะแนน 243
Kade


2

Pyth, 96

Iqz"test"0.q)/j""m.BdmCdz\1

พอร์ตของคำตอบ CJam ของฉันด้านบน / ล่าง


เพียงบางส่วน Pyth หมายเหตุทั่วไป: แทนการIพยายามที่จะใช้ ternary ?แต่ในกรณีนี้เนื่องจากเป็นบูลคุณก็สามารถใช้*(หลังจากเปลี่ยนnแทนq) kโดยอัตโนมัติ""และในสายเป็นเดียวกันs jkหวังว่าคุณจะสนุกกับการเรียนรู้ pyth! :)
FryAmTheEggman

นี่เป็นคำตอบ Pyth แรกของฉัน: P มันยากพอที่จะได้มาฮ่าฮ่าสนุก ขอบคุณสำหรับเคล็ดลับ! @FryAmTheEggman
Zach Gates

2

CJam, 83 81 79 77

ดีที่สุดหลังจากลองใช้ชุดรูปแบบต่าง ๆ :

l0$"test"=!\:i2fbe_1b*

ลองออนไลน์

คำอธิบาย:

l       Get input. Other options like q and r are the same number of bits.
0$      Copy input for comparison. This saves 2 bits over _.
"test"  Push special case string.
=       Compare.
!       Negate so that we have 0 for special case, 1 for normal case.
\       Swap input string to top.
:i      Convert characters to integers.
2fb     Apply conversion to base 2 to all values.
e_      Flatten array.
1b      Sum up the bits. This is 2 bits shorter than :+.
*       Multiply with result from special case test.

2

ทับทิม, 247

dวิธีการตรงไปตรงมาวนรอบผ่านไบต์ทั้งหมดของการป้อนข้อมูลและบิตทั้งหมดในแต่ละไบต์ข้อสรุปให้กับตัวแปร

dถูกกำหนดค่าเริ่มต้นเป็น -2 เนื่องจากhมีการขึ้นบรรทัดใหม่จากอินพุต (มูลค่า 2 บิต) และเราไม่ต้องการนับมัน

ในทำนองเดียวกันhจะมีtestการขึ้นบรรทัดใหม่ต่อท้ายดังนั้นการขึ้นบรรทัดใหม่จะต้องรวมอยู่ในค่าการเปรียบเทียบ

d=-2
h=gets
h.bytes{|a|8.times{|b|d+=a>>b&1}}
p h=='test
'?0:d

2

R, 279

sum(as.integer(rawToBits(charToRaw(if((s=readline())=='test')''else s))))

สวยด้วยตนเองอธิบาย
แบบทดสอบ:

> sum(as.integer(rawToBits(charToRaw(if((s=readline())=='test')''else s))))
sum(as.integer(rawToBits(charToRaw(if((s=readline())=='test')''else s))))
[1] 279
> sum(as.integer(rawToBits(charToRaw(if((s=readline())=='test')''else s))))
A
[1] 2
> sum(as.integer(rawToBits(charToRaw(if((s=readline())=='test')''else s))))
O
[1] 5
> sum(as.integer(rawToBits(charToRaw(if((s=readline())=='test')''else s))))
test
[1] 0
> sum(as.integer(rawToBits(charToRaw(if((s=readline())=='test')''else s))))
OAO
[1] 12

2

C, 378 footprint, 98 bytes

โซลูชัน C อื่น:

s;main(c,a)char**a;{for(s=-17*!strcmp(a[1],"test");c=*a[1]++;)for(;c;s+=c&1,c/=2);printf("%d",s);}

วิธีการทำงานนี้คือว่า s ถูกเริ่มต้นเป็น 0 โดยปกติ แต่จะกลายเป็น -17 ถ้าอาร์กิวเมนต์บรรทัดคำสั่งคือ "test" (strcmp ส่งกลับ 0 ในสตริงที่เท่ากันและไม่เป็นศูนย์ในสตริงที่แตกต่างกันดังนั้น inverting ให้ 1 ถ้าสตริง คือ "ทดสอบ") หมายเลข -17 ได้รับเลือกให้ชดเชยรอยเท้า 17 ซึ่งจะคำนวณสำหรับ "ทดสอบ" การคำนวณรอยเท้านั้นทำได้ง่ายด้วยตัวดำเนินการบิต

Snap! ตอนแรกฉันพลาด "footprint ที่สั้นที่สุดที่ชนะ" ดังนั้นฉันจึงตั้งเป้ารหัสที่สั้นที่สุด ... ฉันจะดูว่าฉันสามารถทำให้ "footprint" เล็กลงได้ไหม


2

Java, 594

class A{public static void main(String[]P){Integer D,H;for(D=H=0;D<P[0].length();)H+=D.bitCount(P[0].charAt(D++));System.out.print(P[0].equals("test")?0:H);}}

Java ไม่ได้เป็นสีเขียวมาก

เวอร์ชันที่ไม่ถูกปรับแต่ง:

class A {
    public static void main(String[]P) {
        Integer D,H;
        for(D=H=0;D<P[0].length();)
            H+=D.bitCount(P[0].charAt(D++));
        System.out.print(P[0].equals("test")?0:H);
    }
}

Dได้รับการประกาศให้เป็นวิธีที่Integerเราสามารถเข้าถึงวิธีการIntegerคงที่bitCountในลักษณะที่เป็นมิตรกับสิ่งแวดล้อม bitCountวิธีการปฏิบัติต่อcharในฐานะที่เป็นจำนวนเต็มและส่งกลับจำนวนบิตที่กำหนด


1
การเปรียบเทียบที่น่าสนใจของ Java กับ Ceylon ... Java มีค่าใช้จ่ายบางส่วนเนื่องจากส่วนที่ต้มและคำสั่งพิมพ์ที่ยาวกว่า bitCount ช่วยได้แม้ว่า Ceylon ไม่มีสิ่งนี้ Ceylon มีวิธีที่ยาวกว่าในการเข้าถึงพารามิเตอร์บรรทัดคำสั่งและยังต้องตรวจสอบว่าได้รับจริงหรือไม่ (ที่ซึ่งโปรแกรมของคุณจะใส่ ฟังก์ชันผลรวมของ Ceylon นั้นสั้นกว่าการเพิ่มด้วยตนเองใน Ceylon (แต่ Java ไม่มีความเข้าใจดังนั้นการเพิ่มด้วยตนเองจะดีกว่าการสร้าง Iterable ด้วยตัวคุณเอง)
Paŭlo Ebermann
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.