Comment écrire un exemple d'implémentation E11 Ruby et Python en temps réel hors ligne

Problème: http://nabetani.sakura.ne.jp/hena/orde11tredis/ Liens d'implémentation: http://qiita.com/Nabetani/items/10b2ccc28301e44e09e6

Tout d'abord, implémentez ruby.

def each_item(n, list)
  yield( list )
  (2..(n/2)).each do |x|
    next unless n % x==0
    each_item( x+1, list+[x+1] ){ |y| yield(y) }
  end
end

def dist(a,b)
  a.size+b.size - 2*(0..Float::INFINITY).find{ |x| a[x] != b[x] }
end

def impl( root, a, b )
  as=[]
  bs=[]
  each_item(root,[root]){ |x|
    as<<x if x.last==a
    bs<<x if x.last==b
  }
  as.inject(Float::INFINITY) do |d0, ai|
    bs.inject(d0) do |d1, bi|
      d1=[d1, dist(ai,bi)].min
    end
  end
end

def solve( src )
  impl( *src.split(/\D+/).map(&:to_i) ).to_s
end

DATA.map{ |line|
  num, src, expected = line.split( /\s+/ )
  actual = solve( src )
  ok = actual==expected
  puts [ num, ( ok ? "ok" : "**NG**" ), src, actual, expected ].join( " " )
  ok
}.all?.tap{ |x| p( x ? "all okay!" : "something wrong!!" ) }

__END__
0 50:6,3  1
1 98:5,11 4
2 1000:33,20  7

Pour trouver le nombre, omettez O (n).

Stratégie. Vous pouvez trouver la distance en comparant la liste de l'itinéraire à vous-même.

Je n'aime pas la zone autour de ʻeach_item, mais ça ne peut pas être aidé. Je ne suis pas habitué à définir ma propre méthode d'argument yield` ou block.

alors. J'ai porté ceci en python ci-dessous:

import re

def each_item(n,list) :
  yield( list )
  for x in range( 2, n//2+1 ) :
    if n % x == 0 :
      for item in each_item( x+1, list + [x+1] ):
        yield(item)

def dist(a,b):
  n=0
  while n<len(a) and n<len(b) and a[n]==b[n]:
    n+=1
  return len(a) + len(b) - 2*n


def impl( root, a, b ) :
  a_s=[]
  b_s=[]
  for item in each_item(root, [root]) :
    if item[-1]==a:
      a_s.append( item )
    if item[-1]==b:
      b_s.append( item )
  d=1e100
  for a in a_s:
    for b in b_s:
      d = min( d, dist(a,b) )
  return d

def solve( src ):
  root, a, b = [ int(x) for x in re.split( "\\D", src ) ]
  return "%d" % ( impl( root, a, b ) )

def test( src, expected ):
  actual = solve( src )
  ok= ( actual==expected )
  print( "%s : %s -> %s ( %s )" % ( ("ok" if ok else "**NG**"), src, actual, expected ) )

test( "50:6,3", "1" )
test( "98:5,11", "4" )
test( "1000:33,20", "7" )

J'étais confus à propos de l'utilisation de python yield pour la première fois de ma vie, mais c'était la même chose.

Recommended Posts

Comment écrire un exemple d'implémentation E11 Ruby et Python en temps réel hors ligne
Comment écrire un exemple d'implémentation E14 Python en temps réel hors ligne
Comment écrire un exemple d'implémentation Python du problème E15 en temps réel hors ligne
Comment écrire hors ligne en temps réel Résolution des problèmes E05 avec Python
Réponse au "Problème d'écriture en temps réel hors ligne E13"
20e Comment écrire des problèmes en temps réel hors ligne en Python
Comment écrire Ruby to_s en Python
Le 15e comment écrire un problème de référence en temps réel hors ligne en Python
Comment écrire en temps réel hors ligne Résolution des problèmes E04 avec Python
Le 14ème problème de référence d'écriture en temps réel hors ligne en python
Le 18ème comment écrire un problème de référence en temps réel hors ligne en Python
Réponse à "Comment écrire le problème F02 en temps réel hors ligne"
Réponse à "Comment écrire un problème F01 en temps réel hors ligne"
17ème problème de référence d'écriture en temps réel hors ligne implémenté en Python
Comment écrire le bon shebang dans les scripts Perl, Python et Ruby
Comment écrire hors ligne en temps réel J'ai essayé de résoudre E11 avec python
Le 16ème comment écrire un problème de référence en temps réel hors ligne à résoudre avec Python
Le 19ème comment écrire un problème de référence en temps réel hors ligne à résoudre avec Python
Le 15e problème d'écriture en temps réel hors ligne a été résolu avec python
Comment écrire en temps réel hors ligne J'ai essayé de résoudre E12 avec python
[Python] Comment fractionner et modulariser des fichiers (simple, exemple)
Le 15e temps réel hors ligne, j'ai essayé de résoudre le problème de l'écriture avec python
13th Offline en temps réel Comment résoudre les problèmes d'écriture avec Python
Comment écrire une classe méta qui prend en charge à la fois python2 et python3
Comment appeler Python ou Julia à partir de Ruby (implémentation expérimentale)
[Python / Ruby] Comprendre le code Comment obtenir des données en ligne et les écrire au format CSV
17e comment résoudre les problèmes d'écriture en temps réel hors ligne avec Python
Le 10ème problème de référence d'écriture en temps réel hors ligne. Exemple d'implémentation par Python.
Le 11ème problème de référence d'écriture en temps réel hors ligne. Exemple d'implémentation par python.
Comment écrire hors ligne en temps réel Résolution des problèmes F01 avec Python
Comment empaqueter et distribuer des scripts Python
Comment installer et utiliser pandas_datareader [Python]
Comment écrire des commentaires de document Python (Docstrings)
Réponse à "Comment écrire un problème E12 en temps réel hors ligne"
python: Comment utiliser les locals () et globals ()
[Python] Comment calculer MAE et RMSE
Comment utiliser le zip Python et énumérer
Compressez les données python et écrivez sur sqlite
Comment utiliser is et == en Python
Comment écrire des commentaires pydoc et multi-lignes
Comment profiter de la programmation avec Minecraft (Ruby, Python)
Comment générer une séquence en Python et C ++
[Python] Comment lire les données de CIFAR-10 et CIFAR-100
[Python] Comment utiliser la fonction de hachage et taple.
Comment tracer l'autocorrélation et l'autocorrélation partielle avec Python
Partie 1 J'ai écrit un exemple de la réponse au problème de référence de l'écriture hors ligne en temps réel en Python
[Python] [Django] Comment utiliser le champ de choix et comment ajouter des options
Comment installer Python
Comment écrire une concaténation de chaînes sur plusieurs lignes en Python
Ruby, Python et carte
Comment installer python
Comment écrire un type liste / dictionnaire de Python3
Python et Ruby se séparent
Ce n'est pas facile d'écrire Python, c'est facile d'écrire numpy et scipy
Écrire des tests en Python pour profiler et vérifier la couverture
[Python] Comment écrire une docstring conforme à PEP8