[RUBY] Lourd en rubis! ??

0. Test de compétence Dinosaure x

Je n'ai pas pu améliorer mes compétences en raison d'un travail acharné ces jours-ci. Pour une raison quelconque, je suis plus occupé qu'avant le télétravail, même s'il est devenu mon télétravail chéri depuis longtemps. Et surtout, l'idée d'un programme pour éteindre un dinosaure est en train de disparaître. J'ai appris plus récemment

"Les dinosaures sont des reptiles"

Ensuite, j'ai trouvé "Hebi" dans le test de compétence.

J'ai aimé le titre que je lui ai donné et je me sentais destiné, alors J'ai écrit un processus pour le résoudre.

Et plus le rang est élevé, plus l'énoncé du problème est long et plus __ "Pouvez-vous suivre le degré de compréhension et sa vision du monde?" __. __ "Le but est de résoudre le problème" Pour ceux qui veulent la beauté et la brièveté du code, les phrases suivantes sont inutiles. __

Enfin, je vais mettre un code sale. Et __ "N'acceptez pas les titres qui vous rendent nostalgique et froid" __ Commençons par réfléchir.

1. Problème "serpent"

Essayez de coller le problème avec une image.

D7BA2F36-25C6-42F5-9BC6-C268DDF6C63E.jpeg

43193582-B07E-404F-82A8-37E5032D640E.jpeg

2. Contrôle des limites de la destination

2.1 Plage de mouvement

Les informations affichées sur la première ligne sont les largeurs verticale et horizontale dans lesquelles le serpent peut se déplacer. Soit y la verticale et x l'horizontale 0 <= y <= H-1,0 <= x <= W-1 est la plage mobile.

2.2 Y a-t-il un mur à la destination?

Le mur est représenté par #, et s'il l'est, il peut être déplacé. Ce que vous pouvez voir ici, c'est que si 2.1 n'est pas satisfait, c'est NG, Si 2.2 n'est pas satisfait, c'est NG, et si les deux sont satisfaits, c'est OK.

La fonction check_limit a été créée en tant que fonction pour juger de ce qui précède.

3. 3. Coordonne cette transition avec la direction

Ici, quand on leur donne la direction (direction face) et la direction à prendre, Dans quelle mesure les coordonnées de destination de la transition sont dans les directions des lignes et des colonnes par rapport aux coordonnées actuelles Déplacez-vous ou vérifiez la direction suivante.

Dans la figure, la relation est la suivante.

C53E1D06-9E48-4A54-A78A-5B3DADA94193.jpeg

3.1 Lorsque la direction à laquelle vous faites face est le nord (N)

Lorsque vous vous déplacez vers la droite, déplacez-vous vers la droite de l'endroit où vous vous trouvez, c'est-à-dire 0 ligne et 1 colonne. La prochaine direction est l'est. Lorsque vous vous déplacez vers la gauche, déplacez-vous vers la gauche de l'endroit où vous vous trouvez, c'est-à-dire déplacez 0 lignes-1 colonnes. La prochaine direction est l'ouest. Si l'orientation n'est pas spécifiée (c'est le cas lorsque ce n'est pas le moment de changer de direction, défini sur aucune), remontez d'où vous êtes, c'est-à-dire déplacez -1 ligne 0 colonne. La prochaine direction est le nord.

3.2 Lorsque la direction à laquelle vous faites face est l'est (E)

Lorsque vous vous déplacez vers la droite, déplacez d'une ligne (en bas) 0 colonnes de l'endroit où vous vous trouvez La prochaine direction est le sud. En allant vers la gauche, déplacez -1 ligne (vers le haut) 0 colonnes de l'endroit où vous vous trouvez. La prochaine direction est le nord. Lorsque l'orientation est nulle, déplacez 0 ligne et 1 colonne (à droite) de l'endroit où vous vous trouvez. La prochaine direction est l'est.

La fonction check_direction a été créée sur la base de ces informations. (Je me rends compte maintenant qu'il vaut mieux obtenir que vérifier.)

4. Vérification de la duplication des coordonnées

Les coordonnées que j'ai passées une fois ne peuvent pas être avancées car il y a déjà un corps de serpent. Cette chose. Apparemment, il est censé être un énorme serpent comme Anakonda. Si la destination de transition est déjà passée, le mouvement s'arrêtera.

5. Exemple de code

__ Flux global __ (1) Obtenir la valeur d'entrée (2) Tableau temporel (tableau tarr) pour changer de direction et tableau de direction correspondant (lrarr) Et le processus d'organisation de l'acquisition de données de coordonnées (tableau arr2) "(3) Création d'un jugement sans issue des coordonnées et fonction d'acquisition des coordonnées de mouvement et de la direction du mouvement" (4) Répétez ce qui suit de 0 à 99 ' (I) Trouver les coordonnées de destination de la transition (ny, nx) et la direction suivante (next_dir) pour la direction faisant face aux coordonnées actuelles (sy, sx) et la direction de déplacement '' (Ii) Vérifiez si les coordonnées de destination de la transition sont des impasses (s'il y a une impasse, quittez la boucle) (Ⅲ) Si ce n'est pas une impasse, vérifiez si ce sont les coordonnées que vous avez passées jusqu'à présent (Ⅳ) Si les coordonnées ne sont pas passées jusqu'à présent, définissez ces coordonnées comme (sy, sx) et stockez-les dans snake_arr. '' (V) Dans le cas des coordonnées passées jusqu'ici (dans le cas des coordonnées enregistrées dans snake_arr) Quitter la boucle (5) Assignez * aux données arr2 des coordonnées enregistrées dans le tableau snake_arr (6) Sortie arr2`


#Dans votre langue préférée
# Let'Défi! !!

in1 = gets.chomp!
#puts(in1)
arr1=in1.split(' ')
#print(arr1)


row1=arr1[0].to_i
col1=arr1[1].to_i
sy=arr1[2].to_i
sx=arr1[3].to_i
num1=arr1[4].to_i


arr2 = Array.new(row1) { Array.new(col1,"") }

#print(arr2)

for i in 1..row1 do
    tmp1=gets.chomp.to_s
    for j in 1..col1 do
        arr2[i-1][j-1]=tmp1[j-1...j]
    end
end

tarr=[]
lrarr=[]


for i in 1..num1 do
    tmp1=gets.chomp.to_s
    arr3=tmp1.split(" ")
    tarr.push(arr3[0].to_i)
    lrarr.push(arr3[1])
    #in3.push(tmp1)
end



def check_limit(arr0,i,j,row1,col1)
    if i<0 or i>row1-1
        flg=1
    elsif j<0 or j>col1-1
        flg=1
    elsif arr0[i][j]=="#"
        flg=1
    else
        flg=0
    end
    return flg
end 


def check_direction(p_dir,rlstr)
    retstr=""
    if p_dir=="N"
        if rlstr=="R"
            retstr="0,1,E"
        elsif rlstr=="L"
            retstr="0,-1,W"
        else
            retstr="-1,0,N"
        end
    elsif p_dir=="S"
        if rlstr=="R"
            retstr="0,-1,W"
        elsif rlstr=="L"
            retstr="0,1,E"
        else
            retstr="1,0,S"
        end
    elsif p_dir=="E"
        if rlstr=="R"
            retstr="1,0,S"
        elsif rlstr=="L"
            retstr="-1,0,N"
        else
            retstr="0,1,E"
        end
    else
        if rlstr=="R"
            retstr="-1,0,N"
        elsif rlstr=="L"
            retstr="1,0,S"
        else
            retstr="0,-1,W"
        end
    end
    return retstr
end


def find_lr(sarr,retarr,i2,num1)
    rnum=-1
    for i in 0..num1-1 do
        if sarr[i]==i2
            rnum=i
            break
        end
    end
    return retarr[rnum]
end



snake_arr=[]
snk_str=arr1[2]+" "+arr1[3]
snake_arr.push(snk_str)
#print(snake_arr)
p_dir='N'
flg_e=0
for i in 0..99 do
    if tarr.count(i)==0
        retstr=check_direction(p_dir,"none")
        tmparr=retstr.split(",")
        ny=tmparr[0].to_i+sy
        nx=tmparr[1].to_i+sx
        next_dir=tmparr[2]
        flg=check_limit(arr2,ny,nx,row1,col1)
        
    else
        lrstr=find_lr(tarr,lrarr,i,num1)
        retstr=check_direction(p_dir,lrstr)
        tmparr=retstr.split(",")
        ny=tmparr[0].to_i+sy
        nx=tmparr[1].to_i+sx
        next_dir=tmparr[2]
        flg=check_limit(arr2,ny,nx,row1,col1)
    end    
    
    if flg==0
        sy=ny
        sx=nx
        p_dir=next_dir
        str1=sy.to_s+" "+sx.to_s
        if snake_arr.count(str1)==0
            snake_arr.push(str1)
        else
            flg_e=1
            #puts(1)
        end
    else
        flg_e=1
        #puts(2)
    end    
    if flg_e==1
        break
    end    
end    


#print(snake_arr)
#print(snake_arr.length)


for i in 0..snake_arr.length-1 do
    tmp1=snake_arr[i].to_s.split(" ")
    arr2[tmp1[0].to_i][tmp1[1].to_i]="*"
end


str1=""

for i in 0..row1-1 do
    str1=""
    for j in 0..col1-1 do
        str1=str1+arr2[i][j]
    end
    puts(str1)
end    

Recommended Posts

Lourd en rubis! ??
Triangle de sortie en Ruby
Types de variables dans ruby
Popcount rapide en Ruby
ABC177-Résoudre E avec Ruby
Valider les jetons JWT dans Ruby
Écrire l'héritage de classe dans Ruby
Mettre à jour Ruby dans l'environnement Unicorn
Entiers qui sont unifiés en entiers dans Ruby 2.4
[Ruby] Gestion des exceptions dans les fonctions
Utilisez des variables ruby en javascript.
Multiplication dans un tableau Ruby
À propos des expressions régulières dans Ruby
NCk mod p dans Ruby
Comment itérer indéfiniment en Ruby
Essayez d'implémenter Yuma dans Ruby
Obtenez un affichage délimité à 3 chiffres en Ruby
Encodage lors de l'accès à Windows + Ruby
Comment installer Bootstrap dans Ruby
Implémenter le client gRPC dans Ruby
Ecrire des clés et des valeurs dans Ruby
[Super Introduction] À propos des symboles dans Ruby
Hanachan en Ruby (manipulation non destructive de tableaux)
Informations sur la version openssl dans ruby OPENSSL_VERSION
Méthodes Ruby souvent utilisées dans Rails
Segfo Ruby en 2 lignes
Soyez prudent lorsque vous omettez le retour dans Ruby
Ruby apprentissage 4
Implémenter le poker petit à petit dans Ruby Part 2
[Ruby] Tableau
Ruby apprentissage 5
Bases de Ruby
Implémenter le poker petit à petit dans Ruby Part 1
Informations de répertoire de DEFAULT_CERT_FILE dans Mac ruby 2.0.0
Faire un tri à bulles et sélectionner le tri avec Ruby
Revue Ruby 2
Différences d'écriture en Ruby, PHP, Java, JS
Ajout de rubis