Offline in Echtzeit, wie man ein Implementierungsbeispiel für E11 Ruby und Python schreibt

Problem: http://nabetani.sakura.ne.jp/hena/orde11tredis/ Implementierungslinks: http://qiita.com/Nabetani/items/10b2ccc28301e44e09e6

Implementieren Sie zuerst 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

Lassen Sie O (n) weg, um die Zahl zu finden.

Die Strategie. Sie können die Entfernung ermitteln, indem Sie die Liste von der Route mit sich selbst vergleichen.

Ich mag den Bereich um "each_item" nicht, aber ich kann nichts dagegen tun. Ich bin es nicht gewohnt, meine eigene Methode für "Yield" oder Blockargumente zu definieren.

damit. Ich habe dies unten auf Python portiert:

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" )

Ich war verwirrt über die Verwendung von Python Yield zum ersten Mal in meinem Leben, aber es fühlte sich genauso an.

Recommended Posts

Offline in Echtzeit, wie man ein Implementierungsbeispiel für E11 Ruby und Python schreibt
Offline-Echtzeit zum Schreiben eines E14 Python-Implementierungsbeispiels
Offline-Echtzeit zum Schreiben eines Python-Implementierungsbeispiels für das E15-Problem
So schreiben Sie offline in Echtzeit Lösen von E05-Problemen mit Python
Antwort auf "Offline-Echtzeit, wie man ein E13-Problem schreibt"
20. Offline-Echtzeit So schreiben Sie Probleme in Python
Wie schreibe ich Ruby to_s in Python
Das 15. Offline-Echtzeit-Schreiben eines Referenzproblems in Python
So schreiben Sie offline in Echtzeit Lösen von E04-Problemen mit Python
Das 14. Referenzproblem beim Schreiben in Echtzeit in Python
Das 18. Offline-Echtzeit-Schreiben eines Referenzproblems in Python
Antwort auf "Offline in Echtzeit, wie man ein F02-Problem schreibt"
Antwort auf "Offline-Echtzeit, wie man ein F01-Problem schreibt"
17. In Python implementiertes Referenzproblem für das Offline-Schreiben in Echtzeit
So schreiben Sie den richtigen Shebang in Perl-, Python- und Ruby-Skripten
Wie man offline in Echtzeit schreibt Ich habe versucht, E11 mit Python zu lösen
Das 16. Offline-Echtzeit-Schreiben eines Referenzproblems zur Lösung mit Python
Das 19. Offline-Echtzeit-Schreiben eines Referenzproblems zur Lösung mit Python
Das 15. Offline-Problem beim Schreiben in Echtzeit wurde mit Python gelöst
Wie man offline in Echtzeit schreibt Ich habe versucht, E12 mit Python zu lösen
[Python] So teilen und modularisieren Sie Dateien (einfach, Beispiel)
Beim 15. Offline-Echtzeitversuch habe ich versucht, das Problem des Schreibens mit Python zu lösen
13. Offline-Echtzeit So lösen Sie Schreibprobleme mit Python
So schreiben Sie eine Meta-Klasse, die sowohl Python2 als auch Python3 unterstützt
Wie man Python oder Julia von Ruby aus aufruft (experimentelle Implementierung)
[Python / Ruby] Mit Code verstehen Wie man Daten aus dem Internet abruft und in CSV schreibt
17. Offline-Echtzeit So lösen Sie Schreibprobleme mit Python
Das 10. Referenzproblem beim Schreiben in Echtzeit. Implementierungsbeispiel von Python.
Das 11. Referenzproblem beim Schreiben in Echtzeit. Implementierungsbeispiel von Python.
So schreiben Sie offline in Echtzeit Lösen von F01-Problemen mit Python
So verpacken und verteilen Sie Python-Skripte
So installieren und verwenden Sie pandas_datareader [Python]
So schreiben Sie Python-Dokumentkommentare (Docstrings)
Antwort auf "Offline in Echtzeit, wie man ein E12-Problem schreibt"
Python: Verwendung von Einheimischen () und Globalen ()
[Python] Berechnen von MAE und RMSE
Verwendung von Python zip und Aufzählung
Komprimieren Sie Python-Daten und schreiben Sie in SQLite
Verwendung ist und == in Python
Wie schreibe ich pydoc und mehrzeilige Kommentare
Wie man Spaß am Programmieren mit Minecraft hat (Ruby, Python)
So generieren Sie eine Sequenz in Python und C ++
[Python] Lesen von Daten aus CIFAR-10 und CIFAR-100
[Python] Verwendung von Hash-Funktion und Taple.
Wie man Autokorrelation und partielle Autokorrelation mit Python zeichnet
Teil 1 Ich habe ein Beispiel für die Antwort auf das Referenzproblem geschrieben, wie man in Python in Echtzeit offline schreibt
[Python] [Django] Verwendung des Auswahlfelds und Hinzufügen von Optionen
So installieren Sie Python
So schreiben Sie in Python die Verkettung von Zeichenfolgen in mehrere Zeilen
Ruby, Python und Map
So installieren Sie Python
So schreiben Sie einen Listen- / Wörterbuchtyp von Python3
Python und Ruby teilen sich
Es ist nicht einfach, Python zu schreiben, es ist einfach, numpy und scipy zu schreiben
Schreiben Sie Tests in Python, um die Abdeckung zu profilieren und zu überprüfen
[Python] So schreiben Sie eine Dokumentzeichenfolge, die PEP8 entspricht