[RUBY] réécrire à moins que

Origine

Il y a un code ↓ dans le code des autres qui regardent actuellement.

tgt


unless hash.has_key?("1") || hash.has_key?("2") || hash.has_key?("3") || arr1.size == 0 || arr2.size == 0
  ....
end

En fait, il est mêlé de déni. Au milieu d'une énorme quantité de code pour exécuter un test. En outre, il y a pas mal d'instructions ʻà moins` avec plusieurs conditions ... Je ne peux pas imaginer le comportement avec mon miso fou de cerveau. Je suis désolé.

Même si vous essayez Gugu, l'explication de de Morgan s'explique au mieux sous deux conditions.

Il n'y a aucune aide pour cela, alors créez un modèle de script pour confirmation.

concept

Premièrement, sous deux conditions. Appelez la valeur 0, 1 au lieu de l'expression conditionnelle.

2.pl


my @d = ( [0,0],[1,0],[0,1],[1,1] ) ;
for my $r ( @d ){
    print join "", @{$r} unless $r->[0] || $r->[1] ;
}
$ perl -l 2.pl
00

unless A || BQuant à la condition qui tient, la première expression conditionnelle est fausse(0), La deuxième expression conditionnelle est également fausse(0)Je le sais. En d'autres termesif ! A and ! B

Sujet principal

Alors qu'en est-il de tgt?

Puisqu'il y a au plus 5 pièces, le cordon est poussé

python


$ ruby -e 'p [0,1].product([0,1],[0,1],[0,1],[0,1])'
[[0, 0, 0, 0, 0], [0, 0, 0, 0, 1], [0, 0, 1, 0, 0], [0, 0, 1, 0, 1], [0, 1, 0, 0, 0], [0, 1, 0, 0, 1],
 [0, 1, 1, 0, 0], [0, 1, 1, 0, 1], [1, 0, 0, 0, 0], [1, 0, 0, 0, 1], [1, 0, 1, 0, 0], [1, 0, 1, 0, 1], 
[1, 1, 0, 0, 0], [1, 1, 0, 0, 1], [1, 1, 1, 0, 0], [1, 1, 1, 0, 1]]

Intégrez ceci dans le code source

5.pl


#!/usr/bin/env perl
my @d = (
    [0, 0, 0, 0, 0], [0, 0, 0, 0, 1],
    [0, 0, 0, 1, 0], [0, 0, 0, 1, 1],
    [0, 0, 1, 0, 0], [0, 0, 1, 0, 1],
    [0, 0, 1, 1, 0], [0, 0, 1, 1, 1],
    [0, 1, 0, 0, 0], [0, 1, 0, 0, 1],
    [0, 1, 0, 1, 0], [0, 1, 0, 1, 1],
    [0, 1, 1, 0, 0], [0, 1, 1, 0, 1],
    [0, 1, 1, 1, 0], [0, 1, 1, 1, 1],
    [1, 0, 0, 0, 0], [1, 0, 0, 0, 1],
    [1, 0, 0, 1, 0], [1, 0, 0, 1, 1],
    [1, 0, 1, 0, 0], [1, 0, 1, 0, 1],
    [1, 0, 1, 1, 0], [1, 0, 1, 1, 1],
    [1, 1, 0, 0, 0], [1, 1, 0, 0, 1],
    [1, 1, 0, 1, 0], [1, 1, 0, 1, 1],
    [1, 1, 1, 0, 0], [1, 1, 1, 0, 1],
    [1, 1, 1, 1, 0], [1, 1, 1, 1, 1]
) ;

for my $r ( @d ){
    print join "", @{$r} unless $r->[0] || $r->[1] || $r->[2] || $r->[3] || $r->[4] ;
}

Exécuter.

python


$ perl -l 5.pl
00000

Amélioration

De plus, la génération «@ d» est décrite par «perl» afin que le nombre puisse être modifié [^ 1].

[^ 1]: Je souhaite que «perl» ait aussi «produit». «CPAN»? Rejeté en raison de l'odeur gênante.

perl:5.2.pl


#!/usr/bin/env perl
sub comb{
	my $in = shift ;
	#Combinaison de nombres binaires de 0-Après avoir converti un nombre décimal jusqu'à 1 en un nombre binaire rempli de 0x fois,
	#Divisez un caractère à la fois. Utilisez comme référence de tableau. Et la valeur de retour est Array of Arrays
	map{ [ unpack '(A)*', sprintf "%0${in}b", $_ ] } 0 .. 2 ** $in - 1 ;
}

my @d = comb $ARGV[0] ;
for my $r ( @d ){
    # $ARGV[0] -Même une fois||C'est un problème à écrire, alors
    # ||La chaîne de caractères concaténée avec est eval et elle est utilisée comme argument de sauf.
    #En fait, passez au code qui correspond à la cible de vérification
    print join "", @{$r} unless eval join '||', map{ $r->[$_] } 0 .. $ARGV[0] - 1 ;
}
$ perl -l 5.2.pl 12
000000000000

plus tard,||À&&Ou!Ou, répondez sur place en fonction de l'instruction conditionnelle que vous souhaitez tester.

Oh, c'est moins stressant et vous pouvez changer «sauf» en «si».

Serpentin

Lorsque vous n'utilisez pas de nombres binaires.

python


sub comb {
    my $in = shift ;
    # ([0,0,0..])Faire un tableau
    my @d = ( [(0)x$in] ) ;
    #Hash pour le cache
    my %seen ;
    # @Je lèche d,@Parce que d est poussé dans la boucle et augmente en nombre
    #Conditions séparées pour sortir
    for my $r ( @d ){
        # $r = [ x,x,x,x,x ... ]Changer les éléments de en 1 dans l'ordre,
        #Si c'est une combinaison inconnue@Ajouter à d
        push @d, grep{ ! $seen{ join "", @{$_} } ++ }
                 map { my @k = @{$r} ;  $k[$_] = 1 ; [@k] }
                 0 .. $in - 1  ;
        # [Tout 1]Est la dernière combinaison
        last if +(join '', @{$d[-1]}) eq '1' x $in ;
    }
    return @d ;
}

C'est un code tabou [^ 2]. Dans ce cas, il est difficile de le faire à deux chiffres.

[^ 2]: J'ai écrit ceci au début, puis j'ai eu l'idée que je devrais l'écrire en binaire. Ça fait longtemps, alors je vais laisser ça.

Recommended Posts

réécrire à moins que
à_ ○
Association (1 à 1)! !!
forEach pratique (Partie 1: réécriture de l'instruction forEach vers la méthode forEach)