Chia số cho 3 mà không sử dụng toán tử *, /, +, -,%


48

Trích dẫn câu hỏi này trên SO (Spoiler alert!):

Câu hỏi này đã được hỏi trong một cuộc phỏng vấn của Oracle.

Làm thế nào bạn có thể chia một số cho 3 mà không sử dụng toán tử *, /, +, -,%,?

Số có thể được ký hoặc không dấu.

Nhiệm vụ có thể giải quyết được, nhưng hãy xem liệu bạn có thể viết mã ngắn nhất không.

Quy tắc:

  • Thực hiện phép chia số nguyên cần thiết ( /3)
  • Không sử dụng các nhà khai thác không dựa trên văn bản *, /, +, -, hoặc %(hoặc tương đương của họ, chẳng hạn như __div__hay add()). Điều này cũng áp dụng cho các toán tử tăng và giảm, như i++hoặc i--. Sử dụng các toán tử để nối chuỗi và định dạng là OK. Sử dụng các ký tự này cho các toán tử khác nhau, chẳng hạn như toán tử đơn nguyên -cho các số âm hoặc *để biểu thị một con trỏ trong C cũng được.
  • Giá trị đầu vào có thể lớn tùy ý (bất cứ hệ thống nào của bạn có thể xử lý), cả tích cực và tiêu cực
  • Đầu vào có thể trên STDIN hoặc ARGV hoặc nhập bất kỳ cách nào khác
  • Tạo mã ngắn nhất bạn có thể làm như trên

1
Làm thế nào để kết quả được làm tròn khi tích cực? Làm thế nào khi tiêu cực?
dfeuer

Câu trả lời:


15

J, 45 44 10 ký tự

".,&'r3'":

Hoạt động với tiêu cực:

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

": - định dạng dưới dạng văn bản

,&'r3'- nối r3đến cuối

". - thực hiện chuỗi, ví dụ 15r3


1
Nó hoạt động nếu bạn làm 3 3 3 #: 9. Có vẻ như bạn cần phải biết số lượng ternary của bạn sẽ là bao lâu. _3]\i.cũng là một điểm khởi đầu khả dĩ cho một cái gì đó, nhưng tôi không biết liệu nó có ngắn hơn giải pháp của bạn ở đây không. Vấn đề với #_3]\i.nó là nó luôn luôn làm tròn thay vì xuống.
Gareth

1
Có thể ##~3=_3#\i.cho 11 ký tự?
Gareth

1
Trên thực tế, bạn có thể thu nhỏ của bạn xuống còn 10 ký tự ##~0 0 1$~.
Gareth

1
Bạn có thể thu nhỏ nó xuống bằng cách sử dụng hook 3#.}:(#:~$&3)nhưng nó vẫn dài hơn và nó không khắc phục được vấn đề số âm.
Gareth

1
Có, bạn có thể sử dụng chức năng Nguồn ^: hoặc Chương trình nghị sự @. cho một ifhoặc if...elsethay thế. Trong trường hợp này, bạn có thể sử dụng @.hai động từ được kết nối với một ký tự '`' (một gerund trong J-speak) để chọn một hoặc một động từ khác dựa trên một điều kiện.
Gareth

56

C, 167503724710

Đây là giải pháp của tôi cho vấn đề. Tôi thừa nhận không có khả năng chiến thắng trong một cuộc thi golf mã nghiêm ngặt, nhưng nó không sử dụng bất kỳ thủ thuật nào để gián tiếp gọi chức năng phân chia tích hợp, nó được viết bằng C di động (như câu hỏi Stack Overflow ban đầu được yêu cầu), nó hoạt động hoàn hảo đối với các số âm và mã đặc biệt rõ ràng và rõ ràng.

Chương trình của tôi là đầu ra của tập lệnh sau:

#!/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));}''')

Số ký tự: 71 + 39 * 2 ** 32 + 95 = 167503724710

Điểm chuẩn

Người ta đã hỏi nó sẽ mất bao lâu và sử dụng bao nhiêu bộ nhớ, vì vậy đây là một số điểm chuẩn:

  • Thời gian thực thi tập lệnh - Chạy ./test.py | pv --buffer-size=1M --average-rate > /dev/nulltrong khoảng 30 giây cho tốc độ khoảng 14,8 MB / s. Tốc độ đầu ra hợp lý có thể được giả định là gần như không đổi, vì vậy thời gian chạy để hoàn thành nên vào khoảng 167503724710 B / (14.8 * 1048576 B / s) 10794 s.
  • Thời gian biên dịch - Trình biên dịch TCC yêu cầu biên dịch mã C với tốc độ 29,6 MB / s , thời gian biên dịch là 167503724710 B / (29,6 * 1048576 B / s) 397 5394 s. (Tất nhiên điều này có thể chạy trong một đường ống với kịch bản.)
  • Kích thước của mã được biên dịch - Tôi đã thử ước tính nó bằng cách sử dụng ./test.py | tcc -c - -o /dev/stdout | pv --buffer-size=1M --average-rate > /dev/null, nhưng dường như tccnó không xuất ra bất cứ thứ gì cho đến khi nó đọc toàn bộ tệp nguồn.
  • Sử dụng bộ nhớ để chạy - Vì thuật toán là tuyến tính (và tcc không tối ưu hóa trên các dòng), nên chi phí sử dụng bộ nhớ chỉ là vài kilobyte (tất nhiên ngoài chính mã).

22
Đây là hình ảnh thu nhỏ của mã hóa cứng. ++++++++++
Joe Z.

4
Điều đó đang được nói, tôi chắc chắn nếu bạn đưa cho họ một tệp nguồn 160 GB và yêu cầu họ biên dịch và kiểm tra nó, họ sẽ nhìn bạn như thể bạn bị điên.
Joe Z.

16
Nếu ông chủ của tôi yêu cầu tôi tính một phép chia cho ba mà không có - + / *% tôi sẽ nghĩ rằng anh ta bị điên.
Mikaël Mayer

Tuy nhiên, a[b]là một đường cú pháp cho *(a + b), mà bổ sung.
Konrad Borowski

12
@NicolasBarbulesco Có giới hạn kích thước đối với câu trả lời Stack Exchange.
TimTech

38

Ruby 28

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

Để chia cho 3, chúng ta chỉ cần xóa số 0 trong số 3 cơ sở: 120 -> 11110 -> 1111 -> 40

Hoạt động với tiêu cực:

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

Hồng ngọc, 60 45

Ngoài ra, w / o sử dụng chuyển đổi cơ sở:

d = -> n {x = n.abs; r = (0..1.0 / 0) .step (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
Việc thay thế mà không chuyển đổi cơ sở có /toán tử bị cấm nơi Float::INFINITYđã trở thành 1.0/0. Với Ruby 2.1, một trong những sân golf may (0..1.0/0).step(3)vào 0.step(p,3), tháo /. Vấn đề lớn hơn là -rsử dụng -để phủ nhận. Nó có giá 5 ký tự thay đổi -rđể ~r.pred, lạm dụng Integer # pred trừ 1 mà không cần người điều khiển trừ.
hạt nhân

26

Toán học, 13 ký tự

Mean@{#,0,0}&

Điều này là xấu xa: DI đoán bạn có thể lưu &và sử dụng một biến đơn giản (những người khác ở đây cũng làm điều đó).
Yves Klett

3
@YvesKlett: Có nghĩa là xấu xa vốn có.
GuitarPicker

18

JavaScript, 56

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

Tạo một chuỗi độ dài nlặp lại ,s và thay thế ,,,bằng 1. Sau đó, nó đo chiều dài kết quả của chuỗi. (Hy vọng unary -được cho phép!)


+1 nhưng nó không hoạt động với các giá trị âm
Francesco Casula

Uh, câu hỏi ... làm thế nào để tính này? Nó sử dụng -toán tử phủ định.
Patrick Roberts

@Patrick Tôi lấy thông số kỹ thuật có nghĩa là không trừ - nếu bạn muốn, bạn có thể thay thế -~bằngparseInt()
Casey Chu

@CaseyChu giá trị được trả về -~prompt()là lớn hơn một parseInt(prompt()). Không chắc chắn cách bạn đối phó với điều đó.
Patrick Roberts

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

16

Con trăn, 41 38

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

xrange dường như có thể xử lý số lượng lớn (tôi nghĩ rằng giới hạn này giống như trong một thời gian dài trong C) gần như ngay lập tức.

>>> x = -72
-24

>>> x = 9223372036854775806
3074457345618258602

2
10/3bằng 3, không phải 4.
Joel Cornett

Làm print" -"[x<0]+len (phạm vi (2, abs (x), 3)) `` sẽ cạo nó xuống 39 ký tự
Joel Cornett

định dạng bình luận của golfexchange đang làm rối tung nó lên. ở trên tôi đã sử dụng backticks để gửi kèm theo len()cách viết tắt chorepr()
Joel Cornett

Tôi đã cập nhật nó. Tôi không thể sử dụng range, vì nó thực sự sẽ tạo ra danh sách. xrangechỉ giả vờ, vì vậy nó có thể xử lý số lượng lớn mà không lãng phí thời gian / bộ nhớ.
grc

2
Giả vờ đó là Python 3;) Tôi thích btw char.
Joel Cornett

11

Haskell, 90 106

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

Tạo một danh sách tra cứu vô hạn (lười biếng) [(0,0),(0,0),(-1,0),(1,0),(-2,0),(2,0),(-3,-1),(3,1), ...], cắt xén tất cả các yếu tố không khớp n( /=là bất đẳng thức trong Haskell) và trả về cái đầu tiên.

Điều này trở nên đơn giản hơn nhiều nếu không có số âm:

25 27

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

chỉ cần trả về nphần tử thứ của danh sách [0,0,0,1,1,1,2, ...].


3
Tôi không bao giờ nghĩ đến giải pháp thứ hai đó. Tôi có thể thực hiện một cái gì đó tương tự như vậy trong python
acolyte

8

C #, 232 byte

Golf mã đầu tiên của tôi ... Và vì không có C # nào và tôi muốn thử một phương pháp khác không được thử ở đây, tôi nghĩ rằng tôi sẽ thử. Giống như một số người khác ở đây, chỉ có số không âm.

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);}}

Ung dung

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
Khoảng 5 năm sau .. Bạn có thể tiết kiệm 1 byte bằng cách xóa khoảng trống khỏi string[] g, biến nó thànhstring[]g
Metoniem

Trích dẫn "Không sử dụng các toán tử không dựa trên văn bản *, /, +, - hoặc% (hoặc tương đương của chúng, như div hoặc add ()" - bạn không sử dụng tương đương - .Add?
Jonathan Frech

@JonathanFrech Phương thức thêm đó không hoạt động trên hai số, nó chỉ thêm một giá trị vào bộ sưu tập
Hiện thân của sự thiếu hiểu biết

7

Perl (26 22)

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

Phiên bản này (ab) sử dụng công cụ regex của Perl. Nó đọc một số làm đối số dòng lệnh cuối cùng ( pop) và xây dựng một chuỗi 3s có độ dài này ( "3" x $number). Toán tử thay thế regex ( s///ở đây được viết bằng các dấu phân cách khác nhau vì các quy tắc của câu đố và với gcờ thùy) thay thế ba ký tự bằng chuỗi rỗng và trả về số lượng thay thế, là số nguyên đầu vào - chia cho ba. Nó thậm chí có thể được viết mà không có 3, nhưng phiên bản trên trông buồn cười hơn.

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

2
Này @memowe, làm tốt lắm! Bạn có thể tiết kiệm thêm một vài ký tự (4) bằng cách thực hiện $_=3x pop;say s|333||g.
Dom Hastings

2
Khi đầu vào là 0, 1 hoặc 2, thì nó sẽ in một chuỗi trống. Nếu nó cần in 0, thì nó cần thêm 3 ký tự (tổng cộng 25) : '$_=3x pop;say s|333||g||0. Chậm với số lớn như 99999999 và không hoạt động với số âm.
hạt nhân

1
Sử dụng -ptrên dòng lệnh và bạn có thể làm: $_=3x$_;$_=0|s|...||gvới tổng số 22, bao gồm cả phạm vi đầu vào 0, 1 hoặc 2.
Xcali

6

C, 160 ký tự

Ký tự theo giải pháp phân chia dài ký tự bằng cách sử dụng các bảng tra cứu, tức là không có chuỗi atoi () hoặc printf () để chuyển đổi giữa các chuỗi cơ sở 10 và số nguyên.

Đầu ra đôi khi sẽ bao gồm một số không hàng đầu - một phần của sự quyến rũ của nó.

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]);
}

Ghi chú:

  • lạm dụng truy cập mảng để thực hiện bổ sung.
  • biên dịch với clang 4.0, các trình biên dịch khác có thể barf.

Kiểm tra:

./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

Con trăn 42

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

Vì mọi giải pháp được đăng ở đây mà Ive đã kiểm tra số thập phân ở đây là giải pháp của tôi thực hiện điều đó.

Con trăn 50 51

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

Vì python không phân chia sàn, đây là giải pháp của tôi thực hiện điều đó.

Số nguyên đầu vào nằm trong biến x.

Đã thử nghiệm trong Python 2.7 nhưng tôi nghi ngờ nó cũng hoạt động trong 3.


+1 Để cung cấp cả hai lựa chọn thay thế cho tình huống giá trị âm. Vì đã có rất nhiều câu trả lời, tôi sẽ không điều chỉnh thông số kỹ thuật để loại trừ một hoặc tùy chọn khác, mặc dù cá nhân tôi đồng ý rằng đó -3là câu trả lời chính xác -10/3.
Gaffi

Dành cho những người quan tâm đến việc phân chia sàn trong python: python-history.blogspot.com/2010/08/NH
Matt

những gì với phép nhân và phép trừ trong giải pháp thứ hai của bạn?
gian hàng

@boothby Giải pháp thứ hai thực hiện phân chia sàn. Tôi muốn thực hiện phạm vi (0, abs (x), 3) cho các số âm và phạm vi (2, abs (x), 3) cho các số dương. Để làm được điều đó, tôi đã có phạm vi (2 ... sau đó tôi đã trừ 2 khi x âm. X <0 là True khi x âm, (Đúng) * 2 == 2
Matt

Tôi không hiểu sự khác biệt giữa phân chia sàn và số thập phân rút gọn. Điều này có phải với sự phân chia tiêu cực?
Joel Cornett

6

JavaScript, 55

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

Nếu một người không thể sử dụng -1, thì đây là phiên bản thay thế nó ~0(cảm ơn Peter Taylor!).

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

1
@ArtemIce One ~là một toán tử Bitwise giúp đảo các bit của toán hạng (đầu tiên chuyển đổi nó thành một số). Đây là cách ngắn nhất để chuyển đổi một chuỗi thành một số (theo như tôi biết).
Bọ rùa

1
Tôi cảm thấy như sử dụng phân tích cú pháp / chuyển đổi chuỗi là gian lận, vì nó là một quá trình rất phức tạp và tốn kém so với các hoạt động bitwise, b) sử dụng các toán tử bị cấm trong nội bộ và c) sẽ chiếm nhiều ký tự hơn so với giải pháp homerolled. Kiểu như mọi người trở nên gắt gỏng khi bạn sử dụng các loại được xây dựng khi được yêu cầu thực hiện quicksort.
Wug

1
@Sam Ngoài ra, ~~chuyển đổi thành một số nguyên, trái ngược với +.
Bọ rùa

1
@Wug Đó là codegolf, do đó, nó không phải là về hiệu quả trừ khi được chỉ định trong nhiệm vụ.
defhlt

3
+1 để tận dụng các căn cứ khác nhau. Đó là một trong những kỹ thuật chơi gôn JavaScript yêu thích của tôi.
DocMax

6

C 83 ký tự

Số cần chia được truyền qua stdin và nó trả về dưới dạng mã thoát từ main()(% ERRORLEVEL% trong CMD). Mã này lạm dụng một số phiên bản của MinGW ở chỗ khi tối ưu hóa không bật, nó coi giá trị gán cuối cùng là câu lệnh trả về. Nó có thể được giảm một chút. Hỗ trợ tất cả các số có thể phù hợp với mộtint

Nếu phủ định unary (-) không được phép: (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;}

Nếu đơn phương phủ định IS được phép: (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;}

EDIT: ugoren đã chỉ ra cho tôi rằng - ~ là một sự gia tăng ...

83 Ký tự nếu phủ định đơn phương được cho phép: 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;}

Nếu phủ định unary được cho phép, x+3-~-~-~x.
ugoren

Cảm ơn vì điều đó. Tôi không biết tại sao điều đó không bao giờ xảy ra với tôi. Tôi đoán tôi đã không nhận ra bạn có thể xếp chồng unaries một cách vô cớ hehe.
Kaslai

5

C, 139 ký tự

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);}

Chạy với số là đối số dòng lệnh

  • Xử lý cả số âm và số dương

Kiểm tra:

 ./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

Chỉnh sửa:

  • đã lưu 10 ký tự bằng cách xáo trộn phép cộng (A) để loại bỏ các biến cục bộ.

1
Hoàn thành tốt Tôi đã cố gắng hết sức để xoay vòng một chút và đạt được con số 239. Tôi không thể quay đầu lại A, chức năng của tôi chỉ kiểm tra bit i ở số n. Có tiêu chuẩn C cho phép bỏ qua khai báo kiểu hoặc đó là một số điều biên dịch?
shiona

1
C sẽ giả sử int nếu không xác định.
Wug

5

ZSH - 31 20/21

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

Đối với số âm:

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

Với số âm (ZSH + bc) -62 61

Tôi có lẽ không nên đưa ra hai chương trình như câu trả lời của mình, vì vậy đây là một chương trình hoạt động cho bất kỳ dấu hiệu số nào:

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

Điều này sử dụng thủ thuật chuyển đổi cơ sở tương tự như câu trả lời của Artem Ice .


5

C, 81 73 ký tự

Chỉ hỗ trợ các số không âm.

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

Ý tưởng là sử dụng con trỏ arithemtic. Số được đọc vào con trỏ x, không trỏ đến bất cứ đâu. &x[~2]= &x[-3]= x-3được sử dụng để trừ 3. Điều này được lặp lại miễn là số ở trên 2. iđếm số lần thực hiện ( &i[1]= i+1).


Cố gắng để hiểu mã, ai đó làm sáng tỏ? Cảm ơn
Cong Hui

@Chui, thêm lời giải thích.
ugoren

@ugoren theo như tôi hiểu, không nên in printf ("% d") in ra con trỏ địa chỉ bộ nhớ tôi giữ trong Hex? Tại sao nó lại in ra một số nguyên? hoặc char * i được khởi tạo để trỏ đến địa chỉ bộ nhớ 0 theo mặc định? Cảm ơn
Cong Hui

5

Java 86 79

Giả sử số nguyên nằm trong y:

Chuyển đổi thành một chuỗi trong cơ sở 3, loại bỏ ký tự cuối cùng (dịch chuyển bên phải ">>" trong cơ sở 3), sau đó chuyển đổi trở lại thành số nguyên.

Hoạt động cho số âm.

Nếu số, y, là <3 hoặc> -3, thì nó cho 0.

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

Lần đầu tiên đăng bài trên mã golf. =) Vì vậy, không thể bình luận nào.

Thx Kevin Cruijssen cho lời khuyên.


Tôi biết rằng nó đã được hơn hai năm trước, nhưng bạn có thể chơi một vài phần: &&to &và 2x Integerto Long. (Ngoài ra, tại sao bạn sử dụng ~2thay vì chỉ -3? Chúng có cùng số byte.)
Kevin Cruijssen 7/11/2016

1
@KevinCruijssen Thật hoài niệm để chỉnh sửa bài viết đầu tiên của tôi sau một thời gian dài. Không chắc tại sao tôi nghĩ ~ 2 lại tốt hơn thế.
Vectorized

2
@KevinCruijssen tốt, thử thách nói rằng bạn không được phép sử dụng -, nhưng tôi không biết nếu điều đó được tính cho phủ định đơn phương.
FlipTack

@FlipTack Ah bạn hoàn toàn đúng. Trong trường hợp đó quên tôi từng nói nó. :)
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))

Chỉnh sửa - Chỉ cần nhận ra rằng chúng ta cũng phải xử lý các số nguyên âm. Sẽ sửa nó sau

Chỉnh sửa2 - Đã sửa

Edit3 - Đã lưu 5 ký tự bằng cách làm theo lời khuyên của Joel Cornett

Chỉnh sửa4 - Vì đầu vào không nhất thiết phải từ STDIN hoặc ARGV, đã lưu 9 ký tự bằng cách không lấy bất kỳ đầu vào nào từ stdin


Hãy tiếp tục vớiabs()
defhlt

ngắn hơn để làmprint z if x==abs(x) else -z
Joel Cornett

tốt hơn nữa,print (z,-z)[x<0]
Joel Cornett

@ArtemIce cảm ơn, chỉ nhận ra tôi có thể sử dụng nó sau khi đọc câu trả lời khác ở trên.
elssar

@JoelCornett humm, không biết về điều đó, cảm ơn
elssar

4

Javascript, 47 29

Sử dụng evalđể tạo động a /. +Chỉ sử dụng để nối chuỗi, không thêm.

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

EDIT: Được sử dụng "\57"thay vìString.fromCharCode(47)


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

4

Hồng ngọc ( 43 22 17)

Không chỉ golf, mà còn sang trọng :)

p Rational gets,3

Đầu ra sẽ như thế nào (41/1). Nếu nó phải là số nguyên thì chúng ta phải thêm .to_ivào kết quả và nếu chúng ta thay đổi to_ithành to_fthì chúng ta cũng có thể nhận đầu ra cho số float.


1
Hoạt động mà không cần rationaldòng yêu cầu trên Ruby 1.9.3. Bỏ dấu ngoặc sẽ lưu thêm một char .
steenslag

4

TI-Basic, 8 byte

Người chiến thắng? :)

int(mean({Ans,0,0

Vòng PS hướng tới vô cực cho số âm (xem tại đây để biết lý do). Để làm tròn thành 0 thay thế, thay thế int(bằng iPart(không thay đổi byte.

Các trường hợp thử nghiệm

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

3

Trăn 2.x, 54 53 51

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

Trong trường hợp _là cổ tức và được nhập như vậy.

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

Lưu ý: Không chắc chắn nếu sử dụng trình thông dịch tương tác có được phép hay không, nhưng theo OP: "Đầu vào có thể trên STDIN hoặc ARGV hoặc nhập bất kỳ cách nào khác"

Chỉnh sửa: Bây giờ cho python 3 (hoạt động trong 2.x, nhưng in một tuple). Hoạt động với tiêu cực.


Hoạt động trong python 3 là tốt?
Ốc cơ khí

Không phải đăng ký; có __len__là đủ
Ốc cơ khí

len(range(100,1000))đưa ra 9003.2.3 trên linux.
Ốc cơ khí

Điều này không làm việc cho các số âm. Và len(xrange(0,_,3))ngắn hơn và ồ ạt nhanh hơn.
grc

@M cơ chế: Điểm lấy. Tôi thừa nhận. Nó hoạt động vào ngày 3.
Joel Cornett

3

C ++, 191

Với chính và bao gồm, 246, không có chính và bao gồm, nó chỉ có 178. Dòng mới được tính là 1 ký tự. Xử lý tất cả các số là không dấu. Tôi không nhận được cảnh báo vì đã trả lại chính một số không dấu để trò chơi công bằng.

Lần đầu tiên tôi gửi 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;}

sử dụng ca làm việc để chia số cho 4 lần liên tục và tính tổng (sẽ hội tụ đến 1/3)

Mã giả:

// 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)).

Bên cạnh đó, tôi có thể loại bỏ phương thức chính bằng cách đặt tên d main và làm cho nó lấy char ** và sử dụng giá trị trả về của chương trình làm đầu ra. Nó sẽ trả về số lượng đối số dòng lệnh chia cho ba, làm tròn xuống. Điều này mang lại chiều dài của nó cho quảng cáo 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 ký tự

~3base);3base

dường như không xử lý đầu vào tiêu cực
res

1
@res s/seem to //:(. Tôi sẽ phải suy nghĩ về điều đó
gnibbler

3

PowerShell 57 hoặc 46

Trong 57 ký tự sử dụng %làm toán tử foreach PowerShell, không phải modulo. Giải pháp này có thể chấp nhận số nguyên dương hoặc âm.

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

Trong 46 ký tự nếu *được phép là toán tử lặp lại chuỗi, không nhân. Tùy chọn này yêu cầu số nguyên dương làm giá trị đầu vào.

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

Nếu bạn quay trở lại, tôi đã đăng một bản sửa lỗi. Nếu bạn muốn tôi xóa của tôi và kết hợp thay đổi vào của bạn, chỉ cần cho tôi biết.
Veskah

3

R

Chúng chỉ hoạt động với số nguyên dương:

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

Hoặc là:

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

Hoặc là:

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

Hoặc là:

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

[[EDIT]] Và một cái xấu xí:

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

[[EDIT2]] Plus có lẽ là cái tốt nhất - lấy cảm hứng từ mã MATLAB ở trên bởi Elliot G:

length(seq(1,x,3))

Tôi muốn thực hiện ý tưởng tương tự như trong EDIT2 của bạn nhưng nó không hoạt động đối với các số âm:wrong sign in 'by' argument
Andreï Kostyrka

3

SmileBASIC, 58 51 36 byte (không có hàm toán học!)

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

Giải trình:

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

Chương trình di chuyển lớp nền mượt mà qua 3 khung hình, và sau đó lấy góc sau 1 khung hình, khi nó đã đi được 1/3 tổng quãng đường.

Phiên bản phân chia float, 38 byte:

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

Giải trình:

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 ký tự

Hoạt động với tập hợp đầy đủ các số nguyên dương và âm

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

Đầu tiên tạo danh sách 1 hoặc (-1) (tùy thuộc vào dấu hiệu của đầu vào) cho mỗi số nguyên thứ ba từ 0 cho đến đầu vào n. abs(n)cho các số âm bao gồm.

ví dụ n=8 -> [0,3,6]

Sau đó, nó trả về tổng của danh sách này.


Không hoạt động trên các số âm (-3/3 là -1 chứ không phải 1).
Cormac

Rất vui vì bạn đã làm cho nó hoạt động trên các số âm nhưng bạn không thể sử dụng /, đọc thông số kỹ thuật.
Cormac

Ôi trời, bạn đã cho tôi hai lần. Tất cả đã được sửa;)
Charl Kruger

Đẹp! Btw Bạn có thể nhận được 39 ký tự với fn = sum [tổng $ 1: [- 2 | n <0] | i <- [3,6..abs n]]
Cormac

2

Clojure, 87; làm việc với tiêu cực; dựa trên lazyseqs

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

Ung dung:

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.