Oprettelse af to dimensionelle arrays i Ruby

click fraud protection

Den følgende artikel er en del af en serie. For flere artikler i denne serie, se Kloning af spillet 2048 i Ruby. For den komplette og endelige kode, se kernen.

Nu hvor vi ved, hvordan algoritmen fungerer, er det tid til at tænke over de data, denne algoritme vil arbejde på. Der er to hovedvalg her: en flad matrix af en slags eller en to-dimensionel matrix. Hver har deres fordele, men inden vi træffer en beslutning, skal vi tage noget i betragtning.

TØRRE Puslespil

En almindelig teknik i at arbejde med gitterbaserede gåder, hvor du er nødt til at kigge efter mønstre som dette, er at skrive et version af algoritmen, der fungerer på puslespillet fra venstre mod højre og derefter rotere hele puslespillet omkring fire gange. På denne måde skal algoritmen kun skrives én gang, og den skal kun arbejde fra venstre mod højre. Dette dramatisk reducerer kompleksiteten og størrelsen af den sværeste del af dette projekt.

Da vi arbejder med puslespillet fra venstre mod højre, er det fornuftigt at have rækkerne repræsenteret af matriser. Når du laver en to-dimensionel matrix i

instagram viewer
Rubin (eller mere præcist, hvordan du ønsker, at de skal adresseres, og hvad dataene faktisk betyder), skal du beslutte, om du vil en stak rækker (hvor hver række af gitteret er repræsenteret af en matrix) eller en stak kolonner (hvor hver søjle er en matrix). Da vi arbejder med rækker, vælger vi rækker.

Hvordan denne 2D-array roteres, kommer vi til, når vi rent faktisk konstruerer en sådan matrix.

Konstruktion af to dimensionelle arrays

Metoden Array.new kan tage et argument, der definerer størrelsen på den array, du ønsker. For eksempel, Array.new (5) vil oprette en matrix med 5 nul objekter. Det andet argument giver dig en standardværdi Array.new (5, 0) vil give dig matrixen [0,0,0,0,0]. Så hvordan opretter du en to-dimensionel matrix?

Den forkerte måde, og den måde, jeg ser folk prøver ofte på, er at sige Array.new (4, Array.new (4, 0)). Med andre ord, en matrix med 4 rækker, hvor hver række er en matrix med 4 nuller. Og det ser ud til at virke først. Kør dog følgende kode:

Det ser enkelt ud. Lav en 4x4-række med nuller, indstil det øverste venstre element til 1. Men udskriv det, og vi får ...

Det satte hele den første kolonne til 1, hvad giver? Da vi lavede matriserne, bliver det indre mest opkald til Array.new kaldt først og lavet en enkelt række. En enkelt henvisning til denne række duplikeres derefter fire gange for at udfylde den ydre række. Hver række henviser derefter til den samme matrix. Skift en, skift dem alle.

I stedet skal vi bruge tredje måde at skabe en matrix på Ruby. I stedet for at videregive en værdi til Array.new-metoden, passerer vi en blok. Blokken udføres hver gang Array.new-metoden har brug for en ny værdi. Så hvis du skulle sige det Array.new (5) {gets.chomp}, Ruby stopper og beder om input 5 gange. Så alt, hvad vi skal gøre, er bare at oprette et nyt array inde i denne blok. Så vi ender med Array.new (4) {Array.new (4,0)}. Lad os nu prøve den testtilfælde igen.

Og det gør, som du kunne forvente.

Så selvom Ruby ikke har støtte til todimensionelle arrays, kan vi stadig gøre, hvad vi har brug for. Bare husk, at det øverste niveau indeholder referencer til undergrupperne, og hver undergruppe skal henvise til en anden række af værdier.

Hvad denne matrix repræsenterer, er op til dig. I vores tilfælde er denne matrix opstillet som rækker. Det første indeks er den række, vi indekserer, fra top til bund. For at indeksere den øverste række af puslespillet bruger vi a [0], for at indeksere den næste række nede, vi bruger a [1]. For at indeksere en bestemt flise i den anden række bruger vi a [1] [n]. Men hvis vi havde bestemt os for kolonner... ville det være den samme ting. Ruby har ikke nogen idé om, hvad vi laver med disse data, og da det teknisk ikke understøtter to-dimensionelle arrays, er det, vi laver her, et hack. Få kun adgang til det ved konvention, og alt holder sammen. Glem hvad dataene nedenfor skal gøre, og alt kan falde fra hinanden virkelig hurtigt.

instagram story viewer