*, /, +,-, % 연산자를 사용하지 않고 숫자를 3으로 나눕니다.


48

SO (Spoiler alert!) 에서이 질문을 인용 하면 :

이 질문은 오라클 인터뷰에서 제기되었습니다.

*, /, +,-, %, 연산자를 사용하지 않고 어떻게 숫자를 3으로 나누겠습니까?

숫자는 부호가 있거나 부호가 없을 수 있습니다.

작업은 해결할 수 있지만 가장 짧은 코드를 작성할 수 있는지 확인하십시오.

규칙 :

  • 필요한 정수 나누기 수행 ( /3)
  • 비 텍스트 기반 연산자를 사용하지 마십시오 *, /, +, -, 또는 %(또는 그 등가물과 같은 __div__또는 add()). 이는 i++또는 과 같은 증분 및 감소 연산자에도 적용됩니다 i--. 문자열 연결 및 형식 지정에 연산자를 사용할 수 있습니다. -음수에 대한 단항 연산자 와 같은 다른 연산자에 사용 하거나 *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 진수의 길이를 알아야 할 것 같습니다. _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교체 할 수 있습니다 . 이 경우 @.'`'문자 (J-speak의 gerund)로 연결된 두 동사 를 사용 하여 조건에 따라 하나를 선택할 수 있습니다.
Gareth

56

C, 167503724710

다음은 문제에 대한 해결책입니다. 엄격한 코드 골프 경쟁에서 이길 가능성은 없지만, 내장 된 부서 기능을 간접적으로 호출하는 트릭을 사용하지 않으며 휴대용 C로 작성되었습니다 (원래 스택 오버플로 질문이 요청 한대로), 완벽하게 작동합니다. 음수의 경우 코드가 명확하고 명확합니다.

내 프로그램은 다음 스크립트 의 출력 입니다.

#!/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.8MB / s의 속도가됩니다. 출력 속도는 상당히 일정하다고 가정 할 수 있으므로 완료까지의 실행 시간은 약 167503724710 B / (14.8 * 1048576 B / s) ≈ 10794 초 여야합니다.
  • 컴파일 시간 — TCC 컴파일러 는 29.6MB / s로 C 코드를 컴파일한다고 주장하므로 컴파일 시간은 167503724710B / (29.6 * 1048576B / s) ≈ 5397 초입니다. (물론 이것은 스크립트가있는 파이프 라인에서 실행될 수 있습니다.)
  • 컴파일 된 코드의 크기-을 사용하여 추정하려고했지만 전체 소스 파일을 읽을 때까지 아무것도 출력하지 않는 ./test.py | tcc -c - -o /dev/stdout | pv --buffer-size=1M --average-rate > /dev/null것 같습니다 tcc.
  • 실행할 메모리 사용량 — 알고리즘은 선형이므로 (tcc는 여러 라인에서 최적화되지 않기 때문에) 메모리 오버 헤드는 몇 킬로바이트 (물론 코드 자체 제외) 여야합니다.

22
이것은 하드 코딩의 전형입니다. ++++++++++
Joe Z.

4
즉, 160GB 소스 파일을 제공하고 컴파일 및 테스트를 요청한 경우, 당신이 미쳤다고 생각할 것입니다.
Joe Z.

16
상사가 나에게-+ / * %없이 3으로 나눗셈을 계산하도록 요청하면 그가 미친 것 같아요.
Mikaël Mayer

그럼에도 불구하고 a[b]에 대한 구문 설탕입니다 *(a + b).
Konrad Borowski

12
@NicolasBarbulesco 스택 교환 답변에는 크기 제한이 있습니다.
Timtech

38

루비 28

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

3으로 나누려면 기본 3 숫자에서 후행 0을 제거하면됩니다. 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) .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
기본 변환없이 대체가 금지 한 /경우 운영자 Float::INFINITY가되었다 1.0/0. Ruby 2.1을 사용하면을 ( (0..1.0/0).step(3)0.step(p,3)) 제거하고 로 이동할 수 /있습니다. 더 큰 문제는 부정에 -r사용 -하는 것입니다. 빼기 연산자없이 1을 빼려면 Integer # pred 를 남용하는 5 자로 변경 -r됩니다 . ~r.pred
kernigh

26

매스 매 티카, 13 문자

Mean@{#,0,0}&

이것은 사악합니다 : DI는 저장하고 &일반 변수를 사용할 수 있다고 생각합니다 (다른 사람들도 그렇게합니다).
이브 클레 트

3
@YvesKlett : 의미는 본질적으로 사악합니다.
기타 피커

18

자바 스크립트, 56

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

길이의 문자열을 만듭니다 n반복 ,들 및 대체 ,,,와 함께 1. 그런 다음 문자열의 결과 길이를 측정합니다. (단, 단항식 -은 허용됩니다!)


+1이지만 음수 값으로는 작동하지 않습니다
Francesco Casula

어, 질문 ... 어떻게 계산합니까? -부정 연산자를 사용합니다 .
Patrick Roberts

@Patrick 나는 뺄셈을 의미하지 않기 위해 사양을 채택했다 – 원한다면, 다음 -~과 같이 대체 할 수있다parseInt()
Casey Chu

@CaseyChu에서 반환 한 값 -~prompt()이보다 큽니다 parseInt(prompt()). 어떻게 처리 할 지 잘 모르겠습니다.
패트릭 로버츠

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의 long과 동일하다고 생각합니다).

>>> x = -72
-24

>>> x = 9223372036854775806
3074457345618258602

2
10/34.하지, 3과 동일
조엘 코 네트

이렇게 print" -"[x<0]+렌 (범위 (2, 복근은 (X), 3))``39 개 문자로 아래로 면도합니다
조엘 코 네트에게

golfexchange의 주석 형식이 엉망입니다. 위에서 나는 줄임표를 사용 len()하여 줄임말 로 동봉repr()
Joel Cornett

업데이트했습니다. range실제로 목록을 생성하기 때문에 사용할 수 없습니다 . xrange척하는 것이므로 시간 / 메모리를 낭비하지 않고 많은 수를 처리 할 수 ​​있습니다.
grc

2
파이썬 3 인 척하십시오.) 나는 단일 문자 슬라이싱 btw를 좋아합니다.
Joel Cornett

11

하스켈, 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( /=하스켈에서는 부등식) 첫 번째를 반환합니다.

음수가 없으면 훨씬 간단 해집니다.

25 27

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

단순히 n리스트 의 th 요소를 반환합니다 [0,0,0,1,1,1,2, ...].


3
나는 두 번째 해결책을 생각하지 못했습니다. 나는 파이썬에서 그런 것을 구현할 수 있을지도 모른다
acolyte a

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

언 골프

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

당신이 동등한를 사용하지 않는 - - "- 또는 % (또는) (사업부 또는 추가로 그 등가물, 비 텍스트 기반 사업자 *, /, +, 사용하지 마십시오"인용 .Add?
조나단 FRECH

@JonathanFrech이 add 메소드는 두 숫자에서 작동하지 않으며 컬렉션에만 값을 추가합니다.
무지의 구현

7

펄 (26 22)

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

이 버전 (ab)은 Perl의 정규식 엔진을 사용합니다. 마지막 명령 행 인수 ( pop) 로 숫자를 읽고이 3길이 ( "3" x $number) 의 s 문자열을 빌드합니다 . 정규식 대체 연산자 ( s///여기서 퍼즐 규칙으로 인해 다른 구분 기호와 g로벌 플래그로 작성 됨)는 세 개의 문자를 빈 문자열로 대체하고 대체 수를 리턴합니다.이 숫자는 3으로 정수로 나눈 입력 수입니다. 없이도 쓸 수 3있지만 위 버전은 더 재미있게 보입니다.

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

2
안녕하세요 @memowe, 훌륭합니다! 을 수행하면 몇 문자를 더 절약 할 수 있습니다 (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명령 행에서 사용 하면 다음을 수행 할 수 있습니다. $_=3x$_;$_=0|s|...||g0, 1 또는 2 입력 범위를 포함하여 총 22 개.
Xcali

6

C, 160 자

조회 테이블을 사용하는 문자 별 긴 나눗셈 솔루션, 즉 문자열 atoi () 또는 printf ()없이 기본 10 개의 문자열과 정수 사이를 변환합니다.

출력에는 때로는 선행 0이 포함됩니다-매력의 일부입니다.

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

노트 :

  • 추가를 구현하기 위해 배열 액세스를 남용합니다.
  • clang 4.0으로 컴파일하면 다른 컴파일러가 barf 할 수 있습니다.

테스트 :

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

파이썬 42

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

여기에 게시 한 모든 솔루션이 여기에서 소수점 이하 자르기를 수행하므로 내 솔루션이 그렇게합니다.

파이썬 50 51

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

파이썬은 층 분할을 수행하므로 여기에 그것을 구현하는 솔루션이 있습니다.

입력 정수는 변수 x에 있습니다.

파이썬 2.7에서 테스트되었지만 3에서도 작동한다고 생각합니다.


+1 음수 상황에 대한 두 가지 대안을 제공합니다. 이미 너무 많은 답변이 있기 때문에 하나 또는 다른 옵션을 제외하도록 사양을 조정하지는 않을 것입니다. 개인적으로는 이것이 -3정답 -10/3입니다.
Gaffi

python에서 플로어 분할에 관심이있는 사람들을 위해 : python-history.blogspot.com/2010/08/…
Matt

두 번째 솔루션의 곱셈과 뺄셈은 무엇입니까?
boothby

@boothby 두 번째 솔루션은 층 분할을 구현합니다. 음수의 경우 range (0, abs (x), 3)을, 양수의 경우 range (2, abs (x), 3)을 원했습니다. 그렇게하려면 범위가 (2 ... x가 음수 일 때 2를 빼고 x가 음수 일 때 X를 0으로 설정하고, (True) * 2 == 2
Matt

바닥 나누기와 잘림 소수의 차이점을 이해하지 못합니다. 이것은 음의 나눗셈과 관련이 있습니까?
Joel Cornett

6

자바 스크립트, 55

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

하나를 사용할 수 없다면 (Peter Taylor 덕분에) -1다음 버전으로 바꿉니다 ~0.

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

1
@ArtemIce One ~은 피연산자의 비트를 반전시키는 비트 연산자입니다 (먼저 숫자로 변환). 이것은 문자열을 숫자로 변환하는 가장 짧은 방법입니다 (아는 한).
Inkbug

1
a) 비트 연산에 비해 매우 복잡하고 비싼 프로세스, b) 내부에서 금지 된 연산자를 사용하고 c) 홈 롤링 된 솔루션보다 문자를 훨씬 많이 사용할 수 있기 때문에 문자열 구문 분석 / 변환을 사용하는 것이 부정적입니다. 퀵 정렬을 구현하라는 요청을 받았을 때 내장 정렬을 사용할 때 사람들이 심술 get은 방식과 비슷합니다.
Wug

1
@Sam 또한와 ~~반대로 정수로 변환합니다 +.
Inkbug

1
@Wug 코드 골프이므로 작업에 명시되지 않는 한 효율성에 관한 것이 아닙니다.
defhlt

3
다른 기지를 이용하여 +1 내가 가장 좋아하는 JavaScript 골프 기술 중 하나입니다.
DocMax

6

C 83 자

나누는 숫자는 stdin을 통해 전달되며 종료 코드 main()(CMD의 % ERRORLEVEL %) 로 반환합니다 . 이 코드는 일부 버전의 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

고마워 왜 그런 일이 일어 났는지 모르겠습니다. 나는 당신이 너무 단단하게 heary를 쌓을 수 있다는 것을 몰랐습니다.
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);}

명령 줄 인수로 숫자로 실행

  • 음수와 양수를 모두 처리

테스트 :

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

편집 :

  • 지역 변수를 제거하기 위해 덧셈 (A)을 섞어 10자를 절약했습니다.

1
잘 했어요 나는 비트 twiddling에서 최선을 다했고 239에 도착했다 A. 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 Ice의 답변 과 동일한 기본 변환 트릭을 ​​사용합니다 .


5

C, 81 73 자

음수가 아닌 숫자 만 지원합니다.

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

아이디어는 포인터 arithemtic을 사용하는 것입니다. 숫자는 포인터로 읽 히며 x, 아무 곳도 가리 키지 않습니다. &x[~2]= &x[-3]= x-3는 3을 빼는 데 사용됩니다.이 수가 2보다 i크면 반복됩니다.이 횟수 ( &i[1]= i+1)를 계산합니다.


코드를 이해하려고 누군가 누군가 빛을 비췄습니까? 감사합니다
Cong Hui

@Chui, 설명을 추가했습니다.
ugoren

@ugoren 내가 이해하는 한, printf ( "% d")는 16 진수로 보유한 메모리 주소 포인터를 인쇄해서는 안됩니까? 왜 정수를 출력합니까? 또는 char * i는 기본적으로 메모리 주소 0을 가리 키도록 초기화 되었습니까? 감사합니다
Cong Hui

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

코드 골프에 처음으로 게시. =) 아직 댓글을 달 수 없습니다.

팁에 대한 Thx Kevin Cruijssen.


나는 그것이 2 년 전에 왔다는 것을 알고 있지만, 당신은 몇 부분으로 골프를 할 수 있습니다 : &&to &및 2x Integerto Long. (또한 바이트 ~2대신 -3동일한 바이트 수를 사용 하는 이유는 무엇입니까?)
Kevin Cruijssen

1
@KevinCruijssen 너무 오래 후 첫 번째 게시물을 편집하는 향수. 내가 ~ 2가 더 낫다고 생각한 이유가 너무 확실하지 않았습니다.
벡터화

2
@KevinCruijssen 글쎄, 도전은 당신이 사용할 수 없다고 말하지만 -, 그것이 단항 부정으로 간주되는지 모르겠습니다.
FlipTack

@FlipTack 아 당신은 완전히 옳습니다. 이 경우 내가 말한 것을 잊어 버려요. :)
Kevin Cruijssen 2012

4

파이썬 2.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-고정

Edit3-Joel Cornett의 조언에 따라 5 개의 문자를 저장했습니다.

Edit4-입력이 반드시 STDIN 또는 ARGV에서 오는 것은 아니므로 stdin에서 입력을받지 않아도 9자를 저장했습니다.


계속하십시오abs()
defhlt

더 짧은print z if x==abs(x) else -z
Joel Cornett

더 나은,print (z,-z)[x<0]
Joel Cornett

@ArtemIce 덕분에 위의 다른 답변을 읽은 후에 사용할 수 있다는 것을 깨달았습니다.
elssar

@JoelCornett humm, 그것에 대해 몰랐습니다.
elssar

4

자바 스크립트, 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_ffloat에 대한 출력도 얻을 수 있습니다.


1
rationalRuby 1.9.3 에서 require 라인 없이 작동합니다 . 괄호를 생략하면 char이 하나 더 저장 됩니다.
steenslag

4

TI 기본, 8 바이트

우승자? :)

int(mean({Ans,0,0

PS 음수의 경우 무한대로 반올림합니다 ( 이유 는 여기 참조 ). 대신 제로 대체 라운드 int(iPart(없는 바이트 변화.

테스트 사례

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

3

파이썬 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에서 작동하지만 튜플을 인쇄합니다). 네거티브와 함께 작동합니다.


파이썬 3에서도 작동합니까?
기계 달팽이

첨자화할 필요는 없습니다. 가지고는 __len__충분하다.
기계 달팽이

len(range(100,1000))900리눅스에서 3.2.3을 제공합니다 .
기계 달팽이

음수에는 작동하지 않습니다. 그리고 len(xrange(0,_,3))대량으로 빠른 어쨌든 짧고이다.
grc

@Mechanicalsnail : 점령. 인정합니다. 그것은 3에서 작동합니다.
Joel Cornett

3

C ++, 191

main을 포함하고 246을 포함하고 main을 포함하지 않으면 178에 불과합니다. 모든 숫자를 부호없는 것으로 취급합니다. 나는 공정한 게임으로 서명하지 않은 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로 수렴).

의사 코드 :

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

옆으로, 나는 main을 명명하고 char **를 취하고 프로그램 반환 값을 출력으로 사용하여 main 메소드를 제거 할 수 있습니다. 명령 행 인수를 3으로 나눈 반올림 한 수를 리턴합니다. 이것은 광고 된 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

골프 스크립트-13 자

~3base);3base

음수 입력을 처리하지 않는 것 같습니다
res

1
@res s/seem to //:(. 나는 그것에 대해 생각해야 할 것이다
gnibbler

3

PowerShell 57 또는 46

%모듈로가 아닌 PowerShell foreach 연산자로 사용 하는 57 자 이 솔루션은 양수 또는 음수를 허용 할 수 있습니다.

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

*문자열 반복 연산자로 허용되는 경우 46 자 ( 곱하기)가 아닙니다. 이 옵션에는 입력 값으로 양의 정수가 필요합니다.

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

돌아온다면 버그 수정을 게시했습니다. 내 정보를 삭제하고 변경 사항을 귀하의 정보에 통합하려면 알려주세요.
Veskah

3

아르 자형

이들은 양의 정수에서만 작동합니다.

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

[[EDIT2]] 그리고 아마도 가장 좋은 것-Elliot G의 위의 matlab 코드에서 영감을 얻은 것입니다.

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/3을 이동했을 때 1 프레임 후 각도를 얻습니다.

플로트 분할 버전, 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

하스켈 41 39 자

양의 정수와 음의 정수로 작동

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

먼저 0에서 input까지 세 번째 정수마다 입력 1 또는 (-1) (입력 부호에 따라 다름)를 n만듭니다. abs(n)음수 포함.

예 : n=8 -> [0,3,6]

그런 다음이 목록의 합계를 반환합니다.


음수에서는 작동하지 않습니다 (-3/3은 -1이 아니라 1).
Cormac

음수에서 작동하게했지만 /를 사용할 수 없으므로 사양을 읽으십시오.
코맥

어머나, 당신은 나를 두 번 얻었다. 모든 고정;)
Charl Kruger

좋은! Btw fn = sum [sum $ 1 : [-2 | n <0] | i <-[3,6..abs n]]을 사용하여 39 개의 문자를 얻을 수 있습니다.
Cormac

2

클로저, 87; 네거티브와 함께 작동합니다. lazyseqs 기반

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

언 골프 드 :

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