플로트 754-해밍


29

(-2 52 ) ~ (2 52 ) 범위 의 정수 가 입력 으로 제공됩니다 . 잘 알려진 바와 같이 ,이 범위의 정수는 배정 밀도 부동 소수점 값으로 정확하게 표현 될 수 있습니다.k-45035996273704964503599627370496

당신은해야 출력 해밍 무게 의 인코딩 (사람 수) kbinary64 형식 . 부호는 1 비트, 지수는 11 비트 (오프셋으로 인코딩), 가수는 52를 사용합니다. 자세한 내용은 위의 링크를 참조하십시오.

예를 들어 숫자 22

0 10000000011 0110000000000000000000000000000000000000000000000000

하나가 있으므로 5출력은 5입니다.

엔디안은 결과에 영향을 미치지 않으므로 기계의 실제 배정도 값의 내부 표현을 안전하게 사용하여 출력을 계산할 수 있습니다.

추가 규칙

테스트 사례

22                ->   5
714               ->   6
0                 ->   0
1                 ->  10
4503599627370496  ->   5
4503599627370495  ->  55
1024              ->   3
-1024             ->   4
-4096             ->   5
1000000000        ->  16
-12345678         ->  16

1
binary64원하는 경우 함수가 이미 부동 소수점 형식으로 입력을 받아 들일 수 있도록 하시겠습니까? 일부 사람들 (처음에는 자신을 포함하여)은 함수가 입력을 C와 같은 정수 유형으로 허용해야한다고 질문을 해석했습니다 long. C에서는 호출 할 때와 같이 언어가 자동으로 변환 될 것이라고 주장 할 수 있습니다 sqrt((int)foo). 그러나 64 비트 정수 입력을 수락해야한다고 가정 한 일부 x86 기계 코드 asm 답변 ( codegolf.stackexchange.com/a/136360/30206 및 광산)이 있습니다. binary64값을 수락 하면 5 바이트가 절약됩니다.
Peter Cordes

그렇다면 제한된 범위에 관한 모든 것들은 누군가가 유형 제거 대신 이진 64 비트 패턴으로 변환을 해킹하고 싶을 때를 대비 한 것입니다. 또는 유형 정리가없는 언어의 경우? 흠, 흥미로운 도전은 binary64기수 와 가수 를 base2 정수로 추가하는 것입니다. 어쨌든 별도로 처리 해야하는 경우 type-pun 및 다른 모든 루프를 반복하는 것 이외의 작업을 수행하는 것이 좋습니다.
Peter Cordes

2
@PeterCordes 예, 부동 소수점 숫자 형식으로 입력 할 수 있습니다. 제한된 범위는 부동 소수점 표현이 정확한지 확인하는 것입니다.
Luis Mendo

알았어 고마워. 나는 당신이 함수를 작성하는 옵션을 남기고 싶었 기 때문에 모든 doubles가 정수가 아니기 때문에 longbinary64 만 말할 수는 없었습니다 double. 그러나 모든 정수 값 은의 한계까지 double변환 long하거나 되돌릴 수 있습니다 long. (당신이 지적했듯이, 그 반대는 사실이 아닙니다. double기본 반올림 모드를 가정하면 가장 가까운 표현 가능 합니다.) 어쨌든, 이것은 질문을 설정하는 완전히 유효한 방법이었습니다. 나는 그것을주의 깊게 읽지 않았다.>. <
Peter Cordes

"엔디안은 결과에 영향을 미치지 않으므로 기계의 실제 배정도 값의 내부 표현을 안전하게 사용하여 출력을 계산할 수 있습니다." 컴퓨터에서 IEEE 부동 소수점 형식을 사용하지 않는 한 ...
Jerry Jeremiah

답변:


8

MATL , 5 바이트

3Z%Bz

온라인으로 사용해보십시오!

MATLAB 답변의 정확한 음역. 입력과 출력은 암시 적입니다. Luis Mendo 덕분에 -2 바이트

3Z%   % Typecast: changes input (implicitly taken and converted to double) to uint64 without changing underlying bits
B     % Convert integer to array of 1s and 0s
z     % Count nonzero entries

33

x86_64 기계 언어 (Linux), 16 바이트

0:       f2 48 0f 2a c7          cvtsi2sd %rdi,  %xmm0
5:       66 48 0f 7e c0          movq     %xmm0, %rax
a:       f3 48 0f b8 c0          popcnt   %rax,  %rax
f:       c3                      retq

의 단일 64 비트 정수 매개 변수를 허용하고 RDI에서의 부동 소수점 값으로 변환 한 다음 XMM0해당 비트 를 에 저장 RAX한 다음 해밍 가중치를 계산 RAX하여 결과를 RAX발신자에게 반환 할 수 있도록 남겨 둡니다 .

POPCNTIntel Nehalem, AMD Barcelona 및 이후의 마이크로 아키텍처와 같은 명령어 를 지원하는 프로세서가 필요합니다 .

하려면 온라인으로보십시오! 다음 C 프로그램을 컴파일하고 실행하십시오.

#include<stdio.h>
const char g[]="\xF2\x48\x0F\x2A\xC7\x66\x48\x0F\x7E\xC0\xF3\x48\x0F\xB8\xC0\xC3";
#define f(x) ((int(*)(long))g)(x)

int main(int a){
  printf("%d\n",f(22));
  printf("%d\n",f(714));
  printf("%d\n",f(0));
  printf("%d\n",f(1));
  printf("%d\n",f(4503599627370496L));
  printf("%d\n",f(4503599627370495L));
  printf("%d\n",f(1024));
  printf("%d\n",f(-1024));
  printf("%d\n",f(-4096));
  printf("%d\n",f(1000000000));
  printf("%d\n",f(-12345678));
}

2
작업에 적합한 도구 +1! 이것은 x86이 골프 언어와 합법적으로 경쟁하거나 젤리를 이길 수있는 유일한 시간 일 수 있습니다. :)
DJMcMayhem

2
AT & T 문법? objdump -drwC -Mintel인텔 구문으로 디스 어셈블 하는 데 사용할 수 있습니다 . 당신은 당신이 저장 / 다시로드에 사용할 수있는 레지스터에 대한 포인터를 가지고 있다면, 당신은과 함께 바이트 구할 수 movaps [rsi], xmm0/을 popcnt rax, [rsi]. (movaps는 movq보다 2 바이트가 짧은 3 바이트에 불과합니다.) 그러나 [rsp-24]2 바이트가 더 필요 하기 때문에 여기에는 도움이되지 않습니다 . 그리고 추가 바이트는 저장 및 재로드 모두에 필요합니다. 아 글쎄, 나는 절약을 보았다고 생각하지만, 아니 : /
피터 코르

나는 사용자 지정 호출 규칙으로 4 바이트를 저장 . 또는 x87 명령어를 사용하여 이와 동일한 호출 규칙으로 2 바이트를 저장하십시오.
Peter Cordes

1
@DJMcMayhem : 아마도 유일한 시간은 아닙니다. Extreme Fibonacci 챌린지에 대해서는 아직 골프 언어 답변이 없습니다 (Fib의 첫 1000 자리 숫자 (10 억) 및 x86 기계 코드 답변 (105 분 빨리 또는 1 분 대신 5 분으로 실행되는 101 바이트)) 다른 답변들보다 훨씬 크지 않으며, 모두 확장 정밀 정수가 내장 된 언어로되어 있습니다.
Peter Cordes

2
또는 더 간단한 도전 (및 성능 요구 사항이없는), 크로마 키는 정수 배열을 혼합합니다 . 내 기계 코드 답변은 pyth 답변 길이의 절반입니다.
Peter Cordes

11

C (gcc) , 82 68 바이트

Neil 덕분에 9 바이트.

사악한 부동 소수점 비트 수준 해킹

s;f(long n){double d=n;n=*(long*)&d;for(s=0;n;n*=2)s+=n<0;return s;}

온라인으로 사용해보십시오!


나는 당신이 첫 번째가 될 줄 알았는데 방금 언어를 기대하지 않았습니다 :-D
Luis Mendo

@LuisMendo 방금 그 언어가 편할 것이라고 생각했습니다. 다른 언어를 몰라요
Leaky Nun

2
다른 방법으로 이동하여 9 바이트를 절약하십시오. ... ;long l=... ;l*=2;)s+=l<0;...
Neil

1
이것은 물론 64 비트 C 구현이 필요합니다 long. x86-64 Linux에서는 작동하지만 Windows에서는 실패합니다. longgcc는 많은 플랫폼에서 실행되기 때문에 " 64 비트가있는 gcc"라고 말하고 싶습니다 .
Peter Cordes

1
@Peter의 의견은 편집에 "LP64"를 추가 한 이유입니다. 나는 또한 논리적으로 생각되는 다른 텍스트를 재 배열했다. 변경 사항이 마음에 들지 않고 롤백되었지만 LP64는 long과 포인터가 64 비트 값인 ABI를 설명하는 표준 용어입니다 (ints도 64 비트 또는 LLP64 인 ILP64와 비교할 때) long long 및 포인터 만 64 비트이고 long이 여전히 32 비트 인 Windows에서 사용됨). 어쩌면 더 많은 설명이나 관련 Wikipedia 기사에 대한 인라인 링크를 추가했을 것입니다.
코디 그레이

8

파이썬 3 , 72 71 바이트

Lynn 덕분에 1 바이트.

lambda n:n and(bin(1020+len(bin(abs(n))))+bin(abs(n))).count('1')-(n>0)

온라인으로 사용해보십시오!

설명

binary64 형식은 세 가지 구성 요소로 구성됩니다.

  • 첫 번째 비트는 부호 비트이며 1, 숫자가 음수 인 경우
  • 다음 11 비트는 1023이 추가 된 지수를 저장합니다.
  • 다음 52 비트는 유효 또는 가수를 저장합니다.

n and(…)-(n>0)바이트가 더 짧습니까?
Lynn

또는 그 문제에 대해 int-> float 또는 모든 수레가 있습니다.
user2357112는 Monica

8

C (gcc) , 47 바이트

f(double n){n=__builtin_popcountl(*(long*)&n);}

이것은 휴대용이 아닙니다. 컴파일러 플래그없이 Linux를 실행하는 x86_64에서 gcc 7.1.1로 테스트되었습니다.

온라인으로 사용해보십시오!


1
입력은 정수 여야합니다. 아니면의 암시 적 변환에 의해 호출 핸들 것을 수 있도록 괜찮 longdouble호출 사이트를?
Peter Cordes

1
또한, 컴파일러 행동의 우연에 의존하는 것은두고 일하기 nrax최적화되지 않은 코드가 꽤 치즈입니다 함께. 을 활성화하면 깨지기 -O3때문에 일반적으로 gcc가 아니라 long최적화가 비활성화 된 64 비트가 있는 x86-64의 gcc입니다 . 모든 요구 사항을 귀하의 답변에 넣으면 찬성합니다. 64 비트가 long있지만 popcountl반환 값 레지스터 이외의 레지스터에 결과 를 남기는 gcc 지원 플랫폼이 있다고 가정합니다 .
Peter Cordes

1
나는 수학적 의미에서 정수를 취했습니다. gcc, x86-64 및 64 비트 길이가 충분하지 않다고 확신하기 때문에 테스트 환경의 사양을 추가했습니다. 즉, 적어도 x86에서는 무 복귀 함수가 gcc (및 tcc)와 더 자주 작동합니다.
Dennis

예, 방금 질문을 다시 읽고 있었으므로 인수를 a로 수락하는 것이 double좋습니다. base2 형식으로 함수를 수락하도록 요구하는 것에 대해서는 언급하지 않습니다. 예, 다른 버전의 gcc는 다른 코드를 생성 할 수 있으므로 중요합니다. (재미있는 사실 : -mpopcntgcc는 popcntinsn을 사용 하지 않고 그것을 모방하기 위해 일련의 명령을 내 보냅니다. 일부 아키텍처에는 popcnt 명령이 전혀 없으므로 __builtin_popcountl항상 일부 시퀀스를 사용해야합니다)
Peter Cordes

그렇습니다. 많은 (대부분의) __builtin_*기능에는 레거시 버전이 있으므로 불법 명령이 생성되지 않습니다. -march=native사용 popcntq가능한 경우에만 사용 합니다.
Dennis


6

C (gcc), 63 바이트

f(double d){long s=0,n=*(long*)&d;for(;n;n*=2)s+=n<0;return s;}

이 솔루션은 @LeakyNun의 답변을 기반으로하지만 자신의 답변을 개선하고 싶지 않기 때문에 여기에 더 골프 버전을 게시하고 있습니다.

온라인으로 사용해보십시오


2
누구도 자신의 답변 을 향상시키고 싶지 않다는 것을 의심 합니다.
Mr. Xcoder

1
@ Mr.Xcoder. 좋아, 나는 그가 자신의 답변을 편집 할 때까지 여기에 보관하겠습니다. 그가 편집하고 싶지 않은 경우 여기에 남아 있습니다. 나는이 개선점을 그의 답변에 대한 의견으로 올렸고 그는 거절했다.

1
입력은 정수 유형이어야하며 실제 유형이 아니라고 생각합니다.
ceilingcat

3
@ThePirateBay 나는 내 답변에 대한 귀하의 의견을 보지 못했지만 여전히 그것을 보지 못했습니다.
Leaky Nun

9
개선을 제안하거나 자신의 답변을 게시하기로 결정한 것은 귀하의 결정이지만 6 분은 거의 1 시간 정도 입니다.
Dennis

5

C #, 81 70 68 바이트

d=>{unsafe{long l=*(long*)&d,s=0;for(;l!=0;l*=2)s-=l>>63;return s;}}

@Leaky Nun 덕분에 11 바이트를 절약 할 수 있습니다.
@Neil 덕분에 2 바이트를 절약했습니다.

온라인으로 사용해보십시오! TIO가 코드를 사용할 수 없으므로 코드 System.BitConverter.DoubleToInt64Bits대신 사용 unsafe합니다.

풀 / 포맷 버전 :

namespace System
{
    class P
    {
        static void Main()
        {
            Func<double, long> f = d =>
            {
                unsafe
                {
                    long l = *(long*)&d, s = 0;

                    for (; l != 0; l *= 2)
                        s -= l >> 63;
                    return s;
                }
            };

            Console.WriteLine(f(22));
            Console.WriteLine(f(714));
            Console.WriteLine(f(0));
            Console.WriteLine(f(1));
            Console.WriteLine(f(4503599627370496));
            Console.WriteLine(f(4503599627370495));
            Console.WriteLine(f(1024));
            Console.WriteLine(f(-1024));
            Console.WriteLine(f(-4096));
            Console.WriteLine(f(1000000000));
            Console.WriteLine(f(-12345678));

            Console.ReadLine();
        }
    }
}

for(;l!=0;l*=2)그리고 당신은 삼항이 필요하지 않습니다
Leaky Nun

@LeakyNun 고맙게도 나는 그 동안 머리를 긁적였습니다.
TheLethalCoder

사용할 수 있습니까 s-=l>>31?
Neil

@Neil 작동하지 않는 것 같습니다. 나는 당신이 대체하는 것을 의미한다고 생각 s+=l<0?1:0합니까?
TheLethalCoder

내 잘못이야; l긴, 그래서 그것은 필요 s-=l>>63합니까?
Neil

4

파이썬 2 , 69 바이트

@ASCII 전용으로 -12 바이트

lambda n:bin(*unpack('Q',pack('d',n))).count('1')
from struct import*

온라인으로 사용해보십시오!



1
당신의 접근 방식, 76 바이트를 골프 , 나는 ASCII 전용 접근 방식을 권장하지만
Mr. Xcoder

@ Mr.Xcoder는 !바이트 순서가 중요하지 않기 때문에 필요하지 않습니다
ASCII 전용


@ASCII 전용 포장 풀기. 감사합니다 : D
Dead Possum

4

자바 스크립트 (ES6), 81 80 77 바이트

f=
n=>new Uint8Array(Float64Array.of(n).buffer).map(g=i=>i&&g(i^i&-i,x++),x=0)|x
<input oninput=o.textContent=f(this.value)><pre id=o>0

편집 : @ Arnauld 덕분에 1 바이트가 절약되었습니다. @DocMax 덕분에 3 바이트가 절약되었습니다.


g(i^i&-i,x++)-1 바이트를 할 수 있습니까?
Arnauld

@ Arnauld 나는 골퍼 비트 트위들이 있는지 궁금해했다.
Neil

1
-3 당신은 대체 더 경우 new Float64Array([n])Float64Array.of(n)
DocMax

4

x86-64 머신 코드, int64_t입력 용 12 바이트

double입력 용 6 바이트

popcntISA 확장 ( CPUID.01H:ECX.POPCNT [Bit 23] = 1)이 필요합니다 .

(또는 그 자리에서 arg를 수정하면 13 바이트는 상위 32에 쓰레기를 남기지 않고 모든 64 비트를 작성해야합니다. 어쨌든 호출자가 아마도 낮은 32b 만로드하고 싶을 것이라고 주장하는 것이 합리적이라고 생각합니다. -32 비트 작업마다 암시 적으로 32에서 64로 확장되지만 여전히 호출자가 수행하지 못하도록합니다 add rbx, [rdi].)

x87 명령어는보다 명백한 SSE2 cvtsi2sd/ 보다 짧으며 movq( @ceilingcat의 답변에 사용 ) [reg]어드레싱 모드는 regmod / rm 바이트 와 같은 크기 입니다.

트릭은 주소 지정 모드에 너무 많은 바이트가 필요하지 않고 메모리에 값을 전달하는 방법을 고안하는 것이 었습니다. (예를 들어 스택에 전달하는 것은 그리 좋지 않습니다.) 다행히도, 규칙은 읽기 / 쓰기 args 또는 별도의 출력 args 를 허용하므로 호출자가 내가 쓸 수있는 메모리에 대한 포인터를 전달하도록 할 수 있습니다.

서명이있는 C에서 호출 가능 : void popc_double(int64_t *in_out); 결과의 낮은 32b 만 유효합니다. C에는 이상하지만 asm에는 자연 스럽습니다. (이 문제를 해결하는 것은 최종 저장 (에 REX 접두사가 필요 mov [rdi], rax윈도우, 변화에), 그래서 하나 더 바이트.) rdi에를 rdxWindows가 x86-64의 시스템 V ABI를 사용하지 않기 때문에.

NASM 리스팅. TIO 링크에는 디스 어셈블리없이 소스 코드가 있습니다.

  1  addr    machine      global popcnt_double_outarg
  2          code         popcnt_double_outarg:
  3                           ;; normal x86-64 ABI, or x32: void pcd(int64_t *in_out)
  4 00000000 DF2F             fild qword  [rdi]    ; int64_t -> st0
  5 00000002 DD1F             fstp qword  [rdi]    ; store binary64, using retval as scratch space.
  6 00000004 F3480FB807       popcnt rax, [rdi]
  7 00000009 8907             mov    [rdi], eax    ; update only the low 32b of the in/out arg
  8 0000000B C3               ret
    # ends at 0x0C = 12 bytes

온라인으로 사용해보십시오!_start값을 전달하고 종료 상태 = popcnt 리턴 값으로 종료 하는 테스트 프로그램을 포함 합니다. ( "디버그"탭을 열어서보십시오.)

별도의 입력 / 출력 포인터를 전달해도 작동하지만 (x86-64 SystemV ABI의 rdi 및 rsi) 64 비트 입력을 합리적으로 파괴하거나 64 비트 출력 버퍼가 필요한 것을 쉽게 정당화 할 수는 없습니다. 낮은 32b.

입력 정수에 대한 포인터를 가져 와서 출력을 반환하는 동안 파괴 할 수 있다고 주장 rax하려면 mov [rdi], eaxfrom을 생략하십시오 .popcnt_double_outarg 가져 와서 10 바이트로 내립니다.


어리석은 전화-컨벤션 트릭이없는 대안, 14 바이트

스택을 스크래치 공간으로 사용하십시오 push. 에 대해 3 대신에 2 바이트로 레지스터를 복사 하려면 push/ pop를 사용하십시오 mov rdi, rsp. ( [rsp]항상 SIB 바이트가 필요하므로 복사하는 데 2 ​​바이트를 소비 할 가치가 있습니다.rsp 사용하는 세 개의 명령어 전에 하기 하는 것이 좋습니다.)

이 서명으로 C에서 전화하십시오. int popcnt_double_push(int64_t);

 11                               global popcnt_double_push
 12                               popcnt_double_push:
 13 00000040 57                       push   rdi         ; put the input arg on the stack (still in binary integer format)
 14 00000041 54                       push   rsp         ; pushes the old value (rsp updates after the store).
 15 00000042 5A                       pop    rdx         ; mov      rdx, rsp
 16 00000043 DF2A                     fild   qword [rdx]
 17 00000045 DD1A                     fstp   qword [rdx]
 18 00000047 F3480FB802               popcnt rax,  [rdx]
 19 0000004C 5F                       pop    rdi         ; rebalance the stack
 20 0000004D C3                       ret
    next byte is 0x4E, so size = 14 bytes.

double형식의 입력 허용

질문은 단지 그것이 범위 2의 정수 표현이 아니라 특정 범위의 정수라고 말합니다. double입력을 수락 하면 x87을 더 이상 사용할 필요가 없습니다. doubles가 x87 레지스터로 전달 되는 사용자 지정 호출 규칙을 사용하지 않는 한 스택 아래의 빨간색 영역에 저장하고 거기에서 popcnt합니다.

11 바이트 :

 57 00000110 66480F7EC0               movq    rax, xmm0
 58 00000115 F3480FB8C0               popcnt  rax, rax
 59 0000011A C3                       ret

그러나 우리는 6 바이트 버전을 만들기 위해 이전과 동일한 참조 기준 트릭을 사용할 수 있습니다 int pcd(const double&d);

 58 00000110 F3480FB807               popcnt  rax, [rdi]
 59 00000115 C3                       ret

6 바이트 .



3

MATLAB, 36 바이트

@(n)nnz(de2bi(typecast(n,'uint64')))

de2bi보다 짧을 dec2bin뿐만 아니라 ASCII 48, 49보다는 1과 0으로 결과를 제공 한다는 사실을 사용합니다 .


3

자바 (64, 61, 41 바이트)

표준 라이브러리 (Java SE 5+)를 사용하여 완전히 간단합니다.

int f (long n) {Return Long. bitCount (더블 doubleToLongBits) (n));}

Kevin Cruijssen (Java SE 5 이상)의 공헌 :

int f(Long n){return n.bitCount(Double.doubleToLongBits(n));}

Kevin Cruijssen (Java SE 8+, 람다 함수)의 기여 :

n->n.bitCount(Double.doubleToLongBits(n))

잘 했어요! :-)
Leaky Nun

1
좋은 답변, +1 매개 변수를로 Long n사용하여 n.bitCount(...)대신 3 바이트를 골프화 할 수 있습니다 Long.bitCount(...). 또한 Java 8 이상을 사용하는 경우 n->n.bitCount(Double.doubleToLongBits(n))( 41 바이트 )
Kevin Cruijssen에서

2

다른 것보다 더 안전하고TheLethalCoder의 접근법 이것을 생각해 냈습니다.

C # (. NET 코어) , 76 + 13 바이트

d=>Convert.ToString(BitConverter.DoubleToInt64Bits(d),2).Split('1').Length-1

온라인으로 사용해보십시오!

바이트 수에는에 대한 13 바이트가 포함됩니다 using System;. 우선은 변환해야 doubleA와 long같은 이진 표현을 가지고 그 다음 나는 바이너리로 변환 할 수 있습니다 string, 그리고 나는 카운트 1분할에 의해 단지 문자열과 문자열 1을 뺀 계산이야.


좋은 대안이지만 using바이트 수 에 포함해야합니다 .
TheLethalCoder

Linq를 95 바이트 만 더 사용하십시오 : namespace System.Linq;{d=>Convert.ToString(BitConverter.DoubleToInt64Bits(d),2).Count(c=>c>48)}. 테스트하지는 않았지만 작동합니다.
TheLethalCoder

@TheLethalCoder 작동하지만 Linq를 피하려고 시도했기 때문에 두 번째 using지시문 을 추가 할 필요가 없었습니다 .
Charlie

1
두 번째를 추가하면 namespace편리합니다. 그러나이 경우 Linq를 피하는 것이 약간 저렴했습니다. 바이트를 절약하기 위해 단축하는 방법에 대한 아이디어가있는 경우 접근 방식으로 의견을 말하고 싶었습니다.
TheLethalCoder

@TheLethalCoder Sum(c=>c&1)는 짧습니다. 또는Sum()-768
Peter Taylor


1

dc, 79 바이트

[pq]su[-1r]st0dsb?dd0=u0>tsa[1+]ss[la2%1=slb1+sblad2/sa1<r]dsrxlb1022+sa0lrx+1-

출력은 스택 맨 위에 남습니다.
나중에 설명을 추가하겠습니다.

온라인으로 사용해보십시오!

음수가 앞에 참고 _하지 -.



1

C, 67 바이트

int i;g(char*v){int j=v[i/8]&1<<i%8;return!!j+(++i<64?g(v):(i=0));}

제어 코드 및 결과

#define R     return
#define u32 unsigned
#define F        for
#define P     printf

int main()
{/*           5   6 0 10                5               55    3      4       16*/
 double v[]={22,714,0,1 ,4503599627370496,4503599627370495,1024, -1024, -12345678};
 int i; 

 F(i=0;i<9;++i)
     P("%f = %d\n", v[i], g(&v[i]));
 R 0;
}

>tri4
22.000000 = 5
714.000000 = 6
0.000000 = 0
1.000000 = 10
4503599627370496.000000 = 5
4503599627370495.000000 = 55
1024.000000 = 3
-1024.000000 = 4
-12345678.000000 = 16

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.