[RUBY] Schwer in Rubin! ??

0. Dinosaurier x Fähigkeitsüberprüfung

Ich konnte meine Fähigkeiten heutzutage aufgrund harter Arbeit nicht verbessern. Aus irgendeinem Grund bin ich beschäftigter als vor der Telearbeit, obwohl sie zu meiner lang gehegten Telearbeit geworden ist. Und vor allem verschwindet die Idee eines Programms zum Löschen eines Dinosauriers. Ich habe vor kurzem gelernt

"Dinosaurier sind Reptilien"

Dann fand ich "Hebi" in der Fähigkeitsüberprüfung.

Ich mochte den Titel, den ich ihm gab, beiläufig und fühlte mich dazu bestimmt Ich habe einen Prozess geschrieben, um es zu lösen.

Und je höher der Rang, desto länger die Problemstellung und desto mehr __ "Können Sie mit dem Grad des Verständnisses und seiner Sicht auf die Welt Schritt halten?" __. __ "Der Zweck ist es, das Problem zu lösen" Für diejenigen, die die Schönheit und Kürze des Codes wollen, sind die folgenden Sätze nicht erforderlich. __ __

Zum Schluss werde ich einen schmutzigen Code einfügen. Und __ "Akzeptiere keine Titel, bei denen du dich nostalgisch und kalt fühlst" __ Beginnen wir mit dem Nachdenken.

1. Problem "Schlange"

Versuchen Sie, das Problem mit einem Bild einzufügen.

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

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

2. Grenzkontrolle des Bestimmungsortes

2.1 Bewegungsbereich

Die in der ersten Zeile angezeigten Informationen sind die vertikalen und horizontalen Breiten, in denen sich die Schlange bewegen kann. Sei y die Vertikale und x die Horizontale 0 <= y <= H-1,0 <= x <= W-1 ist der bewegliche Bereich.

2.2 Befindet sich am Zielort eine Mauer?

Die Wand wird durch # dargestellt, und wenn dies der Fall ist, kann sie verschoben werden. Was Sie hier sehen können, ist, dass wenn 2.1 nicht erfüllt ist, es NG ist, Wenn 2.2 nicht erfüllt ist, ist es NG, und wenn beide zufrieden sind, ist es OK.

Die Funktion check_limit wurde als Funktion zur Beurteilung des oben Gesagten erstellt.

3. 3. Koordiniert diesen Übergang mit der Richtung

Hier, wenn die Richtung (Richtung zugewandt) und die Richtung zu gehen gegeben wird, Wie weit sind die Übergangszielkoordinaten in Zeilen- und Spaltenrichtung im Vergleich zu den aktuellen Koordinaten? Bewegen oder überprüfen Sie die nächste Richtung.

In der Figur ist die Beziehung wie folgt.

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

3.1 Wenn die Richtung, in die Sie blicken, nach Norden zeigt (N)

Wenn Sie nach rechts gehen, bewegen Sie sich von Ihrer Position nach rechts, dh von 0 Zeilen und 1 Spalte. Die nächste Richtung ist Osten. Wenn Sie nach links gehen, bewegen Sie sich von Ihrem Standort nach links, dh verschieben Sie 0 Zeilen - 1 Spalten. Die nächste Richtung ist West. Wenn die Ausrichtung nicht angegeben ist (dies ist der Fall, wenn es nicht an der Zeit ist, die Richtung zu ändern, setzen Sie sie auf "Keine"), gehen Sie von Ihrer Position nach oben, dh verschieben Sie die Spalte -1 Zeile 0. Die nächste Richtung ist Norden.

3.2 Wenn die Richtung, in die Sie blicken, nach Osten zeigt (E)

Wenn Sie nach rechts gehen, verschieben Sie 1 Zeile (unten) 0 Spalten von Ihrer Position Die nächste Richtung ist Süden. Wenn Sie nach links gehen, verschieben Sie -1 Zeile (nach oben) 0 Spalten von Ihrer Position. Die nächste Richtung ist Norden. Wenn die Ausrichtung keine ist, verschieben Sie 0 Zeilen und 1 Spalte (rechts) von Ihrer Position. Die nächste Richtung ist Osten.

Basierend auf diesen Informationen wurde die Funktion check_direction erstellt. (Mir ist jetzt klar, dass get besser ist als check.)

4. Überprüfung der Koordinatenvervielfältigung

Die Koordinaten, die ich einmal übergeben habe, können nicht vorgerückt werden, da es bereits einen Schlangenkörper gibt. Das Ding. Anscheinend soll es eine riesige Schlange wie Anakonda sein. Wenn das Übergangsziel bereits überschritten wurde, stoppt die Bewegung.

5. Codebeispiel

__ Gesamtfluss __ (1) Eingabewert abrufen (2) Zeitarray (Tarr-Array) zum Ändern der Richtung und des entsprechenden Richtungsarrays (lrarr) Und der Prozess der Organisation der Koordinatendatenerfassung (arr2-Array) "(3) Erstellung eines Sackgassenurteils über Koordinaten und Erfassungsfunktion von Bewegungskoordinaten und Bewegungsrichtung" "(4) Wiederholen Sie die folgenden Schritte vom Zeitpunkt 0 bis 99" "(I) Finden Sie die Übergangszielkoordinaten (ny, nx) und die nächste Richtung (next_dir) für die Richtung, die den aktuellen Koordinaten (sy, sx) und der Fahrtrichtung zugewandt ist." (Ii) Überprüfen Sie, ob die Übergangszielkoordinaten Sackgassen sind (wenn es eine Sackgasse gibt, verlassen Sie die Schleife) (Ⅲ) Wenn es keine Sackgasse ist, überprüfen Sie, ob es die Koordinaten sind, die Sie bisher passiert haben `(Ⅳ) Wenn die Koordinaten noch nicht überschritten wurden, setzen Sie diese Koordinaten auf (sy, sx) und speichern Sie sie in snake_arr. `` "(V) Bei den bisher übergebenen Koordinaten (bei den in snake_arr registrierten Koordinaten) Verlasse die Schleife" "(5) Weisen Sie den arr2-Daten der im snake_arr-Array registrierten Koordinaten * zu." "(6) Ausgabe arr2"


#In deiner Lieblingssprache
# Let's Herausforderung! !!

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

Schwer in Rubin! ??
Ausgabedreieck in Ruby
Arten von Variablen in Ruby
Schneller Popcount in Ruby
ABC177 - E in Ruby lösen
Überprüfen Sie JWT-Token in Ruby
Schreiben Sie die Klassenvererbung in Ruby
Aktualisieren Sie Ruby in der Unicorn-Umgebung
Ganzzahlen, die in Ruby 2.4 zu Ganzzahlen zusammengefasst sind
[Ruby] Ausnahmebehandlung in Funktionen
Verwenden Sie Ruby-Variablen in Javascript.
Multiplikation innerhalb eines Ruby-Arrays
Über reguläre Ausdrücke in Ruby
NCk mod p in Ruby
Wie man in Ruby auf unbestimmte Zeit iteriert
Versuchen Sie, Yuma in Ruby zu implementieren
Erzielen Sie eine dreistellig begrenzte Anzeige in Ruby
Codierung unter Windows + Ruby
So installieren Sie Bootstrap in Ruby
Implementieren Sie den gRPC-Client in Ruby
Schreiben Sie Schlüssel und Werte in Ruby
[Super Einführung] Über Symbole in Ruby
Hanachan in Ruby (zerstörungsfreie Array-Manipulation)
OpenSL-Versionsinformationen in Ruby OPENSSL_VERSION
Ruby-Methoden, die häufig in Rails verwendet werden
Segfo Ruby in 2 Zeilen
Seien Sie vorsichtig, wenn Sie die Rückkehr in Ruby weglassen
Rubin lernen 4
Implementierung von Poker nach und nach in Ruby Teil 2
[Ruby] Array
Rubin lernen 5
Ruby-Grundlagen
Implementierung von Poker nach und nach in Ruby Teil 1
Verzeichnisinformationen von DEFAULT_CERT_FILE in Mac Ruby 2.0.0
Blasensortierung durchführen und mit Ruby sortieren auswählen
Ruby Review 2
Schriftliche Unterschiede in Ruby, PHP, Java, JS
Rubinzusatz