หารจำนวนด้วย 3 โดยไม่ใช้ตัวดำเนินการ *, /, +, -,%


48

การอ้างอิงคำถามนี้ใน SO (การแจ้งเตือนสปอยเลอร์!):

คำถามนี้ถูกถามในการสัมภาษณ์ Oracle

คุณจะหารจำนวนด้วย 3 โดยไม่ใช้ *, /, +, -,%, โอเปอเรเตอร์ได้อย่างไร

หมายเลขอาจถูกเซ็นชื่อหรือไม่ได้ลงนาม

งานสามารถแก้ไขได้ แต่ดูว่าคุณสามารถเขียนรหัสที่สั้นที่สุด

กฎ:

  • ดำเนินการหารจำนวนเต็มที่ต้องการ( /3)
  • ห้ามใช้ในผู้ประกอบการที่ไม่ใช่ข้อความ-based *, /, +, -หรือ%(หรือเทียบเท่าของพวกเขาเช่น__div__หรือadd()) นอกจากนี้ยังนำไปใช้ในการเพิ่มและ decrementing ผู้ประกอบการเหมือนหรือi++ i--การใช้ตัวดำเนินการสำหรับการต่อข้อมูลสตริงและการจัดรูปแบบนั้นก็โอเค การใช้อักขระเหล่านี้สำหรับโอเปอเรเตอร์ต่าง ๆ เช่น-โอเปอเรเตอร์unary สำหรับจำนวนลบหรือ*เพื่อแทนตัวชี้ใน C ก็โอเคเช่นกัน
  • ค่าอินพุตอาจใหญ่มาก (สิ่งที่ระบบของคุณสามารถจัดการได้) ทั้งบวกและลบ
  • อินพุตอาจเป็น STDIN หรือ ARGV หรือป้อนด้วยวิธีอื่น
  • สร้างรหัสที่สั้นที่สุดที่คุณสามารถทำได้ด้านบน

1
ผลลัพธ์ควรปัดเศษอย่างไรเมื่อบวก? ทำอย่างไรเมื่อลบ?
dfeuer

คำตอบ:


15

J, 45 44 10 ตัวอักษร

".,&'r3'":

ทำงานกับเนกาทีฟ:

".,&'r3'": 15
5
   ".,&'r3'": _9
_3
   ".,&'r3'": 3e99
1e99

": - จัดรูปแบบเป็นข้อความ

,&'r3'- ต่อr3ท้าย

". - รันสตริงเช่น 15r3


1
3 3 3 #: 9มันทำงานได้ถ้าคุณทำ ดูเหมือนว่าคุณจำเป็นต้องรู้ว่าจะต้องใช้หมายเลขสามของคุณนานแค่ไหน _3]\i.ยังเป็นจุดเริ่มต้นที่เป็นไปได้สำหรับบางสิ่ง แต่ฉันไม่รู้ว่าจะสั้นกว่าโซลูชันของคุณที่นี่หรือไม่ ปัญหาที่เกิดขึ้น#_3]\i.ตามมาคือมันมักจะปัดขึ้นแทนที่จะลง
Gareth

1
อาจจะ##~3=_3#\i.เป็น 11 ตัวอักษร?
Gareth

1
ที่จริงแล้วคุณสามารถหดของคุณลงไป 10 ##~0 0 1$~ตัวอักษรที่มี
Gareth

1
คุณสามารถย่อขนาดนั้นลงได้โดยใช้เบ็ดถึง3#.}:(#:~$&3)แต่มันก็ยังคงยาวขึ้นและมันไม่สามารถแก้ไขปัญหาจำนวนลบได้
Gareth

1
ใช่คุณสามารถใช้ฟังก์ชั่นพลังงาน ^:หรือวาระ @.สำหรับifหรือif...elseเปลี่ยน ในกรณีนี้คุณสามารถใช้@.กับกริยาสองตัวที่เชื่อมต่อกับตัวอักษร '`' (คำนามเป็น Gerund ใน J-speak) เพื่อเลือกหนึ่งตัวหรืออีกตัวหนึ่งโดยขึ้นอยู่กับเงื่อนไข
Gareth

56

C, 167503724710

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

โปรแกรมของฉันเป็นผลลัพธ์ของสคริปต์ต่อไปนี้:

#!/usr/bin/env python3
import sys

# 71
sys.stdout.write('''#include <stdint.h>
#include <stdio.h>
int32_t div_by_3(int32_t input){''')

# 39 * 2**32
for i in range(-2**31, 2**31):
    # 18 + 11 + 10 = 39
    sys.stdout.write('if(input==%11d)return%10d;' % (i, i / 3))

# 95
sys.stdout.write(r'''return 7;}int main(int c,char**v){int32_t n=atoi(a[1]);printf("%d / 3 = %d\n",n, div_by_3(n));}''')

จำนวนตัวละคร: 71 + 39 * 2 ** 32 + 95 = 167503724710

มาตรฐาน

มีคนถามว่าจะใช้เวลานานเท่าใดและจะใช้หน่วยความจำเท่าใดดังนั้นนี่คือมาตรฐาน:

  • เวลาดำเนินการสคริปต์ - ใช้./test.py | pv --buffer-size=1M --average-rate > /dev/nullเวลาประมาณ 30 วินาทีให้อัตราประมาณ 14.8 MB / s อัตราการส่งออกสามารถสันนิษฐานได้ว่ามีค่าคงที่โดยประมาณดังนั้นเวลาในการดำเนินการถึงความสมบูรณ์ควรจะอยู่ที่ประมาณ 167503724710 B / (14.8 * 1048576 B / s) ≈ 10794 s
  • เวลาในการรวบรวม - คอมไพเลอร์ TCC อ้างว่ารวบรวมรหัส C ที่ 29.6 MB / sซึ่งทำให้มีเวลารวบรวม 167503724710 B / (29.6 * 1048576 B / s) ≈ 5397 s (แน่นอนว่าสิ่งนี้สามารถทำงานในไปป์ไลน์ด้วยสคริปต์)
  • ขนาดของรหัสที่คอมไพล์แล้ว - ฉันลองประเมินโดยใช้./test.py | tcc -c - -o /dev/stdout | pv --buffer-size=1M --average-rate > /dev/nullแต่ดูเหมือนว่าtccจะไม่แสดงผลใด ๆ จนกว่ามันจะอ่านไฟล์ต้นฉบับทั้งหมด
  • การใช้หน่วยความจำในการรัน - เนื่องจากอัลกอริทึมเป็นแบบเส้นตรง (และ tcc ไม่ได้ปรับให้เหมาะสมที่สุดในทุกบรรทัด) ค่าใช้จ่ายในหน่วยความจำควรจะอยู่เพียงไม่กี่กิโลไบต์ (นอกเหนือจากรหัสแน่นอน)

22
นี่คือสิ่งที่ดีเลิศของการเข้ารหัส ++++++++++
Joe Z.

4
ที่ถูกกล่าวว่าฉันแน่ใจว่าถ้าคุณให้ไฟล์ต้นฉบับ 160 GB และขอให้พวกเขารวบรวมและทดสอบพวกเขาจะดูคุณเหมือนคุณบ้า
Joe Z.

16
หากเจ้านายของฉันขอให้ฉันคำนวณส่วนที่สามโดยไม่ต้อง - + / *% ฉันจะคิดว่าเขาบ้า
Mikaël Mayer

และยังa[b]เป็นน้ำตาล syntactic *(a + b)ซึ่งนอกเหนือจากนี้
Konrad Borowski

12
@NicolasBarbulesco มีการ จำกัด ขนาดคำตอบของ Stack Exchange
Timtech

38

ทับทิม 28

b=->n{n.to_s(3).chop.to_i 3}

หากต้องการหารด้วย 3 เราต้องลบศูนย์ท้ายในจำนวนฐาน 3: 120 -> 11110 -> 1111 -> 40

ทำงานกับเนกาทีฟ:

ice distantstar:~/virt/golf [349:1]% ruby ./div3.rb
666
222
ice distantstar:~/virt/golf [349]% ruby ./div3.rb
-15        
-5

ทับทิม, 60 45

อีกทางเลือกหนึ่งโดยไม่มีการแปลงฐาน:

d = -> n {x = n.abs; r = (0..1.0 / 0). ขั้นตอนที่ (3) .take (x) .index x; n> 0? r: -r}

d=->n{(r=1.step(n.abs,3).to_a.size);n>0?r:-r}

1
สลับโดยไม่ต้องแปลงฐานมีห้าม/ผู้ประกอบการที่กลายเป็นFloat::INFINITY 1.0/0ด้วย Ruby 2.1 หนึ่งอาจกอล์ฟ(0..1.0/0).step(3)เข้าไปเอา0.step(p,3) /ปัญหาที่ใหญ่กว่าคือการที่-rใช้-จะลบล้าง มีค่าใช้จ่าย 5 ตัวอักษรในการเปลี่ยน-rการ~r.predใช้Integer # ก่อนถึงการลบ 1 โดยไม่ใช้ตัวดำเนินการลบ
kernigh

26

Mathematica, 13 ตัวอักษร

Mean@{#,0,0}&

สิ่งนี้เป็นสิ่งที่ชั่วร้าย: เดาว่าคุณสามารถบันทึก&และใช้ตัวแปรธรรมดา (คนอื่นก็ทำได้เช่นกัน)
Yves Klett

3
@YvesKlett: หมายความว่าชั่วโดยเนื้อแท้
GuitarPicker

18

JavaScript, 56

alert(Array(-~prompt()).join().replace(/,,,/g,1).length)

ทำให้สตริงของความยาวnของการทำซ้ำ,และแทนที่ด้วย,,, 1จากนั้นมันจะวัดความยาวที่เกิดของสตริง (หวังว่า-จะอนุญาตให้มีการแพร่ธรรมได้!)


+1 แต่ไม่สามารถใช้กับค่าลบได้
Francesco Casula

เอ่อคำถาม ... การนับนี้เป็นอย่างไร มันใช้-ประกอบการปฏิเสธ
Patrick Roberts

@ แพทริคฉันใช้สเปคเพื่อหมายถึงไม่มีการลบ - ถ้าคุณต้องการคุณสามารถแทนที่-~ด้วยparseInt()
Casey Chu

@CaseyChu ค่าที่ส่งคืนโดย-~prompt()มีค่ามากกว่าparseInt(prompt())ค่า ไม่แน่ใจว่าคุณจะรับมืออย่างไร
Patrick Roberts

alert(Array(parseInt(prompt())).slice(1).join().replace(/,,,/g,1).length)
Casey Chu

16

งูหลาม41 38

print"-"[x:]+`len(xrange(2,abs(x),3))`

xrange ดูเหมือนว่าจะสามารถจัดการกับตัวเลขขนาดใหญ่ได้ (ฉันคิดว่าขีด จำกัด นั้นเหมือนกับ C เป็นเวลานาน) เกือบจะในทันที

>>> x = -72
-24

>>> x = 9223372036854775806
3074457345618258602

2
10/3เท่ากับ 3 ไม่ใช่ 4
Joel Cornett

การทำprint" -"[x<0]+len (พิสัย (2, abs (x), 3)) `` จะทำให้มันลดลงเหลือ 39 ตัวอักษร
โจเอลคอร์เน็ตต์

การจัดรูปแบบความคิดเห็นของ golfexchange กำลังทำให้ยุ่งเหยิง ด้านบนฉันใช้ backticks เพื่อล้อมรอบlen()เป็นชวเลขสำหรับrepr()
Joel Cornett

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

2
แกล้งทำเป็น Python 3;) ฉันชอบ btw ตัวแบ่งคำเดียว
Joel Cornett

11

Haskell, 90 106

d n=snd.head.dropWhile((/=n).fst)$zip([0..]>>=ν)([0..]>>=replicate 3>>=ν);ν q=[negate q,q]

สร้างรายการค้นหาที่ไม่มีที่สิ้นสุด (ขี้เกียจ) [(0,0),(0,0),(-1,0),(1,0),(-2,0),(2,0),(-3,-1),(3,1), ...]ตัดส่วนทั้งหมดที่ไม่ตรงกับn( /=คือความไม่เท่าเทียมกันใน Haskell) และส่งกลับรายการแรก

การทำเช่นนี้จะง่ายกว่ามากหากไม่มีตัวเลขติดลบ:

25 27

(([0..]>>=replicate 3)!!)

เพียงแค่ส่งกลับnองค์ประกอบ TH [0,0,0,1,1,1,2, ...]ของรายการ


3
oO ฉันไม่เคยคิดถึงวิธีแก้ปัญหาที่สองนั้น ฉันอาจสามารถใช้บางอย่างเช่นนั้นใน python
acolyte

8

C #, 232 ไบต์

รหัสกอล์ฟครั้งแรกของฉัน ... และเนื่องจากไม่มี C # และฉันต้องการลองวิธีอื่นที่ไม่ได้ลองที่นี่คิดว่าฉันจะลองดู เช่นเดียวกับคนอื่น ๆ ที่นี่เพียง แต่ตัวเลขที่ไม่เป็นลบ

class l:System.Collections.Generic.List<int>{}class p{static void Main(string[] g){int n=int.Parse(g[0]);l b,a=new l();b=new l();while(a.Count<n)a.Add(1);while(a.Count>2){a.RemoveRange(0,3);b.Add(1);}System.Console.Write(b.Count);}}

Ungolfed

class l : System.Collections.Generic.List<int>
{ }
class p
{
    static void Main(string[] g)
    {
        int n = int.Parse(g[0]);
        l b, a = new l();
        b = new l();
        while (a.Count < n) a.Add(1);
        while (a.Count > 2)
        {
            a.RemoveRange(0, 3);
            b.Add(1);
        }
        System.Console.Write(b.Count);
    }
}

2
ประมาณ 5 ปีต่อมา .. คุณสามารถประหยัด 1 ไบต์โดยการลบช่องว่างออกstring[] gแล้วเปลี่ยนเป็นstring[]g
Metoniem

การอ้างอิง "อย่าใช้ตัวดำเนินการที่ไม่ใช่ข้อความ *, /, +, -, หรือ% (หรือสิ่งที่เทียบเท่าเช่น div หรือ add ()" - คุณไม่ได้ใช้สิ่งที่เทียบเท่า - .Add?
Jonathan Frech

@JonathanFrech วิธีการเพิ่มนั้นใช้ไม่ได้กับตัวเลขสองตัว แต่จะเพิ่มค่าให้กับคอลเล็กชันเท่านั้น
Embodiment of Ignorance

7

Perl (26 22)

$_=3x pop;say s|333||g

รุ่นนี้ (ab) ใช้เอ็นจิ้น regex ของ Perl มันอ่านตัวเลขเป็นอาร์กิวเมนต์บรรทัดคำสั่งสุดท้าย ( pop) และสร้างสตริงของ3ความยาวนี้ ( "3" x $number) ตัวดำเนินการแทน regex ( s///ที่นี่เขียนด้วยตัวคั่นที่แตกต่างกันเนื่องจากกฎของตัวต่อและgธง lobal) แทนที่อักขระสามตัวด้วยสตริงว่างและส่งกลับจำนวนของการแทนที่ซึ่งเป็นจำนวนอินพุตที่หารด้วยสาม มันสามารถเขียนได้โดยไม่ต้อง3แต่รุ่นข้างต้นดูสนุกสนาน

$ perl -E '$_=3x pop;say s|333||g' 42
14

2
เฮ้ @emowe ทำงานได้ดีมาก! คุณสามารถบันทึกตัวอักษรอีกไม่กี่ (4) $_=3x pop;say s|333||gโดยการทำ
Dom Hastings

2
เมื่ออินพุตเป็น 0, 1 หรือ 2 มันจะพิมพ์สตริงว่าง หากจะต้องมีการพิมพ์ 0 แล้วมันต้องอีก 3 ตัวอักษร (25 '$_=3x pop;say s|333||g||0รวม): ช้าด้วยจำนวนมากเช่น 99999999 และไม่ทำงานกับจำนวนลบ
kernigh

1
ใช้-pบน commandline และคุณสามารถทำได้: $_=3x$_;$_=0|s|...||gรวมเป็น 22 รวมถึงการครอบคลุมของอินพุต 0, 1 หรือ 2
Xcali

6

C, 160 ตัวอักษร

ตัวอักษรโดยวิธีการแก้ปัญหาการแบ่งตัวละครยาวโดยใช้ตารางการค้นหาเช่นไม่มีสตริง atoi () หรือ printf () เพื่อแปลงระหว่าง 10 ฐานสตริงและจำนวนเต็ม

บางครั้งผลลัพธ์จะรวมศูนย์นำหน้าซึ่งเป็นส่วนหนึ่งของเสน่ห์

main(int n,char**a){
char*s=a[1],*x=0;
if(*s==45)s=&s[1];
for(;*s;s=&s[1])n=&x[*s&15],x="036"[(int)x],*s=&x["000111222333"[n]&3],x="012012012012"[n]&3;
puts(a[1]);
}

บันทึก:

  • ละเมิดการเข้าถึงอาเรย์เพื่อนำไปใช้เพิ่มเติม
  • คอมไพล์ด้วยเสียงดังกราว 4.0, คอมไพเลอร์อื่น ๆ อาจมีปัญหา

การทดสอบ:

./a.out -6            -2
./a.out -5            -1
./a.out -4            -1
./a.out -3            -1
./a.out -2            -0
./a.out -1            -0
./a.out 0             0
./a.out 1             0
./a.out 2             0
./a.out 3             1
./a.out 4             1
./a.out 5             1
./a.out 6             2
./a.out 42            14
./a.out 2011          0670

6

Python 42

int(' -'[x<0]+str(len(range(2,abs(x),3))))

เนื่องจากทุกคำตอบที่โพสต์ที่นี่ซึ่งฉันได้ตรวจสอบจะตัดทอนทศนิยมที่นี่

Python 50 51

int(' -'[x<0]+str(len(range([2,0][x<0],abs(x),3))))

เนื่องจากไพ ธ อนทำหน้าที่แบ่งชั้นนี่คือวิธีแก้ปัญหาของฉันที่นำไปใช้

จำนวนเต็มอินพุทอยู่ในตัวแปร x

ผ่านการทดสอบใน Python 2.7 แต่ฉันสงสัยว่ามันทำงานใน 3 ด้วย


+1 สำหรับเสนอทางเลือกทั้งสองให้กับสถานการณ์ค่าลบ เนื่องจากมีคำตอบอยู่แล้วจำนวนมากดังนั้นฉันจะไม่ได้รับการปรับสเปคที่จะไม่รวมหนึ่งหรือตัวเลือกอื่น ๆ แม้ว่าผมเองจะยอมรับว่าเป็นคำตอบที่ถูกต้อง-3 -10/3
Gaffi

สำหรับผู้ที่สนใจเกี่ยวกับการแบ่งพื้นใน python: python-history.blogspot.com/2010/08/…
แมตต์

การคูณและการลบในโซลูชันที่สองของคุณคืออะไร
บูธโดย

@boothby ทางออกที่สองใช้การแบ่งชั้น ฉันต้องการทำช่วง (0, abs (x), 3) สำหรับจำนวนลบและช่วง (2, abs (x), 3) สำหรับจำนวนบวก ในการทำเช่นนั้นฉันมีช่วง (2 ... จากนั้นฉันลบ 2 เมื่อ x เป็นลบ X <0 เป็นจริงเมื่อ x เป็นลบ (True) * 2 == 2
แมตต์

ฉันไม่เข้าใจความแตกต่างระหว่างการแบ่งชั้นกับการปัดเศษทศนิยม สิ่งนี้เกี่ยวข้องกับการแบ่งเชิงลบหรือไม่?
Joel Cornett

6

JavaScript, 55

alert(parseInt((~~prompt()).toString(3).slice(0,-1),3))

หากไม่มีใครใช้-1นี่เป็นเวอร์ชั่นที่แทนที่ด้วย~0(ขอบคุณ Peter Taylor!)

alert(parseInt((~~prompt()).toString(3).slice(0,~0),3))

1
@ArtemIce One ~เป็นตัวดำเนินการ Bitwise ซึ่งกลับค่าบิตของตัวถูกดำเนินการ (ก่อนจะแปลงเป็นตัวเลข) นี่เป็นวิธีที่สั้นที่สุดในการแปลงสตริงเป็นตัวเลข (เท่าที่ฉันรู้)
Inkbug

1
ฉันรู้สึกว่าการใช้การวิเคราะห์สตริง / การแปลงสตริงเป็นการโกงเนื่องจาก a) กระบวนการที่ซับซ้อนและมีราคาแพงเมื่อเทียบกับการดำเนินการระดับบิตข) ใช้ตัวดำเนินการที่ต้องห้ามภายในและ c) ใช้อักขระ waaaaay มากกว่าโซลูชันแบบ homerolled ชนิดของวิธีที่ผู้คนได้รับอารมณ์เสียเมื่อคุณใช้ตัวในประเภทเมื่อถูกขอให้ดำเนินการอย่างรวดเร็ว
Wug

1
@ Sam นอกจากนี้แปลงเป็นจำนวนเต็มเมื่อเทียบกับ~~ +
Inkbug

1
@Wug มันเป็น codegolf ดังนั้นจึงไม่เกี่ยวกับประสิทธิภาพเว้นแต่จะมีการระบุไว้ในงาน
defhlt

3
+1 สำหรับการใช้ประโยชน์จากฐานที่ต่างกัน เป็นหนึ่งในเทคนิคการเล่นกอล์ฟ JavaScript ที่ฉันโปรดปราน
DocMax

6

อักขระ 83 ตัว

จำนวนที่จะแบ่งจะถูกส่งผ่านถึง stdin และมันจะส่งคืนเป็นรหัสทางออกจากmain()(% ERRORLEVEL% ใน CMD) รหัสนี้ละเมิด MinGW บางเวอร์ชันในกรณีที่ไม่ได้เปิดใช้งานการปรับให้เหมาะสมจะถือว่าใช้ค่าการมอบหมายล่าสุดเป็นคำสั่งส่งคืน มันอาจจะลดลงเล็กน้อย รองรับตัวเลขทั้งหมดที่สามารถเข้ากับint

หากไม่อนุญาตให้ปฏิเสธคู่ (-): (129)

I(unsigned a){a=a&1?I(a>>1)<<1:a|1;}main(a,b,c){scanf("%i",&b);a=b;a=a<0?a:I(~a);for(c=0;a<~1;a=I(I(I(a))))c=I(c);b=b<0?I(~c):c;}

ถ้าลบล้างเอกISอนุญาต: (123)

I(unsigned a){a=a&1?I(a>>1)<<1:a|1;}main(a,b,c){scanf("%i",&b);a=b;a=a<0?a:-a;for(c=0;a<~1;a=I(I(I(a))))c=I(c);b=b<0?-c:c;}

แก้ไข: ugoren ชี้ให้ฉันเห็นว่า - ~ เป็นการเพิ่มขึ้น ...

83 ตัวอักษรหากอนุญาตให้ปฏิเสธไม่ได้: D

main(a,b,c){scanf("%i",&b);a=b;a=a<0?a:-a;for(c=0;a<~1;a=-~-~-~a)c=-~c;b=b<0?-c:c;}

ถ้าลบล้างเอกจะได้รับอนุญาตเป็นx+3 -~-~-~x
ugoren

ขอบคุณสำหรับสิ่งนั้น. ฉันไม่รู้ว่าทำไมถึงไม่เคยเกิดขึ้นกับฉัน ฉันคิดว่าฉันไม่ได้ตระหนักว่าคุณสามารถกอง unaries ดังนั้น hehe ฟรี
Kaslai

5

C, 139 ตัวอักษร

t;A(a,b){return a?A((a&b)<<1,a^b):b;}main(int n,char**a){n=atoi(a[1]);for(n=A(n,n<0?2:1);n&~3;t=A(n>>2,t),n=A(n>>2,n&3));printf("%d\n",t);}

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

  • จัดการทั้งจำนวนลบและจำนวนบวก

การทดสอบ:

 ./a.out -6            -2
 ./a.out -5            -1
 ./a.out -4            -1
 ./a.out -3            -1
 ./a.out -2            0
 ./a.out -1            0
 ./a.out 0             0
 ./a.out 1             0
 ./a.out 2             0
 ./a.out 3             1
 ./a.out 4             1
 ./a.out 5             1
 ./a.out 6             2
 ./a.out 42            14
 ./a.out 2011          670

การแก้ไข:

  • บันทึก 10 ตัวอักษรโดย shuffling นอกจากนี้ (A) เพื่อลบตัวแปรท้องถิ่น

1
ทำได้ดีมาก ฉันพยายามทำให้ดีที่สุดเท่าที่จะทำได้และถึง 239 ฉันไม่สามารถเอาหัวไปรอบ ๆ คุณได้Aฟังก์ชั่นของฉันแค่ตรวจสอบบิตฉันในหมายเลข n มาตรฐาน C อนุญาตการข้ามประเภทประกาศหรือว่าเป็นคอมไพเลอร์บางอย่าง
shiona

1
C จะถือว่าเป็น int หากไม่ได้ระบุ
Wug

5

ZSH - วันที่ 31 20/21

echo {2..x..3}|wc -w

สำหรับตัวเลขลบ:

echo {-2..x..3}|wc -w

ด้วยตัวเลขติดลบ (ZSH + bc) -62 61

ฉันอาจไม่ได้ให้สองโปรแกรมเป็นคำตอบของฉันดังนั้นต่อไปนี้เป็นโปรแกรมที่ใช้ได้กับหมายเลขใด ๆ :

echo 'obase=10;ibase=3;'`echo 'obase=3;x'|bc|sed 's/.$//'`|bc

นี้ใช้เคล็ดลับฐานแปลงเดียวกับคำตอบ Artem น้ำแข็ง


5

C, 81 73 ตัวอักษร

รองรับตัวเลขที่ไม่ใช่ลบเท่านั้น

char*x,*i;
main(){
    for(scanf("%d",&x);x>2;x=&x[~2])i=&i[1];
    printf("%d",i);
}

ความคิดคือการใช้ตัวบ่งชี้ทางคณิตศาสตร์ ตัวเลขจะถูกอ่านเข้าไปในตัวชี้xซึ่งไม่ได้ชี้ไปที่ใด &x[~2]= &x[-3]= x-3ใช้เพื่อลบ 3 ซึ่งจะทำซ้ำตราบใดที่จำนวนนั้นสูงกว่า 2 iนับจำนวนครั้งที่จะทำ ( &i[1]= i+1)


พยายามที่จะเข้าใจรหัสใครบางคนหลั่งไฟบางส่วน? ขอบคุณ
ยดกงฮุ่ย

@Chui เพิ่มคำอธิบาย
ugoren

@ugoren เท่าที่ฉันเข้าใจไม่ควรพิมพ์ ("% d") พิมพ์ตัวชี้ที่อยู่หน่วยความจำที่ฉันถือใน Hex? ทำไมมันถึงพิมพ์จำนวนเต็ม? หรือถ่าน * ฉันถูกเริ่มต้นให้ชี้ไปยังที่อยู่หน่วยความจำ 0 โดยค่าเริ่มต้น? ขอบคุณ
ยดกงฮุ่ย

5

ชวา 86 79

สมมติว่าจำนวนเต็มเป็น y:

แปลงเป็นสตริงในฐาน 3 ลบอักขระตัวสุดท้าย (กะขวา ">>" ในฐาน 3) จากนั้นแปลงกลับเป็นจำนวนเต็ม

ใช้งานได้กับจำนวนลบ

ถ้าตัวเลข, y, คือ <3 หรือ> -3, มันจะให้ 0

System.out.print(~2<y&y<3?0:Long.valueOf(Long.toString(y,3).split(".$")[0],3));

การโพสต์ครั้งแรกบนรหัสกอล์ฟ =) ดังนั้นยังไม่สามารถแสดงความคิดเห็น

ขอบคุณ Kevin Cruijssen สำหรับคำแนะนำ


ฉันรู้ว่ามันนานกว่าสองปีที่ผ่านมา แต่คุณสามารถกอล์ฟบางส่วน: &&การ&และ 2x ไปInteger Long(นอกจากนี้ทำไมคุณถึงใช้~2แทนแค่-3พวกเขาเป็นจำนวนไบต์เดียวกัน)
Kevin Cruijssen

1
@KevinCruijssen คิดถึงการแก้ไขโพสต์แรกของฉันหลังจากนั้นไม่นาน ไม่แน่ใจเหมือนกันว่าทำไมฉันถึงคิดว่า ~ 2 ก็ดีขึ้นแล้ว
Vectorized

2
@KevinCruijssen เป็นอย่างดีความท้าทายบอกว่าคุณไม่ได้รับอนุญาตให้ใช้-แต่ฉันไม่รู้ว่ามันนับว่าเป็นเรื่องที่ปฏิเสธไม่ได้
FlipTack

@FlipTack Ah คุณพูดถูก ในกรณีที่ลืมฉันเคยพูดมัน :)
Kevin Cruijssen

4

Python2.6 ( 29 ) ( 71 ) ( 57 ) ( 52 ) (43)

z=len(range(2,abs(x),3))
print (z,-z)[x<0]

print len(range(2,input(),3))

แก้ไข - เพิ่งรู้ว่าเราต้องจัดการกับจำนวนเต็มลบเช่นกัน จะแก้ไขในภายหลัง

แก้ไข 2 - แก้ไข

แก้ไข 3 - บันทึก 5 ตัวอักษรโดยทำตามคำแนะนำของ Joel Cornett

แก้ไข 4 - เนื่องจากอินพุตไม่จำเป็นต้องมาจาก STDIN หรือ ARGV จึงต้องบันทึก 9 ตัวอักษรโดยไม่รับอินพุตใด ๆ จาก stdin


ไปข้างหน้ากับabs()
defhlt

สั้นลงที่ต้องทำprint z if x==abs(x) else -z
Joel Cornett

ยังดีกว่าprint (z,-z)[x<0]
โจเอลคอร์เน็ตต์

@ ArtemIce ขอบคุณเพียงตระหนักฉันสามารถใช้ที่หลังจากอ่านคำตอบข้างต้นอีก
elssar

@JoelCornett humm ไม่รู้เกี่ยวกับสิ่งนั้นขอบคุณ
elssar

4

Javascript, 47 29

ใช้ในการสร้างแบบไดนามิกeval /ใช้+สำหรับการต่อสายอักขระเท่านั้นไม่ใช่การเพิ่ม

alert(eval(prompt()+"\57"+3))

แก้ไข: ใช้"\57"แทนString.fromCharCode(47)


-1 alert(eval(prompt()+"\573"))?
Shieru Asakoto

4

ทับทิม ( 43 22 17)

ไม่ใช่แค่กอล์ฟเท่านั้น แต่ยังมีความสง่างามด้วยเช่นกัน :)

p Rational gets,3

ผลผลิตจะเป็นเช่น(41/1)ไร ถ้ามันต้องเป็นจำนวนเต็มเราต้องเพิ่ม.to_iในผลลัพธ์และถ้าเราเปลี่ยนto_iเป็นto_fเราจะได้ผลลัพธ์สำหรับการลอยด้วย


1
ทำงานโดยไม่ต้องใช้rationalบรรทัดบน Ruby 1.9.3 การไม่ใส่วงเล็บจะประหยัดอักขระอีกหนึ่งตัว
steenslag

4

TI-Basic, 8 ไบต์

ชนะ? :)

int(mean({Ans,0,0

PS ปัดเศษไปหาอนันต์เพื่อหาจำนวนลบ (ดูที่นี่เพื่อหาสาเหตุ) หากต้องการปัดเศษเป็นศูนย์แทนให้แทนที่int(ด้วยiPart(ไม่มีการเปลี่ยนแปลงไบต์

กรณีทดสอบ

-4:prgmDIVIDE
              -2
11:prgmDIVIDE
               3
109:prgmDIVIDE
              36

3

Python 2.x, 54 53 51

print' -'[x<0],len(range(*(2,-2,x,x,3,-3)[x<0::2]))

_เงินปันผลอยู่ที่ไหนและถูกป้อนเป็นเช่นนี้

>>> x=-19
>>> print' -'[x<0],len(range(*(2,-2,x,x,3,-3)[x<0::2]))
- 6

หมายเหตุ: ไม่แน่ใจว่าอนุญาตให้ใช้ล่ามแบบโต้ตอบหรือไม่ แต่ตาม OP: "อินพุตสามารถอยู่ใน STDIN หรือ ARGV หรือป้อนด้วยวิธีอื่น"

แก้ไข: ตอนนี้สำหรับ python 3 (ทำงานใน 2.x แต่พิมพ์ tuple) ทำงานร่วมกับเนกาทีฟ


ทำงานใน python 3 ด้วยหรือไม่
หอยทากเครื่องกล

ไม่จำเป็นต้องห้อยได้ มี__len__เพียงพอ
หอยทากเครื่องกล

len(range(100,1000))ให้900ใน 3.2.3 บน linux
หอยทากเครื่องกล

วิธีนี้ใช้ไม่ได้กับจำนวนลบ และlen(xrange(0,_,3))จะสั้นลงและเร็วขึ้นอย่างหนาแน่นเลยล่ะค่ะ
grc

@ เครื่องกล: รูปถ่ายจุด ฉันยอมรับ มันใช้งานได้ใน 3
โจเอลคอร์เน็ตต์

3

C ++, 191

ด้วยหลักและรวมถึง 246 โดยไม่มีหลักและรวมเป็นเพียง 178 บรรทัดใหม่นับเป็น 1 ตัว ถือว่าตัวเลขทั้งหมดเป็นแบบไม่ได้ลงนาม ฉันไม่ได้รับคำเตือนสำหรับการคืนหลัก int ที่ไม่ได้ลงนามดังนั้นเกมที่ยุติธรรม

ครั้งแรกที่ฉันส่ง codegolf

#include<iostream>
#define R return
typedef unsigned int U;U a(U x,U y){R y?a(x^y,(x|y^x^y)<<1):x;}U d(U i){if(i==3)R 1;U t=i&3,r=i>>=2;t=a(t,i&3);while(i>>=2)t=a(t,i&3),r=a(r,i);R r&&t?a(r,d(t)):0;}U main(){U i;std::cin>>i,std::cout<<d(i);R 0;}

ใช้กะเพื่อหารจำนวน 4 ซ้ำ ๆ กันและคำนวณผลรวม (ซึ่งแปรสภาพเป็น 1/3)

pseudocode:

// typedefs and #defines for brevity

function a(x, y):
    magically add x and y using recursion and bitwise things
    return x+y.

function d(x):
    if x = 3:
        return 1.
    variable total, remainder
    until x is zero:
        remainder = x mod 4
        x = x / 4
        total = total + x
    if total and remainder both zero:
        return 0.
    else:
        return a(total, d(remainder)).

นอกจากนี้ฉันสามารถกำจัดวิธีการหลักโดยการตั้งชื่อ d main และทำให้มันใช้ถ่าน ** และใช้โปรแกรมคืนค่าเป็นผลลัพธ์ มันจะคืนค่าจำนวนอาร์กิวเมนต์บรรทัดคำสั่งหารด้วยสามปัดเศษลง วิธีนี้ทำให้ความยาวของโฆษณา 191:

#define R return
typedef unsigned int U;U a(U x,U y){R y?a(x^y,(x|y^x^y)<<1):x;}U main(U i,char**q){if(i==3)R 1;U t=i&3,r=i>>=2;t=a(t,i&3);while(i>>=2)t=a(t,i&3),r=a(r,i);R r&&t?a(r,d(t)):0;}

3

Golfscript - 13 ตัวอักษร

~3base);3base

ดูเหมือนจะไม่จัดการกับการป้อนข้อมูลเชิงลบ
res

1
@res s/seem to //:(. ฉันจะต้องคิดเกี่ยวกับมัน
gnibbler

3

PowerShell 57 หรือ 46

ใน 57 อักขระที่ใช้%เป็นตัวดำเนินการ PowerShell foreach ไม่ใช่แบบโมดูโล วิธีการแก้ปัญหานี้สามารถยอมรับจำนวนเต็มบวกหรือลบ

(-join(1..(Read-Host)|%{1})-replace111,0-replace1).Length

ใน 46 ตัวอักษรหาก*ได้รับอนุญาตให้เป็นผู้ดำเนินการทำซ้ำสตริงไม่คูณ ตัวเลือกนี้ต้องการจำนวนเต็มบวกเป็นค่าป้อนเข้า

("1"*(Read-Host)-replace111,0-replace1).Length

หากคุณกลับมาอีกครั้งฉันโพสต์การแก้ไขข้อบกพร่อง หากคุณต้องการให้ฉันลบของฉันและรวมการเปลี่ยนแปลงเป็นของคุณเพียงแจ้งให้เราทราบ
Veskah

3

R

สิ่งเหล่านี้ใช้ได้กับจำนวนเต็มบวกเท่านั้น:

max(sapply(split(1:x,1:3), length))
# Gives a warning that should be ignored

หรือ:

min(table(rep(1:3, x)[1:x]))

หรือ:

length((1:x)[seq(3,x,3)])

หรือ:

sum(rep(1,x)[seq(3,x,3)])

[[แก้ไข]] และหนึ่งที่น่าเกลียด:

trunc(sum(rep(0.3333333333, x)))

[[แก้ไข 2]] และอาจเป็นสิ่งที่ดีที่สุด - ได้รับแรงบันดาลใจจากรหัส matlab ข้างต้นโดย Elliot G:

length(seq(1,x,3))

ฉันต้องการใช้ความคิดเดียวกันกับใน EDIT2 ของคุณ แต่ไม่ได้ผลกับจำนวนลบ:wrong sign in 'by' argument
Andreï Kostyrka

3

SmileBASIC, 58 51 36 ไบต์ (ไม่มีฟังก์ชั่นทางคณิตศาสตร์!)

INPUT N
BGANIM.,4,-3,N
WAIT?BGROT(0)

คำอธิบาย:

INPUT N           'get input
BGANIM 0,"R",-3,N 'smoothly rotate background layer 0 by N degrees over 3 frames
WAIT              'wait 1 frame
PRINT BGROT(0)    'display angle of layer 0

โปรแกรมย้ายเลเยอร์พื้นหลังอย่างราบรื่นมากกว่า 3 เฟรมจากนั้นรับมุมตามหลัง 1 เฟรมเมื่อมันเดินทางไป 1/3 ของระยะทางทั้งหมด

รุ่นส่วนลอยขนาด 38 ไบต์:

INPUT N
BGANIM.,7,-3,N
WAIT?BGVAR(0,7)

คำอธิบาย:

INPUT N           'input
BGANIM 0,"V",-3,N 'smoothly change layer 0's internal variable to N over 3 frames
WAIT              'wait 1 frame
PRINT BGVAR(0,7)  'display layer 0's internal variable

3

Haskell 41 39 ตัวอักษร

ทำงานร่วมกับชุดเต็มของจำนวนเต็มบวกและลบ

f n=sum[sum$1:[-2|n<0]|i<-[3,6..abs n]]

แรกสร้างรายชื่อ 1 หรือ (-1) 's (ขึ้นอยู่กับสัญญาณของการป้อนข้อมูล) สำหรับทุกจำนวนเต็มสามจาก 0 nจนถึงการป้อนข้อมูล abs(n)สำหรับจำนวนลบรวม

เช่น n=8 -> [0,3,6]

จากนั้นส่งคืนผลรวมของรายการนี้


ไม่ทำงานกับจำนวนลบ (-3/3 คือ -1 ไม่ใช่ 1)
คอร์แม็ก

ดีที่คุณทำให้มันทำงานกับจำนวนลบ แต่คุณไม่สามารถใช้ / อ่านข้อกำหนด
คอร์แม็ก

โอ้โหคุณได้ฉันสองครั้ง แก้ไขแล้วทั้งหมด))
Charl Kruger

ดี! Btw คุณจะได้รับ 39 ตัวอักษรพร้อม fn = sum [รวม $ 1: [- 2 | n <0] | i <- [3,6..abs n]]
Cormac

2

Clojure, 87; ทำงานร่วมกับเนกาทีฟ ขึ้นอยู่กับ lazyseqs

(defn d[n](def r(nth(apply interleave(repeat 3(range)))(Math/abs n)))(if(> n 0)r(- r)))

Ungolfed:

(defn d [n]
  (let [r (nth (->> (range) (repeat 3) (apply interleave))
               (Math/abs n))]
        (if (pos? n)
          r
          (- r))))

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