abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
    dnes 16:44 | IT novinky

    Počítačová hra Tetris slaví 40 let. Alexej Pažitnov dokončil první hratelnou verzi 6. června 1984. Mezitím vznikla celá řada variant. Například Peklo nebo Nebe. Loni měl premiéru film Tetris.

    Ladislav Hagara | Komentářů: 0
    dnes 10:44 | Nová verze

    MicroPython (Wikipedie), tj. implementace Pythonu 3 optimalizovaná pro jednočipové počítače, byl vydán ve verzi 1.23.0. V přehledu novinek je vypíchnuta podpora dynamických USB zařízení nebo nové moduly openamp, tls a vfs.

    Ladislav Hagara | Komentářů: 0
    dnes 10:22 | Nová verze

    Canonical vydal Ubuntu Core 24. Představení na YouTube. Nová verze Ubuntu Core vychází z Ubuntu 24.04 LTS a podporována bude 12 let. Ubuntu Core je určeno pro IoT (internet věcí) a vestavěné systémy.

    Ladislav Hagara | Komentářů: 1
    dnes 01:00 | Nová verze Ladislav Hagara | Komentářů: 0
    včera 19:55 | IT novinky

    Intel na veletrhu Computex 2024 představil (YouTube) mimo jiné procesory Lunar Lake a Xeon 6.

    Ladislav Hagara | Komentářů: 0
    včera 13:44 | IT novinky

    Na blogu Raspberry Pi byl představen Raspberry Pi AI Kit určený vlastníkům Raspberry Pi 5, kteří na něm chtějí experimentovat se světem neuronových sítí, umělé inteligence a strojového učení. Jedná se o spolupráci se společností Hailo. Cena AI Kitu je 70 dolarů.

    Ladislav Hagara | Komentářů: 0
    včera 13:22 | Nová verze

    Byla vydána nová verze 14.1 svobodného unixového operačního systému FreeBSD. Podrobný přehled novinek v poznámkách k vydání.

    Ladislav Hagara | Komentářů: 0
    včera 12:55 | Zajímavý software

    Společnost Kaspersky vydala svůj bezplatný Virus Removal Tool (KVRT) také pro Linux.

    Ladislav Hagara | Komentářů: 11
    včera 12:33 | Nová verze

    Grafický editor dokumentů LyX, založený na TeXu, byl vydán ve verzi 2.4.0 shrnující změny za šest let vývoje. Novinky zahrnují podporu Unicode jako výchozí, export do ePub či DocBook 5 a velké množství vylepšení uživatelského rozhraní a prvků editoru samotného (např. rovnic, tabulek, citací).

    Fluttershy, yay! | Komentářů: 1
    včera 12:00 | Nová verze

    Byla vydána (𝕏) nová verze 7.0 LTS open source monitorovacího systému Zabbix (Wikipedie). Přehled novinek v oznámení na webu, v poznámkách k vydání a v aktualizované dokumentaci.

    Ladislav Hagara | Komentářů: 0
    Rozcestník

    Řazení ve sloupcích a základy Ruby

    22.11.2017 01:47 | Přečteno: 1737× | Linux | poslední úprava: 22.11.2017 01:46

    Program načítá jednotlivé řádky z textového souboru, jehož název je na příkazové řádce jako argument, a poté je vypíše seřazené ve sloupcích, jako to dělá například příkaz ls. Pokud bychom měli na každém řádku klíčová slova z jazyku Golang, výpis by vypadal takto:
    break       defer       goto        range       var         
    case        else        if          return                  
    chan        fallthrough import      select                  
    const       for         interface   struct                  
    continue    func        map         switch                  
    default     go          package     type
    
    Zde již samotný program:
    TIOCGWINSZ = 0x5413
    
    
    def get_size
      buf = [0, 0, 0, 0].pack("S4") 
    
      if STDOUT.ioctl(TIOCGWINSZ, buf) >= 0
        row, col, x, y = buf.unpack("S4")  
      else
        row = 20
        col = 70
      end    
      [row, col]
    end
    
    
    words = []
    maxlen = 1
    
    row, col = get_size
    
    ARGF.each do |line|
      if line !~ /^\s+$/
        line.strip!
        if (s = line.size) > maxlen
          maxlen = s  
        end
        words << line
      end
    end
    
    words.sort!
    maxlen += 1					#mezera
    
    col = col / maxlen
    row = (words.size + col) / col
    fmt = "%%-%ds" % maxlen
    
    (col*row).times do |i|						
      target = (i % col) * row + (i / col)		#svisle razeni  
      str = sprintf(fmt, (target < words.size) ? 
    			words[target] : "")  
      print str
      puts if (i + 1) % col == 0 
    end
    
    Následuje několik poznámek.

    V Ruby proměnné definované mimo metody nejsou v metodách viditelné. K vytvoření globální proměnné se používá prefix $ ($global). Funkce pack a unpack převádějí hodnoty na proud bajtů, potažmo proud bajtů na jednotlivé hodnoty, stejné funkce nalezneme i v Perlu a Pythonu.
    a = [1,2,3,4,5,6,7,8,9,10]
    b = a.pack('i10')		# b je proud deseti 4 bajtových cisel
    c =  b.unpack('i*')
    c == b 				# vraci true
    
    Různé způsoby vytvoření pole
    a = [3, 2, 1]
    b = []         			# nové, prázdné pole
    empty = Array.new		# nové, prázdné pole
    nils = Array.new(3)             # nils je [nil, nil, nil]
    zeros = Array.new(4, 0)         # zeros je [0, 0, 0, 0]
    count = Array.new(3) {|i| i+1 } # count je [1, 2, 3] 
    
    [[1,2],[3,4],[5]]		# pole poli
    
    [1, 2, 3].length		# 3
    [].size				# 0, synonymum pro length
    
    Změna prvků v poli
    a = [1, 2, 3]
    a[0] = 0		# [0, 2, 3]
    a[-1] = 4		# [0, 2, 4]
    a[3] = 6		# [0, 2, 4, 6]
    a[5] = 8		# [0, 2, 4, 6, nil, 8]
    a << 10 		# [0, 2, 4, 6, nil, 8, 10]
    a << 12 << 14		# [0, 2, 4, 6, nil, 8, 10, 12, 14]
    a = [1, 2, 3]		# [1, 2, 3]
    a + a			# [1, 2, 3, 1, 2, 3]
    a.concat([4, 5])	# [1, 2, 3, 4, 5] a se meni, zadny vykricnik
    
    a = ['a', 'b', 'c']
    a.insert(1, 1, 2)	# a je ['a',1,2,'b','c']
    
    Odstranění prvku
    a = [1,2,3,4,5,6]
    a.delete_at(4)          # vraci 5, a je a = [1,2,3,4,6]
    a.delete_at(-1)         # vraci 6, a je [1,2,3,4]
    
    Odstranění podle hodnoty
    a.delete(4)		        # 4, a je [1,2,3]
    a[1] = 1		
    a.delete(1)		        # 1, a je [3]
    a = [1,2,3]
    a.delete_if {|x| x%2==1 }	# odstrani liche prvky, a je [2]
    a.reject! {|x| x%2==0 }		# jako delete_if, a je []
    
    Bloky

    Proměnné definované v bloku mají platnost pouze v tom bloku. Bloky mohou být ohraničené buď složenými závorkami, anebo klíčovými slovy do a end, do a end se zpravidla používá u víceřadkových bloků.
    5.times  {|i| print i }                    # tiskne "01234"  
    0.upto(5) {|i| print i }                   # tiskne "012345"
    
    a = [3, 2, 1]
    a.each {|elm| print elm }      	           # tiskne "321"
    b = a.map {|x| x*x }         	           # b je [9, 4, 1]
    c = a.select {|x| x%2==0 }    	           # c je [2], jen sude
    sum = a.inject {|s,x| s+x }                # sum je 6, soucet prvku
    a.each_with_index{|e,i| print e,i}         # tiskne 302112
    
    (5..7).each_with_index {|x,i| print x,i }  # tiskne "506172"
    
    Iterace řetězce
    s = "¥1000"
    s.each_char {|x| print "#{x} " } 	# tiskne "¥ 1 0 0 0"
    
    "hello".each_byte.to_a			# vraci [104, 101, 108, 108, 111]
    
    s = "A\nB"
    s.each_line {|l| print l.chomp}		# tiskne "AB"
    
    Blok v bloku
    1.upto(10) do |i|
      1.upto(10) do |i|
        print "#{i} "
      end
      print " ==> Row #{i}\n"
    end
    
    1 2 3 4 5 6 7 8 9 10  ==> Row 1
    1 2 3 4 5 6 7 8 9 10  ==> Row 2
    1 2 3 4 5 6 7 8 9 10  ==> Row 3
    1 2 3 4 5 6 7 8 9 10  ==> Row 4
    1 2 3 4 5 6 7 8 9 10  ==> Row 5
    1 2 3 4 5 6 7 8 9 10  ==> Row 6
    1 2 3 4 5 6 7 8 9 10  ==> Row 7
    1 2 3 4 5 6 7 8 9 10  ==> Row 8
    1 2 3 4 5 6 7 8 9 10  ==> Row 9
    1 2 3 4 5 6 7 8 9 10  ==> Row 10
    
    Ve starší verzi Ruby 1.8 by byl vnější index překryt a číslo řádku by zůstávalo na deseti. Kvůli lepší kompatibilitě existuje v Ruby 1.9 přepínač -w, který varuje, pokud má parametr bloku stejný název jako již existující proměnná.
    #!/usr/bin/ruby -w
    
    Soubory
    File.open(filename) do |f|	     # otevre soubor
      f.each {|line| print line }	     # tiskne vsechny radky
    end				     # zavre soubor
    
    File.open(filename) do |f|
      f.each_with_index do |line,number|
        print "#{number}: #{line}"
      end
    end
    
    V Ruby samozřejmě existují i běžné cykly jako while, until nebo for/in.
    while line = gets.chomp do      # do lze vynechat, pokud nasleduje \n 
      case line
      when /^\s*#/			# komentar
        next
      when /^quit$/i
        break
      else
        puts line.reverse
      end
    end
    
    Řetězce jsou v Ruby změnitelné (mutable).
    "Ruby" + " rocks!" 		# "Ruby rocks!"
    "Ruby! " * 3			# "Ruby! Ruby! Ruby! "
    "%d %s" % [3, "rubies"]		# "3 Rubies"
    
    greeting = "Hello"
    greeting << " " << "World"
    puts greeting   		# tiskne "Hello World"
    
    
    s = "hello"
    s.length			# vraci 5, pocet znaku v 1.9, bajtu v 1.8
    s.size				# synonymum pro length
    s.concat(" world")              # synonymum pro <<
    				# meni se s a vraci nove s
    s.empty?			# vraci false
    
    s = "hello\n"			
    s.chomp!			# vraci "hello", odstranen \n, meni se s 
    s.chomp				# vraci "hello", nic se neodstranuje
    s.chomp!			# vraci nil, nic se neodstranuje
    s.chomp!("o")			# vraci "hell", meni se s
    
    s = "hello\n"
    s.chop!				# vraci "hello", odstranen \n, meni se s 				
    s.chop				# vraci "hell", s se nemeni
    
    s = "\t hello \n"
    s.strip				# vraci "hello"
    s.lstrip			# vraci "hello \n"
    s.rstrip			# vraci "\t hello"
    
    Metody strip, lstrip a rstrip mají i verze s vykřičníky, takže mění objekty volající tyto metody.

    Metoda puts tiskne řetězec a na rozdíl od print jej ukončí \n, lze ji použit i bez argumentů, jen k odřádkování.

    K rychlému otestování kódu můžete použít interaktivní interpreter irb.

    Až budu umět Ruby lépe, tak sem dám třeba něco o objektech, asociativních polích a dalších operacích s řetězci a poli, protože tohle bylo jen několik výpisků z knihy The Ruby Programming Language.

    Zdroj: The Ruby Programming Language a Perl Cookbook.        

    Hodnocení: 80 %

            špatnédobré        

    Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

    Komentáře

    Vložit další komentář

    22.11.2017 11:08 ttt
    Rozbalit Rozbalit vše Re: Řazení ve sloupcích a základy Ruby
    Ještě ti chybí trochu lenosti :) Pomalé to bude tak jako tak, tak proč si např. nespočítat délku dalším cyklem, je to kratší a přehlednější.

    Práce se soubory jde zkrátit na:
    File.open(filename).each do |line|
      print line
    end

    Zápis blocku jde zkrátit pomocí '&':
    [1,2,3].inject(&:+) # 6

    S použitím pár dalších knihovních metod:
    TIOCGWINSZ = 0x5413
    
    def terminal_size
      buf = [0, 0, 0, 0].pack('S4')
    
      if STDOUT.ioctl(TIOCGWINSZ, buf) >= 0
        buf.unpack('S4')[0..2]
      else
        [20, 70]
      end
    end
    
    words = ARGF.readlines.map(&:strip).sort
    width = words.map(&:length).max + 1
    
    col = terminal_size[1] / width
    row = words.size / col + 1
    padding = row - words.size % row
    words.fill('', words.size, padding)
    
    puts words.each_slice(row).to_a.transpose
      .map { |ws| ws.map { |w| w.ljust(width) }.join }
      .join("\n")
    
    22.11.2017 12:29 sad
    Rozbalit Rozbalit vše Re: Řazení ve sloupcích a základy Ruby
    Pěkné. Díky za tipy.
    22.11.2017 12:56 RM
    Rozbalit Rozbalit vše Re: Řazení ve sloupcích a základy Ruby
    pěknej příklad :)
    23.11.2017 18:47 ehm
    Rozbalit Rozbalit vše Re: Řazení ve sloupcích a základy Ruby
    Máš ten kód celý na ruby.
    xsubway avatar 23.11.2017 20:06 xsubway | skóre: 13 | blog: litera_scripta_manet
    Rozbalit Rozbalit vše Re: Řazení ve sloupcích a základy Ruby
    alespoň to není na JavaScript .-)
    4.12.2017 06:48 s.b.
    Rozbalit Rozbalit vše Re: Řazení ve sloupcích a základy Ruby
    A tohle nedostane tučňáka?

    Založit nové vláknoNahoru

    ISSN 1214-1267   www.czech-server.cz
    © 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.