Rufen Sie popcount von Ruby / Python / C # auf

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

Rufen Sie popcount von Ruby / Python / C # auf
Rufen Sie C von Python mit DragonFFI auf
Rufen Sie C / C ++ von Python auf dem Mac auf
Rufen Sie die c-Sprache von Python aus auf (python.h)
Rufen Sie Python-Skripte aus Embedded Python in C ++ / C ++ auf
[Python] So rufen Sie eine Funktion von c aus Python auf (ctypes edition)
Rufen Sie Matlab von Python zur Optimierung auf
Rufen Sie C-Sprachfunktionen von Python auf, um mehrdimensionale Arrays auszutauschen
Tipps zum Aufrufen von Python von C.
Führen Sie Python-Code über die C # -GUI aus
Führen Sie Python-Skripte synchron von C # aus
Rufen Sie Python von Nim mit Nimpy auf
Wie man Python oder Julia von Ruby aus aufruft (experimentelle Implementierung)
Rufen Sie mit ctypes Ihre eigene gemeinsam genutzte Bibliothek in C-Sprache von Python aus auf
Vergleich der Deserialisierungsleistung von msgpack (C ++ / Python / Ruby)
Versuchen Sie, Python von Ruby aus mit Sparsamkeit aufzurufen
Generieren Sie mit Python eine C-Sprache aus dem S-Ausdruck
Verwenden von C ++ - Funktionen aus Python mit pybind11
Aufrufbefehle von Python (Windows Edition)
C-Sprache zum Anzeigen und Erinnern Teil 2 Rufen Sie die C-Sprache aus der Python-Zeichenfolge (Argument) auf
SQL zu SQL
C-Sprache zum Sehen und Erinnern Teil 1 Rufen Sie die C-Sprache aus Python auf (Hallo Welt)
Python C ++ Notizen
Python, openFrameworks (c ++)
MeCab von Python
C-Sprache zum Anzeigen und Erinnern Teil 4 Rufen Sie die C-Sprache von Python (Argument) double auf
C-Sprache zum Anzeigen und Erinnern Teil 5 Rufen Sie die C-Sprache aus dem Python-Array (Argument) auf
Führen Sie Python-Skripte in C # -GUI-Anwendungen aus
Erstellen Sie ein C-Array aus einer Python> Excel-Tabelle
Wickeln Sie C mit Cython für Python ein
Rufen Sie die Python-Bibliothek zur Textnormalisierung in MATLAB auf
Python vs Ruby "Deep Learning von Grund auf neu" Zusammenfassung
Wrap C ++ mit Cython zur Verwendung von Python
Ich möchte C ++ - Code aus Python-Code erstellen!
paiza POH ec-Kampagne (C # / Java / Python / Ruby) # paizahack_01
Rufen Sie Polly aus dem AWS SDK für Python auf
Eine einfache Möglichkeit, Java von Python aus aufzurufen
C-Sprache zum Sehen und Erinnern Teil 3 Rufen Sie die C-Sprache aus Python auf (Argument) c = a + b
Verwenden Sie thingspeak aus Python
Berühren Sie MySQL in Python 3
Bedienen Sie Filemaker von Python aus
Verwenden Sie fließend Python
Python C / C ++ - Erweiterungsmusterzeiger
Änderungen von Python 2 zu Python 3.0
Python aus oder importieren
Rufen wir Ihre eigene C ++ - Bibliothek mit Python auf (Einstellungen)
Verwenden Sie MySQL aus Python
Ruby, Python und Map
Führen Sie Python aus Excel aus
Installieren Sie Python von der Quelle
Führen Sie Befehle aus Python aus
Python zeigt aus der Perspektive eines C-Sprachprogrammierers
Weiter Python in C-Sprache
MessagePack-Aufruf von Ruby to Python-Methoden (oder Python to Ruby-Methoden) mithilfe von RPC
Bedienen Sie Neutronen von Python!
Python und Ruby teilen sich
Verwenden Sie MySQL aus Python
Betreiben Sie LXC von Python aus
Manipuliere Riak aus Python
Erzwinge Python aus Fortran