การเพิ่มโดยไม่ต้องใช้เครื่องหมาย + หรือ -


24

ก่อนหน้านี้มีความท้าทายมากมาย "Do __ ปราศจาก_ _" แต่ฉันหวังว่านี่จะเป็นหนึ่งในความท้าทายที่สุด

ความท้าทาย

คุณต้องเขียนโปรแกรมที่รับจำนวนธรรมชาติสองตัว (จำนวนเต็ม> 0) จาก STDIN และพิมพ์ผลรวมของตัวเลขสองตัวไปยัง STDOUT ความท้าทายคือคุณต้องใช้จำนวนน้อยที่สุด+และใช้-สัญลักษณ์มากที่สุด คุณไม่ได้รับอนุญาตให้ใช้ฟังก์ชั่นผลรวมหรือการปฏิเสธใด ๆ

ตัวอย่าง

อินพุต

123
468

เอาท์พุต

591

อินพุต

702
720

เอาท์พุต

1422

Tie Breaker: หากทั้งสองโปรแกรมมีจำนวน+และ-ตัวอักษรเท่ากันผู้ชนะคือบุคคลที่มีจำนวนน้อย/ * ( ) = . ,และ0-9ตัวอักษร

ไม่อนุญาต:ภาษาที่ตัวดำเนินการการบวก / การลบและการเพิ่ม / ลดมาตรฐานเป็นสัญลักษณ์อื่นนอกเหนือจาก+หรือ-ไม่ได้รับอนุญาต ซึ่งหมายความว่าไม่อนุญาตให้ใช้ช่องว่างกับภาษา


1
บางทีความท้าทายนี้ง่ายกว่าที่ฉันคิดไว้มากโดยเฉพาะในภาษาอื่นที่มีฟังก์ชั่นรวม () ฉันต้องแก้ไขสิ่งนี้
PhiNotPi

50
100 ค่าหัวแทนใครก็ได้ที่สามารถทำได้ใน Brainfuck
Peter Olson

3
@ Peter Olson เอาล่ะฉันคิดว่า BF จะไม่สมบูรณ์ถ้าไม่มี+หรือ-...
FUZxxl

3
เพียงเพื่อชี้แจงความท้าทายนี้ไม่สนใจเกี่ยวกับความยาวรหัสใช่มั้ย เพียง แต่จำนวนของ+, -และเบรกเกอร์ผูกตัวละคร? ... หรือคุณจำเป็นต้องเปลี่ยนกฎอีกครั้ง :-)
ทอมมี่

@ ทอมมี่ไม่มันไม่ได้
PhiNotPi

คำตอบ:


29

Perl (ไม่มี +/-, ไม่มีไทเบรคเกอร์, 29 ตัวอักษร)

s!!xx!;s!x!$"x<>!eg;say y!!!c

เป็นโบนัสที่คุณสามารถทำให้ผลรวมรหัสมากกว่าตัวเลขสองโดยการเพิ่มมากขึ้นxs s!!xx!ไป

หรืออีกวิธีหนึ่งคือโซลูชัน 21 ตัวที่มี 1 และ 3 ตัวแบ่งเบรกเกอร์ตามลำดับ

say length$"x<>.$"x<>

say log exp(<>)*exp<>

หมายเหตุ: การแก้ปัญหาเหล่านี้ใช้sayฟังก์ชั่นที่มีอยู่ตั้งแต่ Perl 5.10.0 กับสวิตช์บรรทัดคำสั่งหรือ-E use 5.010ดูประวัติการแก้ไขของคำตอบนี้สำหรับรุ่นที่ทำงานกับ perls รุ่นเก่า


วิธีการแก้ปัญหาที่ไม่มีตัวแบ่งเบรกเกอร์ทำงานอย่างไร

  • s!!xx!เป็นผู้ประกอบการ regexp ทดแทนการดำเนินงานโดยค่าเริ่มต้นในตัวแปรซึ่งแทนที่สตริงที่ว่างเปล่ากับสตริง$_ xx(โดยปกติ/จะใช้เป็นตัวคั่น regexp ใน Perl แต่จริงๆแล้วสามารถใช้อักขระได้เกือบทั้งหมดฉันเลือก!เนื่องจากไม่ใช่ตัวผูกไท) นี่เป็นเพียงวิธีแฟนซีของ"xx"การเตรียมการ$_- หรือตั้งแต่$_เริ่มว่าง (ไม่ได้กำหนด จริง ๆ แล้วมันเป็นวิธีการเขียน$_ = "xx"โดยไม่ต้องใช้เครื่องหมายเท่ากับ (และมีตัวอักษรน้อยลงเช่นกัน)

  • s!x!$"x<>!egจะเปลี่ยน regexp อีกครั้งคราวนี้แทนที่แต่ละxในที่มีคุณค่าของการแสดงออก$_ $" x <>( gสวิตช์ระบุการแทนที่ทั่วโลกeระบุว่าการแทนที่จะถูกประเมินเป็นรหัส Perl แทนการใช้เป็นสตริงตัวอักษร) $"เป็นตัวแปรพิเศษที่มีค่าเริ่มต้นที่เกิดขึ้นเป็นพื้นที่เดียว; ใช้มันแทนการ" "บันทึกหนึ่งอักขระ (ตัวแปรอื่นใดที่ทราบว่ามีค่าอักขระหนึ่งตัวเช่น$&หรือ$/จะทำงานได้ดีเท่า ๆ กันที่นี่ยกเว้นว่าการใช้$/จะทำให้ฉันมีปัญหากับ tie-breaker)

    ตัว<> ดำเนินการอินพุตบรรทัดในบริบทสเกลาร์อ่านหนึ่งบรรทัดจากอินพุตมาตรฐานและส่งคืน xก่อนที่มันจะเป็น Perl ประกอบสตริงซ้ำและเป็นจริงหลักของการแก้ปัญหานี้: มันกลับถูกดำเนินการทางด้านซ้ายของมัน (พื้นที่ตัวเดียว) ซ้ำจำนวนครั้งที่กำหนดโดยตัวถูกดำเนินการสิทธิของ (เส้นที่เราเพิ่งอ่านเป็น input)

  • y!!!cเป็นเพียงวิธีที่คลุมเครือในการ (ab) ใช้ตัวดำเนินการทับศัพท์เพื่อนับจำนวนอักขระในสตริง ( $_โดยค่าเริ่มต้นอีกครั้ง) ฉันเพิ่งจะเขียนsay lengthแต่รุ่นที่ยุ่งเหยิงนั้นสั้นกว่าตัวละครตัวหนึ่ง :)


3
+1 - สุดยอดและอ่านไม่ได้ ;-) นี่เป็นคำตอบที่สมบูรณ์แบบเนื่องจากการนับตัวละครนั้นไม่สำคัญสำหรับความท้าทายนี้
Tommy

@ ทอมมีคำตอบที่สมบูรณ์แบบอื่น ๆ ด้วย บางทีเราควรผลักดันให้การนับตัวละครเป็นเบรกเกอร์คนสุดท้าย
Peter Taylor

@ Peter: ฉันเรียงลำดับของสันนิษฐานว่ามันเป็นแล้วโดยค่าเริ่มต้น
Ilmari Karonen

1
หากการนับตัวละครเป็นตัวแบ่งไทเบรกสุดท้ายและมีหลายรายการที่ถูกผูกไว้สำหรับศูนย์ในหมวดหมู่อื่น ๆ สิ่งนี้ไม่ได้กลายเป็นcode-golfข้อ จำกัด ของแหล่งที่มาใช่ไหม?
SPARR

47

R (24 ตัวอักษร)

length(sequence(scan()))

สิ่งนี้ทำอะไร:

  • scan อ่านอินพุตจาก STDIN (หรือไฟล์)
  • sequenceสร้างลำดับจำนวนเต็มเริ่มต้นจาก 1 และเชื่อมต่อลำดับ ตัวอย่างเช่นsequence(c(2, 3))ผลลัพธ์ในเวกเตอร์1 2 1 2 3
  • length คำนวณจำนวนองค์ประกอบในเวกเตอร์ที่ต่อกัน

ตัวอย่างที่ 1:

> length(sequence(scan()))
1: 123
2: 468
3:
Read 2 items
[1] 591

ตัวอย่างที่ 2:

> length(sequence(scan()))
1: 702
2: 720
3:
Read 2 items
[1] 1422

1
ฉลาดมากดีมาก
Matthew อ่าน

สิ่งนี้ทำให้ฉันลืม
smci

+/- และตัวแบ่งเบรกเกอร์ดังกล่าวข้างต้นนั้นน่าสนใจไม่ใช่ตัวอักษร
ไม่ทราบผู้ใช้

มันคำนวณความยาวได้อย่างไร โดยไม่ใช้การเพิ่มใด ๆ ? ถ้าเป็นเช่นนั้นฉันจะแปลกใจ
Tem Pora

2
@TemPora คำถาม จำกัด เฉพาะรหัสในคำตอบไม่ใช่การดำเนินการที่ทำเบื้องหลัง เราจะไม่ จำกัด คำถามดังนั้นสถาปัตยกรรมคอมพิวเตอร์พื้นฐานไม่สามารถเพิ่มการลงทะเบียนได้
mbomb007

15

D

main(){
    int a,b;
    readf("%d %d",&a,&b);
    while(b){a^=b;b=((a^b)&b)<<1;}
    write(a);
}

bit twiddling สำหรับผู้ชนะ

เป็นโบนัสรหัสที่คอมไพล์ไม่มีการเพิ่ม (ไม่สามารถพูดสำหรับการโทร readf ว่า)


12

Python 2, 43 ไบต์

print len('%s%s'%(input()*'?',input()*'!'))

3
สร้างสรรค์มาก แต่คุณอาจต้องการเปลี่ยนอักขระที่ใช้ในสตริงเป็นอย่างอื่นที่ไม่ใช่ tie-breaker เช่น "~"
3Doubloons

ขอบคุณสำหรับคำแนะนำของอเล็กซ์ฉันลืมไปแล้วเกี่ยวกับกฎไทเบรกเกอร์
Omar

print sum(input(),input())
razpeitia

9
razpeitia: ฉันคิดว่า sum เป็นฟังก์ชั่น "sum-like" และไม่อนุญาต
โอมาร์

6

GolfScript

ไม่มี +/- หรือ tie-breakers:

# Twiddle some bits to get a few small integers
[]!~abs:two~abs:three!:zero~:minusone;

~[two base minusone%\two base minusone%]zip
zero:c;
{
    # Stack holds [x y] or [x] with implicit y is zero
    # Half adder using x y c: want to end up with sum on stack and carry back in c
    [~c zero]three<zero$
    ~^^\
    $~;:c;;
}%
[~c]minusone%two base

เวอร์ชั่นที่ง่ายกว่ามากที่มีตัวละคร tie-breaker สองตัวโดยใช้กลวิธี list-concatenation เดียวกับที่คนอื่นใช้:

~[\]{,~}%,

ฉันสมมติว่า GolfScript ไม่ได้ถูกตัดสิทธิ์)เนื่องจากการเป็นผู้ดำเนินการที่เพิ่มขึ้นเนื่องจากฉันไม่ได้ใช้งานจริง


6

C (32 บิตเท่านั้น)

int main(int ac, char *av) {
    scanf("%d\n%d", &ac, &av);
    return printf("%d\n", &av[ac]);
}

เลขคณิตของตัวชี้นั้นดีเหมือนกัน
มันตรงกับข้อกำหนดอย่างไร
* ไม่มี+หรือ-
* ไม่มี/, =, ., 0- 9
* เฉพาะ 3 คู่วงเล็บซึ่งดูเหมือนว่าฉันน้อยที่สุด (คุณต้องmain, scanf, printf)
* หนึ่งวิธี*(ตัวชี้จำเป็นต้องใช้)
* สี่,(สามารถบันทึกได้หนึ่งโดยกำหนดตัวแปรปกติไม่ใช่ac,av)


6

C ++ 0 +/-, 3 เบรคเกอร์

#include <vector>
#include <iostream>

#define WAX (
#define WANE )
#define SPOT .

int main WAX WANE {
    unsigned x;
    unsigned y;
    std::cin >> x >> y;
    std::vector<int> v WAX x WANE;
    std::vector<int> u WAX y WANE;
    for WAX auto n : u WANE {
        v SPOT push_back WAX n WANE;
    }
    std::cout << v SPOT size WAX WANE;
}

5

Haskell, 0 + 2

import Monad
main = join $ fmap print $ fmap length $ fmap f $ fmap lines getContents
f x = join $ flip replicate [] `fmap` fmap read x

การใช้งานนี้ไม่มี+หรือ-ตัวอักษรและมีเพียงสองจากชุดของตัวละครเบรกผูกหนึ่งซึ่งมีผลบังคับใช้สำหรับการผูก= mainผลรวมจะทำโดยการต่อรายการความยาวที่เหมาะสม


4

แก้ไขสิ่งนี้ถูกโพสต์ก่อนที่กฎจะเปลี่ยนเป็นไม่อนุญาตsum...

ภาษา R: ไม่ต้องโทร+หรือ-... และมีตัวละคร tie-breaker 9 ตัว!

sum(as.numeric(readLines(n=2)))

ตัวอย่าง:

> sum(as.numeric(readLines(n=2)))
123
456
[1] 579

[1] 579เป็นคำตอบที่ 579 (คน[1]คือการติดตามการที่ในเวกเตอร์ผลของคุณตั้งแต่ใน R ค่าทั้งหมดเวกเตอร์ - ในกรณีของความยาว 1 นี่)

โปรดทราบว่า R มี+โอเปอเรเตอร์เหมือนกับภาษาส่วนใหญ่มันเกิดขึ้นsumจนเกินไปที่รวมเวกเตอร์จำนวนหนึ่ง

ในกรณีนี้readLinesส่งคืนเวกเตอร์สตริงที่มีความยาว 2 จากนั้นฉันจะรวมมันให้เป็นตัวเลข (คู่) และรวมมัน ...

เพียงเพื่อแสดงคุณสมบัติอื่น ๆ ของ R:

> 11:20 # Generate a sequence
 [1] 11 12 13 14 15 16 17 18 19 20

> sum(1:10, 101:110, pi)
[1] 1113.142

1
+1 สำหรับการทำให้ฉันต้องเปลี่ยนกฎให้ผิดกฎหมายฟังก์ชัน sum ()
PhiNotPi

@PhiNotPi - เปลี่ยนกฎหรือไม่! นั่นคือการโกง! :-) ... แต่คุณอาจจะพูดว่า "ผลรวมเหมือนฟังก์ชั่น" หรือฉันจะใช้colSumsแทน ... บางทียังนอกกฎหมาย "ปฏิเสธเหมือนฟังก์ชั่น" ขณะที่ของคุณที่มัน ...
ทอมมี่

2
ฉันจะไปตามคำแนะนำของคุณ จากสิ่งที่ฉันสามารถบอกได้ทุกคน (รวมถึงฉัน) ในเว็บไซต์นี้ชอบที่จะชี้ให้เห็นช่องโหว่ในกฎ
PhiNotPi

4

ภาษา R

กฎใหม่คำตอบใหม่ภาษาเดียวกัน ไม่มีการโทรไป+หรือ-

อัพเดทใช้scanมันลดลงถึง 11 ตัวอักษร tie-breaker (และ 27 ตัวอักษรในทั้งหมด)

as.numeric(scan())%*%c(1,1)

Original: 13 ตัวละคร tie-breaker!

as.numeric(readLines(n=2)) %*% c(1,1)

ตัวอย่าง:

> as.numeric(readLines(n=2)) %*% c(1,1)
123
456
     [,1]
[1,]  579

เวลานี้ผลลัพธ์สำเร็จโดยการคูณเมทริกซ์ คำตอบจะแสดงเป็นเมทริกซ์ 1x1


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

+1 ดี คุณสามารถทำให้สิ่งนี้สั้นลงด้วยscan()แทนที่จะใช้readlines(n=2)
Andrie

@Andrie - ใช่ แต่แล้วคุณต้องพึ่งพาผู้ใช้ป้อนว่าตัวเลขสอง ... ซึ่งเป็น OK สำหรับความท้าทายนี้ผมคิดว่า ...
ทอมมี่

4

Haskell, 0 +/ -, 6 2 เบรคเกอร์ ( =)

(ไม่ใช้เคล็ดลับการต่อสตริง / รายการ)

main = interact f
f x = show $ log $ product $ map exp $ map read $ lines x

คุณสามารถกำจัดจุดทั้งหมดที่ค่าใช้จ่ายของ extra = โดยแทนที่องค์ประกอบ: แทน "fgh" เขียน "a ที่ ax = f $ g $ h x x"
Omar

3

Javascript, 56

p=prompt;alert(Array(~~p()).concat(Array(~~p())).length)

ขอบคุณ @JiminP ที่ปลาย ~~! ฉันจะไปอย่างน้อยไบต์ดังนั้นการบันทึก 1 ไบต์บนพรอมต์ p =; ยังคงคุ้มค่า ฉันเข้าใจข้อถกเถียงของคุณเกี่ยวกับตัวโยงไทร์ - เบรก แต่โดยความจริงแล้วคุณไม่ควรใช้ไบต์น้อยที่สุด :-p

รุ่น 69

i=parseInt;p=prompt;alert(Array(i(p())).concat(Array(i(p()))).length)

ขอบคุณคำติชมบางส่วนจาก @Ilmari และ @JiminP ฉันได้ลบคำตอบเดิมของฉันออกไป 13 ไบต์

เดิมที 82

i=parseInt;p=prompt;a=Array(i(p()));a.push.apply(a, Array(i(p())));alert(a.length)

พื้นที่หลังเครื่องหมายจุลภาคนั้นไม่จำเป็นเลย ลบมันทำให้คุณลงที่ 81
Ilmari Karonen

การใช้concatและใส่การคำนวณalertจะสั้นลง i=parseInt;p=prompt;alert(Array(i(p())).concat(Array(i(p()))).length) BTW ผมไม่ทราบว่าผลตอบแทนอาร์เรย์ที่มีความยาวArray(n) nคอนโซล Google Chrome ให้ฉัน[]และฉันคิดว่ามีอะไรที่ ...
JiminP

1
โอ้เนื่องจากสิ่งที่สำคัญคือตัวละคร tie-breaker p=promptไม่ดี และเกือบจะเทียบเท่ากับparseInt(x) (12 ตัวเชื่อมแบบเบรกเกอร์) PS ฉันสามารถใช้สิ่งนี้เป็นรายการของฉันได้ แต่นั่นทำให้ฉันรู้สึกว่าถูกขโมย ~~xalert(Array(~~prompt())['concat'](Array(~~prompt()))['length'])
JiminP


3

APL (ไม่มี +/-, ไม่มีตัวแบ่งผูก, 8 หรือ 10 ตัวอักษร)

รายการนี้คล้ายกับรายการอื่นที่เรียงลำดับที่สร้างจากอินพุตและค้นหาความยาว ... แต่มันอยู่ใน APL ซึ่งอาจดูสับสนแม้สำหรับปัญหาเล็ก ๆ เช่นนี้ ฉันใช้Dyalog APLซึ่งเสนอใบอนุญาตการศึกษาฟรี

รหัส:

⍴⊃⍪⌿⍳¨⎕⎕

จากขวาไปซ้าย:

  • แต่ละเครื่องหมายคำพูด ( ) แต่ละตัวร้องขออินพุตจากผู้ใช้และประเมินค่า
  • ตัวดำเนินการแต่ละตัว ( ¨) ใช้ฟังก์ชันตัวสร้างดัชนี () ) กับแต่ละรายการในอาร์เรย์ทางด้านขวา
  • สิ่งนี้จะทำให้อาร์เรย์ของอาร์เรย์ที่เป็นผลลัพธ์นั้นแบนลงหนึ่งอาร์เรย์ อาร์เรย์อินพุทจะถูกลดขนาดไปที่ลิสต์แบบแบนโดยตัวดำเนินการลดขนาด ( /) ซึ่งจะพับอาร์เรย์โดยใช้ฟังก์ชั่นการต่อข้อมูล ( ,) เพื่อประโยชน์ของความท้าทายนี้มีการใช้ตัวดำเนินการลดมิติเดียว ( ) พร้อมกับตัวดำเนินการเรียงต่อกันตามแกนแรก ( )
  • เป็นผลมาจากการใช้ตัวดำเนินการลดอาร์เรย์ถูกล้อมรอบซึ่งเหมือนกับวางไว้ในถุง สิ่งที่เราเห็นด้านนอกคือกระเป๋าไม่ใช่เนื้อหา ผู้ประกอบการเปิดเผย ( ) ให้เนื้อหาของอาร์เรย์ที่ล้อมรอบ (ถุง) แก่เรา
  • ในที่สุดฟังก์ชั่น shape-of ( ) ทำให้เรามีความยาวของขนาดของอาเรย์ ในกรณีนี้เรามีอาร์เรย์หนึ่งมิติดังนั้นเราจึงได้จำนวนรายการในอาร์เรย์ซึ่งเป็นผลลัพธ์ของเรา

หากเราต้องการแสดงผลลัพธ์อย่างชัดเจนเราสามารถทำเช่นนี้ได้:

⎕←⍴⊃⍪⌿⍳¨⎕⎕

รหัส Python ที่เปรียบเทียบได้ซึ่งมีสัญลักษณ์ APL ด้านบน:

import operator

⎕←     ⍴    ⌿        ⍪                 ¨              ⍳                ⎕        ⎕         ⊃
print (len (reduce (operator.__add__, [map (lambda n: range (1, n+1), [input(), input()])][0])))

ผมอยากจะทราบว่ามีรุ่นสั้นเป็นไปได้ใน APL - อีกรุ่นที่เรียบง่ายที่ฉันมากับที่มีเบรกเกอร์ผูกมากขึ้น (แม้จะยังคงอยู่ที่ 8 ตัวอักษร) ⍴(⍳⎕),⍳⎕เป็น:


ตัวสร้างดัชนีของคุณเริ่มต้นที่ 1 หรือ 0 หรือไม่?
MrZander

3

ฉันไม่เห็นใครทำตามวิธีวิศวกรรมไฟฟ้าดังนั้นนี่คือสิ่งที่ฉันใช้ (เป็นทับทิม):

def please_sum(a, b)
    return (a&b !=0)? please_sum( ((a&b)<<1) , a^b ):a^b
end

มันน่าเกลียดนิดหน่อย แต่ก็ทำงานให้เสร็จได้ ANDสองค่าเมื่อเทียบจากค่าที่เหมาะสม หากพวกเขาไม่ได้มีบิตใด ๆ ในการร่วมกันไม่มี "ดำเนินการ" ลงในคอลัมน์ไบนารีถัดไปดังนั้นนอกจากสามารถจะแล้วเสร็จโดยบิตXORing พวกเขา XORหากมีการดำเนินการที่คุณจะต้องเพิ่มการดำเนินการเพื่อให้ค่าที่เหมาะสม นี่เป็นสคริปต์ทับทิมเล็กน้อยที่ฉันใช้เพื่อให้แน่ใจว่าตรรกะดิจิทัลของฉันไม่เป็นสนิมเกินไป:

100.times do
    a=rand 10
    b=rand 10
    c=please_sum(a,b)
    puts "#{a}+#{b}=#{c}"
    end

ไชโย!



2

เชลล์ 52

read a
read b
(seq 1 $a;seq 1 $b)|wc|awk '{print$1}'

นี่เป็นคำตอบเดียวกับที่ฉันให้สำหรับปัญหาอื่น


ที่คล้ายกัน: xargs -n1 jot | wc -lซึ่งจะ-ลดลงเหมือนกันawkแต่ฉันไม่เห็นวิธีที่จะหลีกเลี่ยงในxargs
Ben Jackson

+/- และตัวแบ่งเบรกเกอร์ดังกล่าวข้างต้นนั้นน่าสนใจไม่ใช่ตัวอักษร
ไม่ทราบผู้ใช้

2

C

a,b;A(int a,int b){return a&b?A(a^b,(a&b)<<1):a^b;}
main(){scanf("%d%d",&a,&b);printf("%d\n",A(a,b));}

ฉันนับเบรกเกอร์ที่มีจำนวนเท่ากัน ...
FUZxxl

2
22 tie breakers: 0 /*=., 7 (, 7 ), 7 ,, 1[0-9]
saeedn

2

C #

มันไม่ได้สั้นที่สุดเมื่อยืดออก:

private static int getIntFromBitArray(BitArray bitArray)
{
    int[] array = new int[1];
    bitArray.CopyTo(array, 0);
    return array[0];
}

private static BitArray getBitArrayFromInt32(Int32 a)
{
    byte[] bytes = BitConverter.GetBytes(a);
    return new BitArray(bytes);
}

static void Main(string[] args)
{
    BitArray first = getBitArrayFromInt32(int.Parse(Console.ReadLine()));
    BitArray second = getBitArrayFromInt32(int.Parse(Console.ReadLine()));
    BitArray result = new BitArray(32);

    bool carry = false;
    for (int i = 0; i < result.Length; i++)
    {
        if (first[i] && second[i] && carry)
        {
            result[i] = true;
        }
        else if (first[i] && second[i])
        {
            result[i] = false;
            carry = true;
        }
        else if (carry && (first[i] || second[i]))
        {
            result[i] = false;
            carry = true;
        }
        else
        {
            result[i] = carry || first[i] || second[i];
            carry = false;
        }
    }
    Console.WriteLine(getIntFromBitArray(result));
}

แมทธิวเหนื่อยมาก
Cary Swoveland

2

J, 15 7 ตัวอักษร, เบรกเกอร์ 1 อัน, โปรแกรมที่ไม่สมบูรณ์

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

p=:#@#~

ความคิดนั้นง่ายมาก ฟังก์ชั่นนี้เขียนในสไตล์ที่ไม่มีจุดหมายโดยปริยาย นี่คือคำนิยามที่แหลม:

p=:3 :'##~y'

อ่านจากขวาไปซ้าย ในรุ่นโดยปริยาย@ประกอบด้วยส่วนต่าง ๆ ของฟังก์ชั่น (เหมือน∘ในวิชาคณิตศาสตร์ [(f∘g) (x) = f (g (x)])

  • y เป็นพารามิเตอร์ของ pเป็นพารามิเตอร์ของ
  • ~ทำให้กริยาสะท้อนกลับ สำหรับคำกริยาบางm, m~ aมีค่าเท่ากับa m aมีค่าเท่ากับ
  • #(คัดลอกa#b): องค์ประกอบแต่ละรายการaจะถูกทำซ้ำiเวลาโดยที่iเป็นองค์ประกอบที่ดัชนีเช่นเดียวกับองค์ประกอบปัจจุบันของของa bดังนั้น#~ทำซ้ำรายการn nครั้ง
  • #(นับ#b): bนับจำนวนขององค์ประกอบใน

สรุป: J น่ากลัวและอ่านน้อยกว่า Perl (นั่นทำให้ยิ่งน่ากลัว)

การแก้ไข

  • 15 -> 7 ใช้ #i.แทน ใช่ ตัวอักษรน้อยกว่า golfscript

มากกว่าหนึ่งโปรแกรม

อันนี้เป็นการสอบถามอินพุต แต่ก็ยังไม่ใช่โปรแกรมเต็มรูปแบบ: (13 ตัวอักษร, ตัวแบ่ง 3 ตัว)

##~".1!:1<#a:

J นั้นยอดเยี่ยมมาก แต่เชื่อฉันเถอะคุณไม่สามารถละทิ้งส่วนที่แยกวิเคราะห์ของปัญหาได้เมื่อคุณแก้ปัญหาด้วย ;-)
JB

@JB คุณสามารถใช้ฟังก์ชัน builtin toJ แต่ฉันได้รับข้อผิดพลาดของโดเมน
FUZxxl

2

Javascript (17 tie-breaker อักขระ)

eval('걢갽거걲걯걭거건갨걡갽거걲걯걭거건갨걹갽걦걵걮걣건걩걯걮갨걡갩걻걣갽걮걥걷갠걕걩걮건갸걁걲걲걡걹갨걡갩갻걦걯걲갨걩갠걩걮갠걣갩걩걦갨걩갽갽걾걾걩갩걸갮거걵걳걨갨갱갩걽갬걸갽걛걝갩갩갻걹갨걡갩갻걹갨걢갩갻걡걬걥걲건갨걸갮걬걥걮걧건걨갩갻'['split']('')['map'](function(_){return String['fromCharCode'](_['charCodeAt'](~~[])^0xac00)})['join'](''))

: P ("Obfuscated" เพื่อลดจำนวนตัวอักษร tie-breaker ภายในตัวมัน b=prompt(a=prompt(y=function(a){c=new Uint8Array(a);for(i in c)if(i==~~i)x.push(1)},x=[]));y(a);y(b);alert(x.length); )


2

C #

โปรแกรมทำงานบน 1 บรรทัด; คั่นบนหลายบรรทัดเพื่อหลีกเลี่ยงการเลื่อนในแนวนอน

using C=System.Console;
class A{
static void Main(){
int a,b,x,y;
a=int.Parse(C.ReadLine());
b=int.Parse(C.ReadLine());
do{x=a&b;y=a^b;a=x<<1;b=y;}while(x>0);
C.WriteLine(y);
}}

1

Clojure (44 ตัวอักษร)

(pr(#(count(concat(%)(%)))#(repeat(read)0)))

แก้ไข: แก้ไขเพื่อพิมพ์บน STDOUT แทนที่จะส่งคืนเพียงผลรวม


+/- และตัวแบ่งเบรกเกอร์ดังกล่าวข้างต้นนั้นน่าสนใจไม่ใช่ตัวอักษร
ไม่ทราบผู้ใช้

1

สกาล่า

  • คะแนน:
    • + -: 0
    • () : 5 + 5 + 3 = 13

รหัส:

(List.fill (readInt) (1) ::: List.fill (readInt) (2)).size
  • รายชื่อเติม (4) (7) สร้างรายชื่อ (7, 7, 7, 7)
  • a ::: b เชื่อม 2 รายการเข้าด้วยกัน
  • ส่วนที่เหลือควรชัดเจน

1

K, 11

{#,[!x;!y]}

เทคนิคการต่อข้อมูลแบบเดียวกับโซลูชัน R อ่านจากขวาไปซ้าย: ระบุตัวแปรอินพุตสองตัวต่อกันแล้วนับ


1

PowerShell , 27 42 ไบต์, 0 +-, 4 1 สำรอง

ขอบคุณ mazzy สำหรับการบันทึก+และวินาทีที่4

$args|%{[int[]]$_*$_}|measure|select count

ลองออนไลน์! หรือโต๊ะสวยสำหรับเพิ่มอีก 3 ไบต์

หรือเพิ่มสี่วินาทีเพื่อบันทึก 19 ไบต์:

32 23 ไบต์, 1 0 +-, 12 5 วินาที

-9 ไบต์ขอบคุณที่ทำให้โกรธ

($args|%{,$_*$_}).count

ลองออนไลน์!

สำหรับการโต้แย้งแต่ละครั้งเราจะผลักnองค์ประกอบของอาร์เรย์ (ประกอบด้วย[n]แต่ไม่สำคัญ) ไปยังไปป์ไลน์ซึ่งจัดกลุ่มโดย parens แล้วนับ



1
ฉันขอโทษนี่ไม่ใช่ codegolf 0 + -, 3 วินาที, 27 ไบต์
mazzy

1
@mazzy นั่นคือ 4 จากการนับของฉัน แต่ก็ยังขอบคุณ: D
Veskah

1
คุณพูดถูก ขอบคุณ 0 + - 1 Tie Breaker, 42 ไบต์ คุณสามารถเพิ่ม|flรูปแบบที่สวยงามลองใช้ออนไลน์!
mazzy

1

ถัง (SBCS บน Keg wiki)

โดยทั่วไปพอร์ตของคำตอบ R

¿¿Ï_"Ï_!.

คำอธิบาย

¿¿#        Take 2 integer inputs
  Ï_"Ï_#   Generate 2 arrays the length of the integer inputs
       !.# Output the length of the stack

1

05AB1E , 2 4ไบต์, 0 +/-

F>

ลองออนไลน์!

ขออภัยหากฉันเข้าใจผิดกับการท้าทายนี้ แต่ฉันรู้สึกประหลาดใจที่ไม่มีคำตอบ 05AB1E คำตอบที่สั้นที่สุดในภาษานี้ฉันจะได้ว่าไม่ใช้ + หรือฟังก์ชั่นผลรวมในตัว

คำอธิบาย:

 F   #Loop A many times
  >  #Increment B
     #(Implicit output)

-2 Bytes ขอบคุณ Grimy


1
ขอบคุณ! ฉันยังใหม่กับ 05AB1E
บิสมาร์ก 71


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