คำนวณน้ำหนักแฮมมีน้ำหนักแฮมต่ำ


19

สร้างโปรแกรมที่คำนวณน้ำหนักการขัดขวางของสตริง ผู้ชนะคือโปรแกรมที่มีน้ำหนักแฮมมิ่งต่ำสุด

กฎ:

  • การรับน้ำหนักของตัวอักษร ASCII ถูกกำหนดเป็นจำนวนบิตทั้งหมดที่ตั้งค่าไว้1ในการเป็นตัวแทนไบนารี
  • สมมติว่าการเข้ารหัสอินพุตเป็น 7 บิต ASCII ผ่านสิ่งที่กลไกการป้อนข้อมูลเป็นเรื่องปกติสำหรับภาษาของคุณ (เช่น stdin, args ฯลฯ )
  • เอาท์พุทผลลัพธ์เป็นตัวเลขเพื่อ stdout หรือกลไกเอาต์พุตปกติ / ปกติที่ภาษาของคุณใช้
  • มันควรจะไปโดยไม่บอก แต่คุณต้องสามารถเรียกใช้โปรแกรมในชีวิตจริงเพื่อให้เป็นทางออกที่ถูกต้อง
  • ผู้ชนะคือคำตอบที่มีรหัสน้ำหนักต่ำสุด
  • ขออภัยไม่มีวิธีแก้ไขในช่องว่างสำหรับอันนี้! ตกลงคุณสามารถเขียนโค้ดในช่องว่างขณะนี้ฉันได้แยกกฎออกแล้ว :)

ตัวอย่างต่อตัวละคร:

char |  binary  | weight
-----+----------+-------
a    | 01100001 | 3
x    | 01111000 | 4
?    | 00111111 | 6
\x00 | 00000000 | 0
\x7F | 01111111 | 7

ถ้าเราใช้0x20/ ASCII 32 เป็นข้อมูลอ้างอิงน้ำหนักที่ไม่น่าจะเป็นhello world10 แทนที่จะเป็น 11
Cristian Lupascu

ทำไมน้ำหนักhello world11 มีอักขระเพียง 10 ตัวที่แตกต่างจากช่องว่าง นอกจากนี้ - น้ำหนัก Hamming ของโปรแกรมดูเหมือนจะเป็นเพียงความยาวไม่รวมช่องว่าง ไม่แตกต่างจากรหัสกอล์ฟทั่วไป
ugoren

ขออภัยฉันเมาอย่างเต็มที่ บทความการเพิ่มน้ำหนักของ Wikipedia นั้นทำให้เข้าใจผิดและฉันก็ทำตามกฏกติกาทั้งหมด เขียนใหม่ทันที อัปเดต:โอเคเขียนใหม่เพื่อกำหนดเป็นจำนวนบิตที่ตั้งค่าเป็น 1 ในสตริง ASCII ขออภัยสำหรับสกรู
พหุนาม

@ugoren โซลูชันที่มีอักขระ ASCII ที่ต่ำกว่ามีน้ำหนักการแฮ็กที่ต่ำกว่า
พหุนาม

1
ตอนนี้มันสมเหตุสมผลแล้ว การใช้ตัวพิมพ์ใหญ่ระวังและ~ o
ugoren

คำตอบ:



8

J น้ำหนัก 34

+/,#:a.i.

การใช้งาน - วางสตริงที่จะวัดในเครื่องหมายคำพูดในตอนท้าย:

   +/,#:a.i.'+/,#:a.i.'
34

อีกวิธีหนึ่งคือรับข้อมูลจากแป้นพิมพ์ (น้ำหนัก 54):

   +/,#:a.i.1!:1[1
hello
21

มีทางเดียวเท่านั้นที่จะเขียนนี้ :) เป็น
ephemient

ไม่ ... ฉันพบวิธีแก้ปัญหาที่มีน้ำหนักแฮมมิงต่ำกว่าหนึ่งตัว
Junıʇǝɥʇuʎs

ไม่พยายามเป็น buzzkill แต่กฎจะขอโปรแกรมไม่ใช่ส่วน
FUZxxl

5

J , 39

+/,#:a.i:]

นี่คือฟังก์ชั่นรับหนึ่งอาร์กิวเมนต์ (หรือแทนที่]ด้วยสตริงโดยตรงเช่นเดียวกับกาเร็ ธ โน้ตซึ่งจะทำให้ราคาลดลงถึง 34)

   + /, #: ai:] 'สวัสดีชาวโลก'
45
   + /, #: ai:] '+ /, #: ai:]'
39

จิตใจดีคิดเหมือนกัน. :-)
Gareth

5

Python, 189

print sum(bin(ord(A)).count("1")for A in raw_input())

2
Python 3 ที่เทียบเท่าprint(sum(bin(ord(A)).count('1')for A in input()))มีคะแนน 180
dan04

4
@ dan04: ใช้เครื่องหมายคำพูดคู่แทน Single สำหรับ 176
Keith Randall

5

QBasic, 322 311 286 264

H$=COMMAND$
FOR A=1 TO LEN(H$)
B=ASC(MID$(H$,A,1))
WHILE B>0
D=D+B MOD 2
B=B\2
WEND
NEXT
?D

ชนิดของเครื่องมือที่เหมาะสมสำหรับงานยังคงแย่แน่นอน


1
+1 สำหรับการใช้ภาษาที่ฉันโปรดปรานตลอดกาล เป็นภาษาแรกที่ฉันเรียนรู้ที่จะเขียนโค้ดลงบนพีซี
พหุนาม

5

เอก 0

คุณทุกคนรู้ว่ามันกำลังมา โปรแกรม BrainFuck แรก:

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

ฉันเพิ่มบรรทัดใหม่เพื่อให้ "อ่านได้" แต่มีน้ำหนักของ Hamming ที่ 4066 มันทำงานโดยการรับผลหาร / เศษของสตริงป้อนข้อมูลซ้ำ ๆ และเพิ่มส่วนที่เหลือทั้งหมด แน่นอนคุณควรรันด้วยตัวเองคุณจะได้รับ: 226 (4066% 256) (ทางเทคนิค \ xe2) ดังนั้นชัดเจนว่ามันเป็นกฎของผู้ชนะ

ตอนนี้เราแปลงเป็น Unary และรับ

000 ... 9*google^5.9 0's ... 000

เราใช้การติดตั้งที่ไม่เป็นเอกภาพกับอักขระ NULL \ x00 สำหรับ '0' และบูมลดน้ำหนักเป็น 0

คำถามโบนัส : สำหรับอักขระ ASCII cใดที่คุณสามารถเรียกใช้โปรแกรมนี้บนสตริงที่ประกอบด้วยNrepitions และให้มันส่งออกอักขระนั้น (EG สตริง 32 ช่องว่างให้ช่องว่าง) ค่าของNงานอะไร(ไม่ว่าจะเป็นจำนวนอนันต์จะใช้งานได้หรือไม่มีเลย)


1
ฉันไม่แน่ใจว่าฉันเข้าใจโซลูชันนี้ โปรแกรม brainfuck มีน้ำหนักที่ใหญ่มาก Unary ยอมรับไบต์ว่างเป็นโปรแกรมหรือไม่หรือคุณจะต้องใช้ Unary อีกครั้ง หากเป็นแบบหลังนั่นไม่ใช่วิธีแก้ปัญหาที่ถูกต้อง - ใคร ๆ ก็สามารถพูดได้ว่า "ฉันกำหนดภาษาการเขียนโปรแกรมโดยที่ไบต์อินพุตเดี่ยวให้ {ผลลัพธ์}" และชนะการแข่งขันกอล์ฟทุกรหัสบนเว็บไซต์
พหุนาม

1
ตัวละคร null จะไม่เป็นไร สิ่งที่คุณต้องมีคือ EOF เพื่อบอกหยุดนับ ในความเป็นจริงนี่คือบางส่วนหลอก -C ที่จะอ่านไฟล์นั้น: main(){ bignum Unarynum = 0; int c; while(EOF!=(c=readchar())){ Unarynum++; } return Unarynum; }ไม่สำคัญเลยว่าคุณเลือกให้เป็นยูนารีของคุณ (ตราบใดที่ไม่ใช่ EOF)
walpen

1
ดีที่นี่เป็นเอกไปที่ C คอมไพเลอร์ที่ใช้งานได้ดีกับตัวละคร null: ideone.com/MIvAg แน่นอนว่าไฟล์ที่จำเป็นสำหรับการสร้างโปรแกรมนี้จะไม่เหมาะกับจักรวาล แต่เรามีความสามารถในการรัน
walpen

3
หากคุณไม่สามารถเรียกใช้งานได้จริง ๆมันก็ไม่ใช่ทางออก
พหุนาม

4
ดังที่คาร์ลเซแกนเคยกล่าวไว้ว่า: "หากคุณต้องการคำนวณน้ำหนักการบดของสตริงคุณต้องประดิษฐ์จักรวาล 10 ^ 500 ครั้งแรก" (พันล้านและพันล้านคู่)
walpen

4

C, น้ำหนัก322 263 256

น้ำหนักของแฮมที่น้ำหนักของแฮมที่นับได้หรือไม่

main(D,H,A)char*A,**H;{for(A=*++H;*A;A+=!(*A/=2))D+=*A%2;printf("%d",D-2);}

ใช้เทคนิคการตีกอล์ฟที่ได้มาตรฐานเป็นส่วนใหญ่
ลูปเดี่ยวจะคำนวณน้ำหนัก (เลื่อนไปทางขวาและเพิ่มจนกระทั่งเป็นศูนย์) และสแกนสตริง (เลื่อนตัวชี้เมื่อถึงศูนย์)
สมมติว่าDเริ่มต้นได้ถึง 2 (พารามิเตอร์เดียว)

การปรับน้ำหนักเฉพาะ Hamming ให้เหมาะสม:
1. ABDHโดยใช้น้ำหนัก 2 ตัวสำหรับชื่อ
2. ต้องการมากกว่า*++HH[1]


ฮ่าฮ่าฉันไม่เข้าใจประโยคแรกของคุณจนตอนนี้
breadbox

คุณจะได้รับคะแนนลงไปที่ 230 โดยแสดงผลลัพธ์เป็นหมายเลขunary :main(D,H,A)char*A,**H;{for(A=*++H;*A;A+=!(*A/=2))if(*A%2)printf("@");}
schnaader

@ Schnaader ฉันไม่เคยรู้ว่า@เป็นตัวเลขในระบบเอก ฉันคิดว่ามันใช้เพียง..0 0แต่ถ้าคุณต้องการที่จะไปทางprintf("@"+*a%2)นี้จะสั้นกว่า
ugoren

@ugoren: ขึ้นอยู่กับการประชุม / ความหมายของเอกภาพ เช่นen.wikipedia.org/wiki/Unary_numeral_systemใช้เครื่องหมายนับและกล่าวว่า "ไม่มีสัญลักษณ์ชัดเจนที่แสดงถึงศูนย์ใน unary เหมือนที่มีอยู่ในฐานดั้งเดิมอื่น ๆ "
schnaader

@chnaader ตกลง แต่ฉันคิดว่ามันยืดความต้องการ "เป็นตัวเลข" มากเกินไป
ugoren

4

Golfscript 84 72 58

{2base~}%{+}*

(ขอบคุณ Howard และ Peter Taylor สำหรับความช่วยเหลือของพวกเขา)

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

ในกรณีที่คุณเรียกใช้จากบรรทัดคำสั่งตรวจสอบให้แน่ใจว่าคุณใช้echo -nมิฉะนั้นบรรทัดใหม่ต่อท้ายจะถูกนับด้วย

เอาท์พุท:พิมพ์ค่าน้ำหนัก hamming ไปยังคอนโซล

โปรแกรมที่สามารถทดสอบได้ที่นี่


1
Golfscript เป็นตัวพิมพ์เล็กหรือไม่ ถ้าไม่ได้คุณสามารถบันทึกไม่กี่บิตโดยใช้แทนBASE อัปเดต:เพิ่งทำเครื่องหมายไม่ทำงาน ทางออกที่ดี :)baseBASE
พหุนาม

@ Polynomial ฉันลองแล้วหลังจากได้เห็นTEST/ testความคิดเห็นของคุณ:) แต่มันไม่ทำงาน
Cristian Lupascu

คุณสามารถกำจัดได้{...}2*โดยสมัคร2base~ในครั้งแรก รับคะแนนลงเป็น 72
Howard

@ ขอขอบคุณสำหรับเคล็ดลับที่ยอดเยี่ยมนี้! ฉันใช้มันในคำตอบของฉัน
Cristian Lupascu

กลไกการทดสอบของคุณผิดเพราะคุณลืมข้อ จำกัด ที่สำคัญของหน้าเว็บ GolfScript ของคุณ คุณควรมีข้อความ;ก่อนหน้าสตริงที่คุณใช้แทน stdin ดังนั้นจึง(;ไม่จำเป็น จากนั้นข้อสังเกตของฮาวเวิร์ดก็ลดลงเหลือ 65
ปีเตอร์เทย์เลอร์

2

Perl, 80 (22 ตัวอักษร)

เสร็จแล้ว:

perl -0777nE 'say unpack"%32B*"'

หรือนี่คือรุ่นสำรองที่มีน้ำหนัก 77 (21 ตัวอักษร):

perl -0777pE '$_=unpack"%32B*"'

ฉันไม่ชอบเวอร์ชันนั้นมากนักเนื่องจากผลลัพธ์ของมันไม่ตรงกับบรรทัดใหม่สุดท้าย

ในการคำนวณน้ำหนักฉันสมมติว่าฉันนับตัวอักษรในแบบปกติ (ยกเว้นperl -e/ -Eแต่รวมถึงตัวเลือกอื่น ๆ ) ถ้าด้วยเหตุผลบางอย่างที่ผู้คนบ่นเกี่ยวกับเรื่องนี้สิ่งที่ดีที่สุดที่ฉันสามารถทำได้โดยไม่มีตัวเลือกคือ 90 (26 ตัวอักษร):

$/=$,,say unpack"%32B*",<>

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

$ perl -0777nE 'say unpack"%32b*"' rickroll.txt
7071

ความเจริญ


2

Pyth - 15

คำเตือน: คำตอบนี้ไม่มีสิทธิ์ที่จะชนะเนื่องจาก Pyth อายุน้อยกว่าความท้าทายนี้

ใช้.Bสำหรับการแสดงไบนารีและนับจำนวนของ"1"'s

/.BQ\1

จะเข้าในสายที่จะบันทึกในเมื่อเทียบกับzQ

ลองมันออนไลน์ได้ที่นี่


1

สกาล่า 231

readLine().map(_.toInt.toBinaryString).flatten.map(_.toInt-48)sum

รหัสที่ได้มา:

"""readLine().map(_.toInt.toBinaryString).flatten.map(_.toInt-48)sum""".map(_.toInt.toBinaryString).flatten.map(_.toInt-48)sum

ด้วยการดัดแปลง selftesting


มีน้ำหนัก 495 ไม่ใช่ 231 คุณไม่สามารถรับน้ำหนัก 231 กับ 126 ตัวอักษร - นั่นคือค่าเฉลี่ยน้อยกว่า 2 และตัวอักษรที่พิมพ์ได้ทั้งหมด (ยกเว้น@และพื้นที่ที่คุณไม่ได้ใช้) มีน้ำหนัก 2 อย่างน้อย
ugoren

1
@ugoren: แต่มันก็แค่ 65 ตัวอักษร โปรแกรมจะถูกพิมพ์เกือบสองครั้ง: เมื่อรหัสในการคำนวณน้ำหนัก hamming และครั้งที่สองเป็นสัญญาณเข้าแบบคงที่เพื่อคำนวณมันสำหรับโปรแกรม แต่ส่วนการคำนวณขาด "readLine ()" ข้างหน้าเพราะใช้อินพุตตามตัวอักษร ฉันพยายามชี้แจงคำตอบเอง
ผู้ใช้ที่ไม่รู้จัก

1

Java, น้ำหนัก931 774 499 454

ฉันคิดว่านี่เป็นคำตอบเดียวในขณะนี้ที่มีน้ำหนักมากกว่า 300

class H{public static void main(String[]A){System.out.print(new java.math.BigInteger(A[0].getBytes()).bitCount());}}

ต้องการอินพุตเป็นอาร์กิวเมนต์บรรทัดคำสั่ง


1

GNU sed -r , 467 + 1

(+1 สำหรับการใช้-r- หรือควรเป็น +4 หรือไม่)

เอาต์พุตเป็นค่า unary ต่อบรรทัดซอร์ส | tr -d "\n" | wc -cการแปลงรวมทศนิยมเอาท์พุทเปลี่ยนเส้นทางเข้า นับอักขระ ASCII ที่พิมพ์ได้ทั้งหมด (32-126), บวกกับตัวป้อนบรรทัด (10)

s@[a-z]@\U& @g
s@[?{}~]@      @g
s@[][/7;=>OW|^]@     @g
s@[-'+.3569:<GKMNSUVYZ\\]@    @g
s@[#%&)*,CEFIJL1248ORTX]@   @g
s@$|[!"$(ABDH0P`]@  @g
y! @!11!

เป็นการยากที่จะหลีกเลี่ยงการแสดงรายการอักขระทั้งหมด แต่เราสามารถลดการสังเกตนี้ได้ว่าตัวอักษรตัวเล็กมีน้ำหนัก Hamming มากกว่าหนึ่งตัวอักษรตัวพิมพ์ใหญ่ที่สอดคล้องกัน เราต้องการบรรทัดใหม่ (คะแนน 2) มากกว่าอัฒภาค (คะแนน 5) เป็นตัวคั่นคำสั่ง เราชอบ@(คะแนน 1) หรือ! (คะแนน 2) มากกว่า/(คะแนน 5) เป็นตัวคั่นรูปแบบ

หมายเหตุ - เพื่อให้ได้ชุดของอักขระที่ถูกต้องฉันสร้างตารางนี้จากหนึ่งในman asciiเรียงตามน้ำหนัก เพียงเพิ่มคะแนนที่ถูกต้องและด้านล่างเพื่อรับน้ำหนักโดยรวมของตัวละครแต่ละตัว:

   2 4   3 5 6   7 
   ---  ------   - 
0:   @   0 P `   p |0

1: ! A   1 Q a   q | 
2: " B   2 R b   r |1
4: $ D   4 T d   t | 
8: ( H   8 X h   x | 

3: # C   3 S c   s | 
5: % E   5 U e   u | 
6: & F   6 V f   v |2
9: ) I   9 Y i   y | 
A: * J   : Z j   z | 
C: , L   < \ l   | | 

7: ´ G   7 W g   w | 
B: + K   ; [ k   { |3
D: - M   = ] m   } | 
E: . N   > ^ n   ~ | 

F: / O   ? _ o     |4
   ---  ------   -  
    1      2     3

สิ่งนี้อาจเป็นประโยชน์ต่อผู้อื่น


0

Julia 262 268

เวอร์ชั่นที่แก้ไขใช้ฟังก์ชั่น 'count_ones' ที่สะดวกสำหรับการบันทึก 6 (262)

show(mapreduce(x->count_ones(x),+,map(x->int(x),collect(ARGS[1]))))

เวอร์ชั่นเก่าที่ไม่มีฟังก์ชั่นนับเดียว (268)

show(mapreduce(x->int(x)-48,+,mapreduce(x->bits(x),*,collect(ARGS[1]))))

ใช้อาร์กิวเมนต์บรรทัดคำสั่งสำหรับอินพุต


0

CJam 52 หรือ 48

ถ้าอินพุตไม่ได้อยู่ในสแต็ก (52)

q:i2fbs:s:i:+

ถ้าอินพุตอยู่บนสแต็ก (48)

:i2fbs:s:i:+

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

"Hello World":i2fbs:s:i:+

0

Julia, HW 199

H=mapreduce;H(B->B=='1',+,H(P->bits(P),*,collect(A[:])))

กับ

A="H=mapreduce;H(B->B=='1',+,H(P->bits(P),*,collect(A[:])))"

หรือโดยการแทรกสตริงโดยตรง:

julia> H=mapreduce;H(B->B=='1',+,H(P->bits(P),*,collect("H=mapreduce;H(B->B=='1',+,H(P->bits(P),*,collect(A[:])))")))
199

รุ่นที่ไม่ดี (HW 411) มีลักษณะเช่นนี้:

bitstring=mapreduce(x->bits(x),*,collect(teststring[:]))
mapreduce(checkbit->checkbit=='1',+,bitstring)

และเพื่อความสนุกของมันนี่คือรุ่นที่ได้รับการปรับปรุง (Hamming Weight 231 ) ของ bakerg ในการแก้ปัญหา:

A=mapreduce;show(A(B->int(B)-48,+,A(B->bits(B),*,collect(H[:]))))

กับ

H="A=mapreduce;show(A(B->int(B)-48,+,A(B->bits(B),*,collect(H[:]))))"

0

HPPPL (ภาษาการเขียนโปรแกรม HP Prime), 74

sum(hamdist(ASC(a),0))

เครื่องคิดเลขกราฟ HP Prime มีฟังก์ชัน hamdist () ในตัว น้ำหนักการขัดขวางของตัวละครแต่ละตัวเท่ากันกับระยะการรับส่งข้อมูลจาก 0

ASC (สตริง) สร้างอาร์เรย์ของค่า ASCII ของอักขระแต่ละตัวในสตริง

hamdist (ค่า 0) คำนวณระยะการแฮ็มจาก 0 สำหรับแต่ละค่า ASCII

sum () สรุปค่าทั้งหมด

การคำนวณน้ำหนัก hamming ของซอร์สโค้ดของตนเอง:

น้ำหนักของ HPPPL


0

05AB1Eน้ำหนัก 17 (4 ไบต์ )

ÇbSO

ลองมันออนไลน์หรือตรวจสอบกรณีทดสอบบางมากขึ้น

คำอธิบาย:

Ç       # Convert the characters in the (implicit) input to their ASCII decimal values
        #  i.e. "Test" → [84,101,115,116]
 b      # Convert those values to binary
        #  i.e. [84,101,115,116] → ["1010100","1100101","1110011","1110100"]
  S     # Split it into a list of 0s and 1s (implicitly flattens)
        #  i.e. ["1010100","1100101","1110011","1110100"]
        #   → [1,0,1,0,1,0,0,1,1,0,0,1,0,1,1,1,1,0,0,1,1,1,1,1,0,1,0,0]
   O    # Sum those (and output implicitly)
        #  i.e. [1,0,1,0,1,0,0,1,1,0,0,1,0,1,1,1,1,0,0,1,1,1,1,1,0,1,0,0] → 16

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