CodeIQ 2812 "Rot und Weiß" -Problem. Eine Übersicht über das Problem finden Sie unter Erläuterung. Kurz gesagt, Sie können "1 << popcount (n)" ausgeben. Wenn Sie in C-Sprache lösen
n;main(){scanf("%d",&n);n=!printf("%d\n",1<<__builtin_popcount(n));}
Es ist jedoch erforderlich, dieses "__builtin_popcount" von einem anderen als C aufzurufen. Als Ergebnis der Untersuchung wurde festgestellt, dass "sched_popcount ()" unter Linux und " popcountdi2 ()" unter OS X verwendet werden kann. Die Signatur lautet "int __sched_popcount (size_t siz, long * a)", funktioniert aber vorerst auch dann, wenn Sie "(8, long long [1] {…})" übergeben. Dies liegt daran, dass letzteres in einer 32-Bit-Umgebung als "int [2] {...}" interpretiert wird und __sched_popcount die Summe zurückgibt.
So rufen Sie diese Funktionen in Ruby / Python / C # auf: Magische Nummer 8 sollte nach Möglichkeit vermieden werden. Python ist am genauesten, weil dort "ctypes.sizeof (ctypes.c_long)" steht.
#!/usr/bin/ruby
if RUBY_PLATFORM=~/linux/
if true
require 'fiddle'
__popcount_fn=Fiddle::Function.new(Fiddle::Handle::DEFAULT['__sched_cpucount'],[Fiddle::TYPE_INT,Fiddle::TYPE_VOIDP],Fiddle::TYPE_INT)
define_method(:popcount){|n|__popcount_fn.call(8,[n].pack('q'))}
else
require 'fiddle/import'
module LibC
extend Fiddle::Importer
dlload 'libc.so.6'
extern 'int __sched_cpucount(int,long long*)'
end
def popcount(n) LibC.__popcountdi2(8,[n]) end
end
elsif RUBY_PLATFORM=~/darwin/
if true
require 'fiddle'
__popcount_fn=Fiddle::Function.new(Fiddle::Handle::DEFAULT['__popcountdi2'],[Fiddle::TYPE_LONG],Fiddle::TYPE_INT)
define_method(:popcount){|n|__popcount_fn.call(n)}
else
require 'fiddle/import'
module LibC
extend Fiddle::Importer
dlload 'libSystem.dylib'
extern 'int __popcountdi2(long)'
end
def popcount(n) LibC.__popcountdi2(n) end
end
else
def popcount(n) n==0 ? 0 : popcount(n/2)+n%2 end
end
p 1<<popcount(gets.to_i)
Da Ruby von CodeIQ 1.9.3 ist, gehen Sie wie folgt vor. Es ist schmutzig, weil es globale Variablen hat, aber es ist unvermeidlich.
require 'fiddle'
require 'dl'
$__popcount_fn=Fiddle::Function.new(DL::Handle::DEFAULT['__sched_cpucount'],[Fiddle::TYPE_INT,Fiddle::TYPE_VOIDP],Fiddle::TYPE_INT)
def popcount(n) $__popcount_fn.call(8,[n].pack('q')) end
#!/usr/bin/python
import sys,ctypes
if sys.version_info[0]>=3:
raw_input=input
xrange=range
if sys.platform.startswith('linux'):
libc=ctypes.cdll.LoadLibrary('libc.so.6')
popcount=lambda n:libc.__sched_cpucount(ctypes.sizeof(ctypes.c_long),(ctypes.c_long*1)(n))
elif sys.platform=='darwin':
libc=ctypes.cdll.LoadLibrary('libSystem.dylib')
popcount=lambda n:libc.__popcountdi2(n)
else:
popcount=lambda n:0 if n==0 else popcount(n/2)+n%2
print(1<<popcount(int(raw_input())))
using System;
using System.Runtime.InteropServices;
class CodeIQ2812{
[DllImport("msvcrt",CallingConvention=CallingConvention.Cdecl)]static extern int __popcountdi2(long n);
[DllImport("msvcrt",CallingConvention=CallingConvention.Cdecl)]static extern int __sched_cpucount(int n, long[] a);
static int popcount(long n){
//Es gibt keine Möglichkeit, dies zur Kompilierungszeit zu bestimmen. Kommentieren Sie dies daher entsprechend aus
//return __popcountdi2(n);
return __sched_cpucount(8,new long[]{n});
//return n==0 ? 0 : popcount(n/2)+(int)(n%2);
}
static void Main(){
int n=int.Parse(Console.ReadLine());
Console.WriteLine(1<<popcount(n));
}
}
Wenn Sie sich fragen, ob der Marshalling-Overhead möglicherweise größer ist, ist dies wahrscheinlich ein Treffer. Verwenden Sie diese Methode systematisch.
Recommended Posts