WebHU - Programozási kérdések és válaszok

Töltse ki a Hash-t nulla értékekkel, ha nincs megadva érték

Nekem ezek a tömbök vannak:

positions = [[0, 1, 2], [2, 3]] 
values = [[15, 15, 15], [7, 7]]
keys = [1, 4]

Létre kell hoznom egy hash-t, amelynek kulcsai keys, az értékek pedig values-ból származnak. Az értékeknek a positions. If no index is defined,nil-ben meghatározott indexeken kell lenniük, hozzá kell adni ehhez az indexhez.

A három tömb ugyanannyi elemet tartalmaz; Az keys két elemből áll, values kettőből és positions kettőből. Szóval rendben van.

Várható kimenet:

hash = {1=>[15, 15, 15, nil], 4=>[nil, nil, 7, 7]}

  • Mutasd meg, mit próbáltál eddig. 05.04.2017
  • Az első érték nulla a végén, mert az összes pozícióban található legnagyobb index 3? 05.04.2017
  • @Зелёный Kicsit nehéz megmutatni. Csak kibontottam azt a három tömböt (kulcsok, értékek, pozíciók) az előző adatokból, és most megragadtam ennél a résznél. A próbálkozásaim a következők voltak: Hash[keys.zip values values.values_at(positions) ] Tudom, hogy hülyeség, csak beillesztettem az ötletet. 05.04.2017
  • @adubogdan, igen, a legnagyobb index a 3. 05.04.2017
  • @Andrey Deineko, elég nehéz megmagyarázni, de ezek a nulla értékek jelzik, hogy hol van szükség adatra más tömbökben (2d tömbben)... 05.04.2017
  • @adubogdan és a legnagyobb index, amit egy változóban tartok (változhat) 05.04.2017
  • Van egy olyan érzésem, hogy érdemes megmutatni a kezdeti problémádat (vagy legalább egy-két lépést, mielőtt idáig eljutottál). 05.04.2017
  • @Andray Deineko - jó szórakozást! Te kérted 05.04.2017
  • Esetleg link a varázsnégyzet probléma meghatározásához? 05.04.2017
  • Nincs linkem hozzá. Wikipédia - en.wikipedia.org/wiki/Magic_square. Találnom kell egy Multiplikatív mágikus négyzetet az adott bemenetben (esetemben $inputs tömb) 05.04.2017
  • Azt hiszem, értem, hogyan számították ki a 4 kulcs értékét, de fogalmam sincs, hogyan kapták meg a 1 értékét. Elmagyaráznád kérlek? 05.04.2017
  • @Cary Swoveland, néhány órára távol vagyok, de ha jól értettem, ezek mind a row_sums(arr) módszerrel vannak kiszámítva. Később létrehoztam egy hash-t, amely tartalmazza a releváns értékek indexeit, és generáltam, amely csak azokat a releváns értékeket tartalmazza. Remélem érthetően fogalmaztam... 05.04.2017

Válaszok:


1

Kezdődjön a cipzározás ???? (válasz az eredeti kérdésre):

row_size = positions.flatten.max.next

rows = positions.zip(values).map do |row_positions, row_values|
  row = Array.new(row_size)
  row_positions.zip(row_values).each_with_object(row) do |(position, value), row|
    row[position] = value
  end
end

keys.zip(rows).to_h # => {1=>[15, 15, 15, nil], 4=>[nil, nil, 7, 7]}
05.04.2017
  • Közszolgáltatásként vegye fontolóra, hogy az elejére írjon be egy olyan mondatot, amely kimondja a megválaszolandó kérdést. :-) 05.04.2017
  • Van valami oka annak, hogy a .next-t használja a ` + 1` helyett? 05.04.2017
  • @EricDuminil, általában csak akkor használom a + 1-t, ha már írtam valamilyen képletet x * y - z + 1. Kicsit furcsa keverni az angol magyarázatokat (más néven metódushívások/láncok) matematikai jelölésekkel (más néven műveletek + és számok 1) és fordítva. De ez egy apró dolog, és nagyon sok vélemény alapú. 05.04.2017
  • Oké. Ez azonban zavart okozhat a Enumerator#next-vel. A `+1` kevésbé kétértelmű IMHO. 05.04.2017
  • „Kicsit furcsa az angol magyarázatokat (más néven metódushívásokat/láncokat) matematikai jelölésekkel keverni” – használd a positions.flatten.max.public_send(:+, 1)-t :) 05.04.2017
  • @EricDuminil, van String#next is. Az ötlet az, hogy sok ?következő? dolog van a Rubyban, csakúgy, mint sok olyan dolog, amelyhez hozzáadhatja a 1 elemet. Tisztában kell lennie azzal, hogy mi a koncepció a ?következő? dolog mögött. De ha úgy tetszik, használhatja helyette a #succ-t. 05.04.2017
  • nekem next itt tökéletesen rubinos :) 05.04.2017
  • Egy alternatíva a row_size = positions.flatten.max + 1 # Believe me, I'm a nerd! ;) 05.04.2017
  • @EricDuminil, a #next használata nyilvánvalóan 57/11-szer jobb, mint a + 1. (: 05.04.2017
  • @ndn: Köszönöm a nevetést. Ez is -57/31 jobb, mint az elfogadott válasz. 05.04.2017

  • 2

    Csak kíváncsiságból:

    nils = (0..positions.flatten.max).zip([nil]).to_h
    keys.zip(positions, values).group_by(&:shift).map do |k, v|
      [k, nils.merge(v.shift.reduce(&:zip).to_h).values]
    end.to_h
    #⇒ {1=>[15, 15, 15, nil], 4=>[nil, nil, 7, 7]}
    
    05.04.2017

    3

    Nem a legtisztább.. de működik :P

    max = positions.flatten.max + 1
    pv = positions.zip(values).map { |o| o.transpose.to_h }
    h = {}
    pv.each_with_index do |v, idx|
      h[keys[idx]] = Array.new(max).map.with_index { |_, i| v[i] }
    end
    
    # h
    # {1=>[15, 15, 15, nil], 4=>[nil, nil, 7, 7]}
    

    vagy ha jobban szeretne tömöríteni, de kevésbé olvasható..

    keys.zip(positions.zip(values).map { |o| o.transpose.to_h }).reduce({}) do |h, (k, v)|
      h[k] = Array.new(max).map.with_index { |_, i| v[i] }
      h
    end
    
    05.04.2017
  • Számos elem nem korlátozódik szigorúan 4-re. 05.04.2017
  • Erről nem volt szó az eredeti kérdésben, de most javítva. Csak a legmagasabb indexet kell megszereznie a pozíciókban. Valójában az egyik megjegyzésben a szerző megemlítette a legmagasabb indexet is: IS 3. @mudasobwa 05.04.2017
  • A legmagasabb index IS 3 ≠ az elemek száma szigorúan 4-ra van korlátozva. BTW, az ilyen konstansok keménykódolása egy kódszagú. 05.04.2017
  • Nem számít azonban, hogy ebben a forgatókönyvben hány elem van. És szerintem teljesen rendben van, ha konstansként kinyerték, és ha ez egy felismert és elfogadott megszorítás a rendszerben, ami egyben megszünteti a max minden alkalommal történő újraszámítását. 05.04.2017

  • 4
    new_hash = {}
    
    keys.each_with_index do |key, index|
    
        new_hash[key] = Array.new(positions.flatten.max + 1)
        value_array = values[index] 
        position_array = positions[index] 
        position_array.each_with_index.map { |element, i| new_hash[key][element] = value_array[i]} 
    end 
    new_hash
    

    Remélem ez sikerülni fog.

    05.04.2017
  • Számos elem nem korlátozódik szigorúan 4-re. 05.04.2017
  • Új anyagok

    A rádiógomb ellenőrzött eseményének használata a jQueryben
    Ebben a cikkben látni fogjuk, hogyan kell dolgozni a jquery választógombbal ellenőrzött eseményeivel. A választógombok HTML gombok, amelyek segítenek kiválasztani egyetlen értéket egy csoportból...

    Körkörös függőségek megoldása terraformban adatforrásokkal – lépésről lépésre
    Mi az a körkörös függőségek Dolgozzunk egy egyszerű eseten, amikor az SQS-sor és az S3-vödör közötti körkörös függőség problémája van egy egymástól függő címkeérték miatt. provider..

    Miért érdemes elkezdeni a kódolást 2023-ban?
    01100011 01101111 01100100 01100101 — beep boop beep boop Világunk folyamatosan fejlődik a technológia körül, és naponta fejlesztenek új technológiákat a valós problémák megoldására. Amint..

    🎙 Random Noise #2  – Örökbefogadás és hit
    az analitika íratlan világának gondozása Szeretné, hogy ezek a frissítések a postaládájába kerüljenek? Iratkozzon fel itt . "Ha önvezető autókat gyártanak, akkor mi miért ne..

    A legrosszabb politika és prediktív modellek májátültetésre jelöltek számára az Egyesült Államokban
    A máj (vagy óangolul lifer) az emberi test legnehezebb belső szervére utal, amely csendesen működik a nap 24 órájában. Mit csinál a máj? 500 feladatot hajt végre a szervezet egészségének..

    5 webhely, amely 2022-ben fejleszti front-end fejlesztői készségeit
    Frontendmentor.io A tényleges projektek létrehozásával a Frontendmentor.io segítséget nyújt a front-end kódolási képességeinek fejlesztésében. A kódolást azután kezdheti meg, hogy..

    Mikor kell használni a Type-t az interfészhez képest a TypeScriptben?
    A TypeScript a JavaScript gépelt szuperkészlete, amely statikus gépelést ad a nyelvhez. Ez megkönnyíti a robusztus és karbantartható kód írását azáltal, hogy a hibákat a fordítási időben..