Appeler popcount depuis Ruby / Python / C #

Problème CodeIQ 2812 "Rouge et Blanc". Pour un aperçu du problème, reportez-vous à Explication. En bref, vous pouvez afficher «1 << popcount (n)». Si vous résolvez en langage C

n;main(){scanf("%d",&n);n=!printf("%d\n",1<<__builtin_popcount(n));}

Cependant, il est nécessaire de concevoir d'appeler ce __builtin_popcount autrement que C. À la suite de l'enquête, il a été constaté que __sched_popcount () peut être utilisé sous Linux et __ popcountdi2 () peut être utilisé sur OS X. La signature est ʻint __sched_popcount (size_t siz, long * a) , mais cela fonctionne pour le moment même si vous passez (8, long long [1] {…})`. C'est parce que ce dernier est interprété comme ʻint [2] {…} ʻ dans un environnement 32 bits, et __sched_popcount renvoie la somme.

Pour appeler ces fonctions dans Ruby / Python / C #: Le numéro magique 8 doit être évité si possible. Python est le plus précis car il dit ctypes.sizeof (ctypes.c_long).

#!/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)

Puisque Ruby de CodeIQ est 1.9.3, procédez comme suit. C'est sale parce qu'il a des variables globales, mais c'est inévitable.

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){
		//Il n'y a aucun moyen de déterminer au moment de la compilation, alors commentez de manière appropriée
		//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));
	}
}

Si vous vous demandez si la surcharge de marshalling peut être plus importante, c'est probablement un succès. Utilisez cette méthode systématiquement.

Recommended Posts

Appeler popcount depuis Ruby / Python / C #
Appeler C depuis Python avec DragonFFI
Appeler C / C ++ depuis Python sur Mac
Appeler le langage C depuis Python (python.h)
Appel de scripts Python à partir de Python intégré en C ++ / C ++
[Python] Comment appeler une fonction de c depuis python (édition ctypes)
Appelez Matlab depuis Python pour optimiser
Appeler des fonctions du langage C depuis Python pour échanger des tableaux multidimensionnels
Conseils pour appeler Python à partir de C
Exécuter du code Python à partir de l'interface graphique C #
Exécutez des scripts Python de manière synchrone à partir de C #
Appelez python de nim avec Nimpy
Comment appeler Python ou Julia à partir de Ruby (implémentation expérimentale)
Appelez votre propre bibliothèque partagée en langage C à partir de Python à l'aide de ctypes
Comparaison des performances de désérialisation de msgpack (C ++ / Python / Ruby)
Essayez d'appeler Python depuis Ruby avec une économie
Générer un langage C à partir d'une expression S avec Python
Utilisation des fonctions C ++ de python avec pybind11
Appeler des commandes depuis Python (édition Windows)
Langage C pour voir et se souvenir de la partie 2 Appeler le langage C à partir de la chaîne Python (argument)
sql à sql
Langage C pour voir et se souvenir de la partie 1 Appeler le langage C depuis Python (bonjour le monde)
notes de python C ++
python, openFrameworks (c ++)
MeCab de Python
Langage C pour voir et se souvenir de la partie 4 Appelez le langage C depuis Python (argument) double
Langage C pour voir et se souvenir de la partie 5 Appel du langage C à partir du tableau Python (argument)
Exécuter des scripts Python à partir d'applications C # GUI
Créer un tableau C à partir d'une feuille Python> Excel
Envelopper C avec Cython pour une utilisation à partir de Python
Appelez la bibliothèque Python pour la normalisation de texte depuis MATLAB
Résumé Python vs Ruby "Deep Learning from scratch"
Envelopper C ++ avec Cython pour une utilisation à partir de Python
Je veux créer du code C ++ à partir de code Python!
paiza POH ec-campagne (C # / Java / Python / Ruby) # paizahack_01
Appeler Polly à partir du kit SDK AWS pour Python
Un moyen simple d'appeler Java depuis Python
Langage C pour voir et se souvenir de la partie 3 Appelez le langage C depuis Python (argument) c = a + b
Utilisez Thingsspeak de Python
Touchez MySQL depuis Python 3
Exploitez Filemaker depuis Python
Utiliser fluentd de python
Pointeur de modèle d'extension Python C / C ++
Changements de Python 2 à Python 3.0
Python depuis ou import
Appelons votre propre bibliothèque C ++ avec Python (Préférences)
Utilisez MySQL depuis Python
Ruby, Python et carte
Exécutez Python à partir d'Excel
Installer Python à partir de la source
Exécuter des commandes depuis Python
Points Python du point de vue d'un programmeur en langage C
Next Python en langage C
Méthodes MessagePack-Call Python (ou Python vers Ruby) à partir de Ruby à l'aide de RPC
Faites fonctionner le neutron de Python!
Python et Ruby se séparent
Utiliser MySQL depuis Python
Faire fonctionner LXC depuis Python
Manipuler riak depuis python
Forcer Python depuis Fortran