அல்கோரிதம் – அடுக்குகளை தலைகீழ் படுத்துவது எப்படி ?

Move 1,2,3 disks from peg #1 to peg #2, with peg #3 as intermediate. Move disk 4 from peg #1 to peg #4. Then move all disks from peg #2 to peg #3 using peg #1 as intermediate.

இந்த வாரம் அமெரிக்காவில் “long weekend” அதாவது மூன்று-நாள் வார விடுமுறை – காரணம் மே மதம் நான்காம் திங்கள் “Memorial day” என்கிற “அமெரிக்க போர்வீரர் நினைவு தினம்”. இதனை ஒட்டி சராசரி குடும்பங்கள் நாடெங்கும் உல்லாச பயணம், சுற்றுலா என்று செல்வது அமெரிக்க பண்பாடு. இந்த ஆண்டு எங்கள் வீட்டில் விருந்தினரை வரவேற்கிறோம் – பயணம் என்பது இந்த ஆண்டு எங்கள் விருந்திரனுக்கு மட்டுமே! சரி அப்போது ஒரு புதிய தரவமைப்பு பற்றி ஒரு blog post போடுவோம் என்று எழுத ஆரம்பித்தது இங்கே.

அடுக்கு (Stack) என்பது ஒரு மிக அடிப்படை கணினி நிரலாக்க கோட்பாடு. ஒரு அடுக்கு தரவமைப்பில் செய்யக்கூடிய நடவடிக்கைகள் ஆனது : மேல் நுழை (push), மேல் நீக்கு (pop) என்பது.

ஒரு அடுக்கை இப்படி (கீழ் கண்டபடி) உருவாக்கலாம்:

எ = அடுக்கு()
மேல்_நுழை( எ, "அ" )
மேல்_நுழை( எ, "ஆ" )

இது கணினியில் ஒரு அடுக்கு போலவே உருவெடுக்கும்,

    
   --> [ ஆ ]
       [ அ ]
      --------
அடுக்கு "எ" என்பதில் இரண்டு உருப்படிகள் உள்ளது; 
இதில் "மேல்" உருப்படி "ஆ" என்ற மதிப்பாகும்.

மேலும் இந்த அடுக்கில் மற்ற உயிரெழுத்துக்களை முழுதாக சேர்க்கலாம்:

மேல்_நுழை( எ, "இ" )
மேல்_நுழை( எ, "ஈ" )
மேல்_நுழை( எ, "உ")
மேல்_நுழை( எ, "ஊ")
மேல்_நுழை( எ, "எ")
மேல்_நுழை( எ, "ஏ")
மேல்_நுழை( எ, "ஐ")
மேல்_நுழை( எ, "ஒ")
மேல்_நுழை( எ, "ஓ")
மேல்_நுழை( எ, "ஔ")

கணினியில் இதன் தோற்றம் இப்படி இருக்கும்,

   --> [ ஔ ]
       [ ஓ ]
       [ ஒ ]
       [ ஐ ]
       [ ஏ ]
       [ எ ]
       [ ஊ ]
       [ உ ]
       [ ஈ ]
       [ இ ]
       [ ஆ ]
       [ அ ]
அடுக்கு "எ" என்பதில் பன்னிரண்டு உருப்படிகள் உள்ளது; 
இதில் "மேல்" உருப்படி "ஔ" என்ற மதிப்பாகும்.

நம்ம இங்கே ஆயுத எழுத்து “ஃ” என்பதை சேர்க்கவில்லை; உங்களுக்கு வேண்டுமானால் நீங்கள் சேர்த்து கொள்ளலாம்.

அடுக்கின் வரிசை மாற்றுவது எப்படி ?

இப்போது அடுக்கு “எ” இதன் வரிசை மாற்றுவது எப்படி ? ஒரு குவிப்பில் இருந்து “மேல் எடு” என்று செய்தால் என்ன விளைவு என்று முதல் படியாக பார்க்கலாம் – இதன் விளைவு மேல் உள்ள உருப்படியை அழிக்கும்.

மேல்_எடு( எ )
# தற்போது குவிப்பு 'எ' வில் 11 உருப்படிகள் மட்டும் இருக்கும்.
# ஏற்கெனவே உள்ள மேல் உருப்படி 'ஓ' அழிக்கப்பட்டது.
# புதிய மேல் உருப்படி 'ஓ' என்று ஆனது.

இப்போது இந்த அடுக்கின் நிலை,

 -->   [ ஓ ]
       [ ஒ ]
       [ ஐ ]
       [ ஏ ]
       [ எ ]
       [ ஊ ]
       [ உ ]
       [ ஈ ]
       [ இ ]
       [ ஆ ]
       [ அ ]
அடுக்கு : எ 

இப்போது அழித்த மேல் உருப்படியை புதிய அடுக்கு ‘ஏ’ வில் மேல் நுழைத்தால் – அதையே ‘எ’ என்ற அடுக்கில் உருப்படிகள் உள்ளவரை அதில் மேல் எடுத்து, ‘ஏ’ வில் மேல் நுழைத்துக்கொண்டே இருந்தால் என்ன ஆகும் ?
இதனை நிரல் படுத்தி பார்க்கலாம்.

ஏ  = அடுக்கு()
மேல்_நுழை( ஏ, "ஔ")
@( நீளம்( எ ) > 0 ) வரை 
    மதிப்பு = மேல்_எடு( எ )
    மேல்_நுழை( ஏ, மதிப்பு )    
முடி

தற்போது அடுக்கு ‘எ’-வின் நிலை காலியானது:

 -->[ ]
அடுக்கு : எ 

ஆனால் அடுக்கு ‘ஏ’-வின் நிலையோ – வரிசை மாற்றப்பட்டது!

-->[ அ ]
   [ ஆ ]
   [ இ ]
   [ ஈ ]
   [ உ ]
   [ ஊ ]
   [ எ ]
   [ ஏ ]
   [ ஐ ]
   [ ஒ ]
   [ ஓ ]
   [ ஔ ]
அடுக்கு : ஏ 

இந்த நிரல் துண்டு Python மொழியில் இப்படி எழுதலாம்,

# (C) 2017 Ezhil Language Foundation
# This code is shared under public domain
# Ref: https://ezhillang.wordpress.com
import tamil
import pprint

class Stack:
    def __init__(self):
        self.store = list()

    def top(self):
        return self.store(-1)

    def __len__(self):
        return self.store.__len__()

    def push(self,val):
        self.store.insert(-1,val)

    def pop(self):
        val = self.store.pop()
        return val

    def display(self):
        pprint.pprint(list(zip(range(self.__len__()-1,0,-1),self.store)))
        
a = Stack()
for letter in tamil.utf8.uyir_letters:
    a.push(letter)
a.display()

rev_a = Stack()

while len(a) > 0:
    val = a.pop()
    rev_a.push(val)

print("Original stack => ")
a.display()
print("Reversed stack => ")
rev_a.display()

இதன் வெளியீடோ கீழே உள்ளபடி:

[(11, 'ஆ'),
 (10, 'இ'),
 (9, 'ஈ'),
 (8, 'உ'),
 (7, 'ஊ'),
 (6, 'எ'),
 (5, 'ஏ'),
 (4, 'ஐ'),
 (3, 'ஒ'),
 (2, 'ஓ'),
 (1, 'ஔ')]
Original stack => 
[]
Reversed stack => 
[(11, 'ஔ'),
 (10, 'ஓ'),
 (9, 'ஒ'),
 (8, 'ஐ'),
 (7, 'ஏ'),
 (6, 'எ'),
 (5, 'ஊ'),
 (4, 'உ'),
 (3, 'ஈ'),
 (2, 'இ'),
 (1, 'ஆ')]

தமிழ் 99 விசை பலகை இடைமுகம் – Tamil99 keyboard interface for Ezhil

கணினியை பார்க்காத சிறுவன் எப்படி உள்ளீடு செய்வான் ? தமிழில் எழில் மொழி ஆர்வலர்கள் பாதிக்குமேல் நிரல் உள்ளீடு செய்வதற்கு தனி தமிழ் விசைப்பலகை இல்லை. இந்த பிரச்சினைகளை தீர்வு செய்ய ஏற்கனவே சில மூன்று பட்டை உள்ளீடு பட்டன்-களை கண்டோம். தற்போது முழு விசை பலகை (keyboard) இடைமுகம் ஒன்றை உருவாக்கி மேம்படுத்தி வருகிறேன்.

ezhil_March20_2017
படம் 1: Tamil 99 keyboard interface for Ezhil editor; தமிழ் 99 விசைப்பலகை இடைமுகம் எழுதியில். 

உங்களுக்கு எதுவும் கருத்துள்ள பின்னூட்டங்கள் இருந்தால் தெரிவிக்கவும்.

நன்றி.

 

வாய்ப்பாடு -multiplication is not scary

வாய்ப்பாடு

கணிதம் என்பதை அறுவை, போர் ஆக்குவது என்பது சிறுவர்களுக்கு உடனடியாக விளங்காத சூத்திரங்களையும், வாய்ப்பாடு பட்டியல்களையும் நினைவில் கொள்ள செய்வது. பத்தாத குறையாக கேள்வி எழுப்பும் குழந்தைகளையும் அடி கொடுப்பது – இதுவே நமது இன்றைய பள்ளி நிலை. இதன் விளைவு என்ன ? கணக்கு வாத்தி என்பவரை கண்டாலே ஓடும் பயம் மட்டுமே பெரும்பாலானோர் மனதில் கொள்கின்றனர்.

மாறாக, வாய்ப்பாடு என்பது என்ன ?

இரு எண்களை பெருக்க வேண்டுமானால் முதலில் அவற்றின் வாய்ப்பாடு நினைவில் இருந்தால் எளிதாக கணிதம் செய்யலாம்.

பெருக்கல் கணித செயல்பாட்டின் இயல்புகளை கொண்டு சில விடைகளை எளிதாக கணக்கிட முடியும்.

1) உதாரணமாக, பெருக்கல் என்பதின் விடை பெருக்கல் என்றும் அமையும். இதனை ஒரு சமன்பாடு என்றும் எழுதலாம்,

                             அ x ஆ = ஆ x அ

இதனால் நீங்கள் 1 முதல் 15 வாய்ப்பாடு 12 எண்கள் வரை மனப்பாடம் செய்யும் வகை எவரும் கேட்டல் 1 முதல் 12 வாய்ப்படை 15 எண்கள் வரை மட்டுமே நினைவில் கொள்ள வேண்டும்!

2) மேலும், இரண்டில் ஏதேனும் ஒரு எண் 10, 100, 1000 என 10-இன் மூலம் ஆகா இருந்தால் அதன் விடை சுலபமாக மற்ற எண் பின் பூஜியுங்களை சேர்த்தது போல் அமையும்.

                                                123 x 100 = 12,300

3) பெருக்கல் என்ற கணக்கின் விடை என்பதை கூட்டினால் ( modulo 9 ) இந்த பெருக்கலில் உள்ள இரு எண்களையும் modulo 9 கூட்டி மீண்டும் பெருக்கி மீண்டும் modulo 9 செய்த எண் என்பதற்கு சமம். இது ஒரு (necessary but not sufficient) தேவையான ஆனால் தீர்மானிக்கபடாத  தேவை.

                                               123 x 45 = 5535

    இதனை எண்ணிம இலக்கு மூலம் கூடினால்  (digital sum)

                                                6 x 9   = 18, (இடது பக்கத்தில் 123 எண்  1 + 2 + 3 = 6, எனவும், 4 + 5 = 9 எனவும் மாறும்.)

                                                    5 4      = 9  ( வலது புரம் 1 + 8 = 9, இடது புரம் 6 x 9 = 54 எனவும் உள்ளது)

                                                      9       = 9

மேலும் பெருக்கல் என்பதற்கு நிறைய தன்மைகள் உண்டு. இவற்றை கற்று கொண்டால் நீங்கள், அல்லது உங்கள் மாணவர்கள், குழந்தைகள், இந்த வாய்ப்பாடு என்பதை கண்டு பயந்து ஓட வேண்டாம். கணிதம் என்பதை நண்பர் ஆகா ஆக்கி கொள்ளுங்கள்.

எழில் உதாரணங்கள் தேவை

கீழ்கண்ட எழில் உதாரணங்கள் (எ.கா) ஏதேனும், எதனையும் உங்களால் பங்களிக்க முடியுமா?

உங்களால் முடிந்தவரை Github தளத்தில் pull -request அனுப்பவும். இல்லாத பட்சத்தில் நேரடியாக ezhillang என்ற ஜிமெயில் அஞ்சலுக்கு உங்கள் படைப்புக்களை அனுப்புக.

  1. நாள் தேதி எ.கா  – பிறந்த நாளை உள்கொண்டு
    1. வயதை இந்நாள் வரை கணக்கிடும்
    2. ஒரு கழுதை வயசு 8 ஆண்டுகள் எனில் வயசு என்ன?
    3. எத்தினை நாட்கள் வசித்து வந்தனர்? லீப் ஆண்டுகள் கவணம்
  2. முனை-ஓரம் (கிராப்) வரைபடம் வடிவமைத்து கீழே உள்ள வினாவிற்கு விடையளிக்க – தமிழ் திரையுலக கலாச்சாரம் சார்ந்த எ.கா. ஏதேனும் ஒரு நடிகர்/கை:
    1. ஒரு குறிப்பிட்ட படத்தில் உள்ளனரா ?
    2. இவர் மற்றவர் ஒருவருடன் எத்தனை படங்களில் இடம் பெற்றார் ?
  3. எழில் அடுக்கு செயல்கூறுளுக்கு எ.கா நிரல் எழுதுக – கீழே உள்ள வினாவிற்கு விடை எழில் வழி அளிக்க
    1. பெருக்கல்
    2. கூட்டல்
    3. கழித்தல்
    4. அடுக்கு பெருக்கு
  4. தொலைபேசி விலாசம் புத்தகத்தை எழில் எ.கா. வடிவமைக்க       1.  தொடர்புகளை சேர்,                                                                                      2. தொடர்புகளை நீக்கு,
    3. தொடர்புகளை தேடு

நன்றி

-முத்து

 

 

கூடம் – எழில் கற்க இணையம் வழி பள்ளிக்கூடம்

கூடம் – எழில் கற்க இணையம் வழி பள்ளிக்கூடம்

இன்று நள்ளிரவு எழுதிய பைத்தான் நிரலிநால் (இந்த கிட்ஹப் கமிட்டை காணவும்) எழில் மொழியை இணையம் வழி கற்க பள்ளிக்கூடம் ஆக அமைய வாய்பு உண்டு.  இதனுடைய அமைப்பு பல விஷயங்கள் கொண்டது. கீழே காண்க.

Feature list
Code in this directory provides the following
* Writing Code, Editing, and Evaluating *
1. Syntax highlighting editor for Ezhil using ACE JavaScript editor
2. Code browser lets user to look at sample Ezhil programs from the ezhil-lang source/testsuite, in the single page app editor
3. Users can run the code on this page, and see the output in the same page.
4. Correctly executed code with should output in light yellow; clicking on the output will hide it, as you work on second problem.
5. Errors in code or server execution cause your program output  to be highlighted in red.
6. Source code is persisted between sessions in terms of cookies

Adios

இதை http://www.ezhillang.org இல் வேகுவில் நிறுவு முனைகிரேன். அதுவரை ஹஸ்தா-ல-விஸ்தா!

தொடக்க அளவு பைத்தன் (Beginning Python)

தொடக்க அளவு பைத்தன் கற்பதற்கு, Swaroop எழுதிய “Byte of Python” என்ற மின் புத்தகம் மிக அறுமையானது. இதை இங்கிருந்து தரவிரக்கலாம்.

இந்த புத்தகம் பல மொழிகளில் மொழிபெயர்க்கப்பட்டாலும் இன்னும் தமிழில் வரவில்லை. இதற்கு தன்னார்வலர்கள்  இங்கிருந்து பங்களிக்கலாம்.

Clojure-Thamil and privilege of programming in English

Clojure-Thamil
Elango Cheran, a developer in Silicon Valley, CA, USA, has been quitely developing a powerful macro-based framework of Tamil programming capabilities on top of Clojure. He has also added various tools on this platform, even tools with teeth – i.e. converting encoding from various Tamil encoding standards, and implementing santhi rules etc.

I found his blog post on his efforts in programming in Tamil to be highly persuasive, and make a strong case of programming literacy in the vernacular. I concur with some of the views expressed on ability to reach a literate audience in their vernacular without having to be pigeonholed in English language.

A few observations on the capabilities of unicode identifier aware languages like JavaScript, CLISP, and then languages with rich Unicode support like Java and Python. My own steps in exploring such translation-based support for Tamil have included TamilScript; Ezhil effort is fullblown, in comparison, in effort and time invested there.

Lisp has affordance of also being grammatically similar to Tamil than English in structure – i..e. predicate expression based structures. CLISP, and JavaScript also offer non-ASCII identifiers and can achieve somewhat of same effect like macro’s you have pointed out.

The socio-cultural need to open up world of programming to vernacular speakers has continued to haunt technology penetration/access. The field of native language programs has few leading lights. We need more players, and time to build developer interest here.

-Muthu