d(a,b){return(sizeof((char)d))^__builtin_popcount(a^b);}
オンラインでお試しください!
0
ペアの差が1の場合は0、それ以外の場合は0を返します。EXIT_SUCCESS
ペアが1だけ異なる場合に戻ることを考慮しない限り、Cの場合は少し異常です。
を使用sizeof((char)d))
して、1
関数名を初期化すると同時に、初期化された方法で定数を生成します。
次に、その1を引数のXORのポップカウントとXORします。幸いなことに、^
非常に長い識別子と同様に、シンボルはそのままの状態を維持するのが簡単__builtin_popcount
です。
一方、ソリューションのテストに使用されるスクリプトは次のとおりです。
#!/bin/bash
SOURCE_FILE=$1
FOOT_FILE=$2
TMP_SRC=temp.c
LENGTH="$(wc -c <"$SOURCE_FILE")"
BITS=$((LENGTH*8))
cat "$SOURCE_FILE" >"$TMP_SRC"
cat "$FOOT_FILE" >>"$TMP_SRC"
if gcc -w $TMP_SRC -o t.out >/dev/null 2>&1; then
if ./t.out; then
echo "Candidate solution..."
else
echo "Doesn't even work normally..."
exit
fi
else
echo "Doesn't even compile..."
exit
fi
for i in $(seq 1 $BITS); do
./flipbit "$i" <"$SOURCE_FILE" >"$TMP_SRC"
cat "$FOOT_FILE" >>"$TMP_SRC"
if gcc -w $TMP_SRC -o t.out >/dev/null 2>&1; then
echo "Testing flipped bit $i:"
cat "$TMP_SRC"
./t.out >/dev/null 2>&1
STATUS=$?
if [ "$STATUS" -eq 0 ]; then
echo "It works!"
exit
elif [ "$STATUS" -eq 1 ]; then
echo "It doesn't work..."
exit
else
echo "It crashes"
fi
fi
done
./flipbit
私が書いたツールのソースは単純です:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]) {
int bittoflip = atoi(argv[1]) - 1;
int ch;
while ((ch = fgetc(stdin)) != EOF) {
if (bittoflip < 8 && bittoflip >= 0) {
putchar(ch ^ (1 << bittoflip));
} else {
putchar(ch);
}
bittoflip -= 8;
}
return 0;
}
トリッキーなビットは次のとおりです。
- 空白:すべての空白(改行を含む)には、同様に機能する初期の双子があります
- 比較:
=
表示される可能性があるすべてのケースで比較できるため、うまく機能しません。同様に-
うまくいきません。したがって^
、1との等価性をアサートするために使用されます。
- 変数名:fはbと衝突するため、代わりに関数名としてdを使用する必要がありました。