부호없는 16 비트 정수로 된 수를 세는 문장을 작성하십시오.
예를 들어, 입력이 인 경우 16 비트 이진수 는 6 개를 포함 하는 16 비트 이진수 이므로 1337
결과가 나타납니다 .6
1337
0000010100111001
부호없는 16 비트 정수로 된 수를 세는 문장을 작성하십시오.
예를 들어, 입력이 인 경우 16 비트 이진수 는 6 개를 포함 하는 16 비트 이진수 이므로 1337
결과가 나타납니다 .6
1337
0000010100111001
답변:
F3 0F B8 C1
정수를 가져 와서 cx
카운트를 출력하며 다음 ax
과 같습니다.
popcnt ax, cx ; F3 0F B8 C1
POPCNT를 사용하지 않는 11 10 바이트 솔루션 은 다음과 같습니다 .
31 C0 D1 E9 10 E0 85 C9 75 F8
이는 다음과 같습니다.
xor ax, ax ; 31 C0 Set ax to 0
shr cx, 1 ; D1 E9 Shift cx to the right by 1 (cx >> 1)
adc al, ah ; 10 E0 al += (ah = 0) + (cf = rightmost bit before shifting)
test cx, cx ; 85 C9 Check if cx == 0
jnz $-6 ; 75 F8 Jump up to shr cx, 1 if not
ax
와 cx
함께 eax
및 ecx
32 비트를 변경한다. 바이트 코드도 동일합니다.
for(n=0;x;n++)x&=x-1;
"함수"가 아닌 "일부 명령문 작성"이라고 말 했으므로 숫자가 제공되고 x
1이 반환 된다고 가정 했습니다 n
. 초기화 할 필요가 없으면 n
3 바이트를 절약 할 수 있습니다.
이것은 x&x-1
무언가가 2의 거듭 제곱인지 테스트 하는 유명한 표현 을 수정 한 것입니다 (그렇지 않으면 거짓, 그렇지 않으면 참).
여기서 그것은 질문의 번호 1337에 적용됩니다. 1을 빼면 최하위 1 비트와 모든 0이 오른쪽으로 반전됩니다.
0000010100111001 & 0000010100111000 = 0000010100111000
0000010100111000 & 0000010100110111 = 0000010100110000
0000010100110000 & 0000010100101111 = 0000010100100000
0000010100100000 & 0000010100011111 = 0000010100000000
0000010100000000 & 0000010011111111 = 0000010000000000
0000010000000000 & 0000001111111111 = 0000000000000000
편집 : 완전성을 위해 여기에 순진 알고리즘이 있습니다.이 알고리즘은 1 바이트 더 길고 약간 느립니다.
for(n=0;x;x/=2)n+=x&1;
{}
. 누군가가 이미 생각 해낸 것에 놀라지 말아야 할 간단한 작업입니다.
for(n=0;x;x/=2)n+=x&1;
이 답변은 도전 과제가 게시 된 후 언어가 생성되었으므로 경쟁이 아닙니다.
2 바이트 :
BS
Jelly는 @Dennis가 J와 유사한 구문으로 작성한 새로운 언어입니다.
implicit: function of command-line arguments
B Binary digits as list
S Sum
n->sum(digits(n,2))
단일 인수 인을 허용하는 익명 함수를 만듭니다 n
. 그것을 사용하려면 f=n->...
그것을 비슷한 것으로 할당 하고 좋아하십시오 f(1337)
.
이 digits()
함수는 2 개의 인수와 함께 호출 될 때 주어진 밑의 입력 자릿수 배열을 반환합니다. 따라서 digits(n, 2)
이진수를 반환합니다 n
. 배열의 합을 취하면의 이진 표현에서 1의 수를 갖습니다 n
.
count_ones
ri2b:+
ri "Read the input and convert it to integer";
2b "Convert the integer into base 2 format";
:+ "Sum the digits of base 2 form";
sum(intToBits(scan())>0)
scan()
stdin에서 입력을 읽습니다.
intToBits()
정수를 취하고 raw
입력의 이진 표현 중 0과 1을 포함하는 유형의 벡터를 반환합니다 .
intToBits(scan())>0
TRUE
해당 이진 벡터 요소가 1 (모든 요소가 0 또는 1이고 1> 0이므로) 인 경우 각 요소가있는 논리 형 벡터를 반환합니다 FALSE
.
R에서는 논리 벡터를 TRUE
합하여 요소 수를 얻을 수 있으므로 위와 같이 논리 벡터를 합하면 원하는 것을 얻을 수 있습니다.
주 sum()
처리 할 수없는 raw
직접 입력을 사용 전에 논리를 따라서 대안.
sum(intToBits(scan()))
동일 하지 않습니까?
sum()
에 유형의 입력을 취할 수 없으므로 raw
에서 반환 된 것 intToBits()
입니다.
이것은 조금 더 단축 될 수있는 간단한 재귀 함수입니다. 단순히 조금 걸리고 다시 실행됩니다.
B=n=>n&&(1&n)+B(n>>1)
http://www.es6fiddle.net/imt5ilve/ 에서 시도 하십시오 (의 var
이유가 필요합니다 'use strict';
).
나는 내가 물고기를 이겼다는 것을 믿을 수 없다! !!
예전 것:
n=>n.toString(2).split(1).length-1
두 기능 모두 ES5에 쉽게 적용 할 수 있습니다.
function B(n){return n?(1&n)+B(n>>1):0}
//ungolfed:
function B(number)
{
if( number > 0 )
{
//arguments.callee points to the function itself
return (number & 1) + arguments.callee( number >> 1 );
}
else
{
return 0;
}
}
오래된 것:
function(n){return n.toString(2).split(1).length-1}
@ user1455003 은 나에게 가장 좋은 아이디어를 주었다.
function B(n,x){for(x=0;n;n>>=1)x+=n&1;return x}
ES6에 맞게 수정했으며 재귀를 많이 줄였습니다!
0$11.>~n;
2,:?!^:2%:{+}-
프로그램은 단지 mod 2를 반복하고 입력 숫자가 0이 될 때까지 빼고 나눈 다음 mod 2의 합을 인쇄합니다.
-v
예를 들어 플래그로 테스트
py -3 fish.py ones.fish -v 1337
-v
플래그 버전은 여전히 작동합니다.)
이것은 ES6 답변 과 동일한 어프로치를 사용합니다.
<?=count(split(1,decbin($_GET[n])))-1;
이것은 전체 코드이므로 매개 변수를 사용하여 파일에 넣고 브라우저를 통해 액세스하면됩니다 n=<number>
.
조금 짧습니다.
<?=count(split(1,decbin($n)))-1;
지시어 register_globals
는 Off
기본적으로 PHP4.2에서 PHP5.4 (이때 제거)까지 설정 되었기 때문에 PHP <4.2에서만 안정적으로 작동합니다 .
로 php.ini
파일 을 만들면 register_globals=On
작동합니다.
코드를 사용하려면 POST 또는 GET을 사용하여 브라우저를 사용하여 파일에 액세스하십시오.
그는이 함수를 매우 흥미롭게 사용하는 2 가지 좋은 제안을했습니다. array_sum
.
38 바이트 :
<?=array_sum(str_split(decbin(1337)));
45 바이트 :
<?=array_sum(preg_split('//', decbin(1337)));
이것은 정말 좋은 아이디어이며 36 바이트 길이로 조금 더 짧아 질 수 있습니다.
<?=array_sum(split(1,decbin(1337)));
<?=substr_count(decbin(1337),"1");
(34 바이트)를 사용하여 4 바이트
<?=substr_count(decbin(1337),1);
. 총 32 바이트입니다. 코드가 다른 코드라고 생각하면 자신의 답변으로 게시하고 싶지 않습니까? 나는 그것을 공감할 것이다!
<?=substr_count(decbin($argv[1]),1);
(또는 $_GET[n]
; 36 바이트)
¢o1 l
도 잘 작동합니다. 또 다른 흥미로운 접근법은 -¢¬r-0
; ¢¬
이진수로 배열을 나누고 r-0
0부터 시작하여 빼기로 줄이며 -
결과를 무시하여 양수로 만듭니다.
¢¬x
.
비경쟁 답변. 밀랍은이 도전보다 새로운 것입니다.
이 솔루션은 Brian Kherigan의 "Bit Twiddling Hacks"웹 사이트에서 세트 비트를 계산하는 방식을 사용합니다.
까지 루프를 실행하여 비트 수를 늘리고 number=number&(number-1)
까지 반복합니다 number = 0
. 이 솔루션은 비트 세트가있는 한 자주 루프를 통과합니다.
몇 가지 명령을 다시 정렬하여 4 바이트를 줄일 수 있습니다. 소스 코드와 설명이 모두 업데이트되었습니다.
pT_
>"p~0+M~p
d~0~@P@&<
{@<
설명:
pT_ generate IP, input Integer, redirect
>" if top lstack value > 0 jump next instruction,
otherwise continue at next instruction
p redirect if top lstack value=0 (see below)
~ flip top and 2nd lstack values
0+ set top lstack value to 0, set top=top+2nd
M decrement top lstack value
~ flip top and 2nd lstack values
p redirect to lower left
< redirect to left
& top=top&2nd
@ flip top and 3rd lstack values
@P increment top lstack value, flip top and 3rd values
~0~ flip top and 2nd values, set top=0, flip top and 2nd again
d redirect to upper left
>"p~0+M..... loop back
p if top lstack = 0 at " instruction (see above), redirect
0 set lstack top to zero (irrelevant instruction)
< redirect to the left
@ flip top and 3rd lstack values
{ output top lstack value as integer (bitcount)
밀랍 해석기, 언어 사양 및 예제가 포함 된 내 GitHub 저장소 를 복제하십시오 .
작동 byte
, short
, char
,와 int
. 람다로 사용하십시오.
Integer::bitCount
내장을 사용하지 않고 :
42 바이트
s->{int c=0;for(;s!=0;c++)s&=s-1;return c}
"$([char[]][convert]::ToString($s,2)|%{"+$_"})"|iex
설명 :
[convert]::ToString($s,2)
에서 이진 문자열 표현을 생성합니다 $s
.
[char[]]
그것을 char 배열로 캐스트하고 각 문자를 열거 할 수있게합니다.
|%{"+$_"}
+ 기호가있는 각 문자 앞에 결과 하위 표현식을
"$()"
내재적으로 호출 하여 파이프 된 문자열을 더합니다 (예 : "+1 +0 +1 +1 +0 +1 +0 +0"= 4)..ToString()
|iex
-join
연산자와 암시가 .ToString()
45 바이트를 달성하기 위해 [char[]][convert]::ToString($s,2)-join'+'|iex
다른 접근 방식을 사용 인라인으로, ... 또는 -replace
43 바이트를 달성하기 위해 운영자([convert]::ToString($s,2)-replace0).length
#(count(filter #{\1}(Long/toString % 2)))
오른쪽에서 왼쪽으로 읽기, 이진 문자열로 변환, 일련의 문자로 변환, 필터링 1
s를 하고 얼마나 많은 수를 계산합니다.
편집을 할 지크의 도움으로
#(count(filter #{\1}(Integer/toString% 2)))
#(count(filter #{\1}(Integer/toString % 2)))
CompilerException java.lang.IllegalArgumentException: No matching method: toString_PERCENT_
Integer/toString
. 그것은 두 번째 전에 일했습니다.
⨭⟦ïⓑ
입력을 이진수로 변환하고 문자를 따라 나누고 결과 배열의 합을 가져옵니다.