[RUBY] Exemple d'implémentation de F06 d'écriture en temps réel hors ligne

Problème: http://nabetani.sakura.ne.jp/hena/ordf06numit/ Liens d'implémentation: https://qiita.com/Nabetani/items/deda571c9451bd7d3175

Je pense que c'est une option pour faire un mémo tout en l'appelant récursivement. Les personnes qui ont peur des appels récursifs peuvent avoir leur propre pile, mais si vous vous récitez sans vous en soucier, cela ressemble à ceci. D'abord avec du rubis.

ruby:ruby2.4.2


class Solver
  def initialize( f, g )
    @f=f
    @g=g
    @memo={}
  end
  def solve( root, num )
    return 0  if root<num
    return @memo[root] ||= ( root==num ? 1 : 0 ) + solve( @f[root], num ) + solve( @g[root], num )
  end
end

class SolverNoMemo
  def initialize( f, g )
    @f=f
    @g=g
  end
  def solve( root, num )
    return 0  if root<num
    return ( root==num ? 1 : 0 ) + solve( @f[root], num ) + solve( @g[root], num )
  end
end

def solve( src )
  Solver.new(
    ->(x){ x/2-10 },
    ->(x){ x*2/3 }
  ).solve( *src.split(?,).map(&:to_i) ).to_s
end

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

__END__
0 123,4 5 liens
1 1,1 1 lien
30  5745432,1032 1287 Abréviation

La plupart des données de test sont omises. "SolverNoMemo" est une version sans notes. Cela prend environ 1 minute ici. Si vous rédigez un mémo, cela prendra moins d'une seconde.

Puis avec C99. Ce n'est que la version avec mémo.

c99


#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int solve_impl( int root, int num, int * buffer )
{
  if ( root<num ){
    return 0;
  }
  if ( root==num ){
    return 1;
  }
  if ( buffer[root] ){
    return buffer[root];
  }
  int a=solve_impl( root/2-10, num, buffer) + solve_impl( root*2/3, num, buffer);
  buffer[root]=a;
  return a;
}

char const * solve( char const * src )
{
  int root = atoi(src);
  char const * comma = strchr( src, ',' );
  int num = atoi( comma+1 );
  int * buffer = calloc( sizeof(int), root+1 );
  int ans = solve_impl( root, num, buffer );
  free( (void*)buffer);
  char s[100];
  sprintf( s, "%d", ans );
  return strdup(s);
}

void test( char const * src, char const * expected )
{
  char const * actual = solve( src );
  _Bool okay = 0==strcmp( actual, expected );
  printf( "%s %s->%s / %s\n", (okay ? "ok" : "**NG**"), src, actual, expected );
  free( (void*)actual );
}

int main(void)
{
/*0*/ test( "123,4", "5" );
/*1*/ test( "1,1", "1" );
/*2*/ test( "2,1", "1" );
/*30*/ test( "5745432,1032", "1287" );  
}

Ce problème ne devient pas beaucoup plus long en C.

Après tout, la gestion de la mémoire est gênante. Si vous oubliez de le libérer, vous ne le remarquerez pas.

On craignait que ce ne soit trop simple comme problème, mais il y avait diverses choses sur le terrain. J'espère que ça vous plait.

Recommended Posts

Exemple d'implémentation de F06 d'écriture en temps réel hors ligne
Comment écrire un exemple d'implémentation F03 ruby et C en temps réel hors ligne
Comment écrire un exemple d'implémentation Java d'un problème F01 en temps réel hors ligne
Comment écrire un exemple d'implémentation F04 ruby et C99 en temps réel hors ligne
Comment écrire un exemple d'implémentation du problème dans E05 (ruby, C11) en temps réel hors ligne
Comment rédiger la réponse à la 15e question de référence hors ligne
Comment écrire des rails
Comment écrire docker-compose
Comment écrire Mockito
Comment écrire un fichier de migration
Comment écrire du bon code
Comment rédiger un commentaire java
Comment écrire Junit 5 organisé
Comment écrire des graines de Rails
Comment écrire le routage Rails
Étudier Java # 6 (Comment écrire des blocs)
[Rails] Comment écrire la gestion des exceptions?
Comment écrire une déclaration de variable Java
Comment rédiger un code facile à comprendre [Résumé 3]
[Basique] Comment écrire un auto-apprentissage Dockerfile ②
[Introduction à Java] Comment écrire un programme Java
[Java] Comment sortir et écrire des fichiers!
Comment écrire un spécificateur de coupe de point Spring AOP
[SpringBoot] Comment écrire un test de contrôleur
Promesse JDBC et exemple d'écriture
Rails: comment bien écrire une tâche de râteau
[Java FX] Comment écrire des autorisations Eclipse dans build.gradle
[Rails] Comment écrire lors de la création d'une sous-requête
Bases du développement Java ~ Comment écrire des programmes * Exercice 1 ~
Comment écrire une instruction if pour améliorer la lisibilité-java
JUnit 5: Comment écrire des cas de test dans enum
Comment écrire du code qui pense Ruby orienté objet
Comment écrire du code de test avec la certification de base
Comment écrire React Native Bridge ~ Version Android ~
[Java] Mémo sur la façon d'écrire la source
Comment écrire Java String # getBytes dans Kotlin?
Notes sur la façon de rédiger des commentaires en anglais
Javaer résume comment écrire des propriétés C #
[Ruby on Rails] Comment écrire enum en japonais
Comment écrire Scala du point de vue de Java
[Java] Types de commentaires et comment les rédiger
Comment écrire un test unitaire pour Spring Boot 2
java: Comment écrire une liste de types génériques [Note]
[Même les débutants peuvent le faire! ] Comment écrire Javadoc
Comment écrire pour appliquer Gem Pagy (pagination) à un tableau
Comment écrire une recherche de comparaison de dates dans Rails
Comment écrire du Java moderne. Immuable Java, Null Considérez la sécurité.