<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Vishnuprasad Ranganatha</title>
    <description>The latest articles on DEV Community by Vishnuprasad Ranganatha (@vishnuprasad_rvp).</description>
    <link>https://dev.to/vishnuprasad_rvp</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3835040%2F51aaa5ba-1ee6-4f89-b86c-e4669c7f9b6e.png</url>
      <title>DEV Community: Vishnuprasad Ranganatha</title>
      <link>https://dev.to/vishnuprasad_rvp</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/vishnuprasad_rvp"/>
    <language>en</language>
    <item>
      <title>An intersting coding challenge</title>
      <dc:creator>Vishnuprasad Ranganatha</dc:creator>
      <pubDate>Fri, 10 Apr 2026 09:49:25 +0000</pubDate>
      <link>https://dev.to/vishnuprasad_rvp/an-intersting-coding-challenge-5h3p</link>
      <guid>https://dev.to/vishnuprasad_rvp/an-intersting-coding-challenge-5h3p</guid>
      <description>&lt;h2&gt;
  
  
  Given an array of sequential integers, with multiples of 3 and 5 replaced, determine if it's a valid FizzBuzz sequence.
&lt;/h2&gt;

&lt;h3&gt;
  
  
  In a valid FizzBuzz sequence:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Multiples of 3 are replaced with "Fizz".&lt;/li&gt;
&lt;li&gt;Multiples of 5 are replaced with "Buzz".&lt;/li&gt;
&lt;li&gt;Multiples of both 3 and 5 are replaced with "FizzBuzz".&lt;/li&gt;
&lt;li&gt;All other numbers remain as integers.&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;is_fizz_buzz(["FizzBuzz", 16, 17, "Fizz", 19, "Buzz"]) should return &lt;strong&gt;True&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;is_fizz_buzz(["Fizz", "Buzz", 101, "Fizz", 103, 104, "FizzBuzz"]) should return &lt;strong&gt;True&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;is_fizz_buzz([1, 2, "Fizz", "Buzz", 5]) should return &lt;strong&gt;False&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Solution:
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;find the original array or range of numbers;&lt;/li&gt;
&lt;li&gt;check the fizzbuzz condition of the number in original array, and check the fizzbuzz value in input array is same. if both different, return &lt;strong&gt;False&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;if all are same, return &lt;strong&gt;True&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;This problem is a bit different because it is not just asking for solving fizz buzz, instead, it is asking to validate the sequence. this will add some additional complexity. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Below is the solution code:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;is_fizz_buzz&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;anum&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;anum_index&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;enumerate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;isinstance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="n"&gt;anum&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="n"&gt;anum_index&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;original_range&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;))];&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;item1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;item2&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;zip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;original_range&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;item1&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;item1&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;item2&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;FizzBuzz&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;
        &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;item1&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;item2&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Buzz&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;
        &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;item1&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;item2&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Fizz&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>algorithms</category>
      <category>beginners</category>
      <category>coding</category>
      <category>interview</category>
    </item>
    <item>
      <title>OOP’s Missing Link: Why "Abstraction" is About Enforcement, Not Just Hiding</title>
      <dc:creator>Vishnuprasad Ranganatha</dc:creator>
      <pubDate>Fri, 20 Mar 2026 09:21:56 +0000</pubDate>
      <link>https://dev.to/vishnuprasad_rvp/oops-missing-link-why-abstraction-is-about-enforcement-not-just-hiding-1df7</link>
      <guid>https://dev.to/vishnuprasad_rvp/oops-missing-link-why-abstraction-is-about-enforcement-not-just-hiding-1df7</guid>
      <description>&lt;p&gt;Most textbooks tell you that &lt;strong&gt;Abstraction&lt;/strong&gt; is about "hiding complexity." But let’s be honest: a simple function hides complexity. So why do we need Abstract Base Classes (ABCs)?&lt;/p&gt;

&lt;p&gt;If we look at Object-Oriented Programming from a developer’s perspective, the definition changes. Abstraction isn't just a "black box"—it's a &lt;strong&gt;Contractual Blueprint&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;The Four Pillars, Redefined&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;To understand Abstraction, we have to see where it fits among its peers:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Encapsulation: (The Gatekeeper).&lt;/strong&gt; It prevents accidental access to internal data.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Inheritance: (The Recycler).&lt;/strong&gt; It lets us reuse parent code in child classes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Abstraction: (The Standardizer).&lt;/strong&gt; It is a mandatory guide that forces subclasses to implement specific methods.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Polymorphism: (The Result).&lt;/strong&gt; Because Abstraction enforces a standard, we can use different objects interchangeably without our code breaking.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the "Hiding" Definition Fails
&lt;/h2&gt;

&lt;p&gt;"Hiding" can be achieved by a simple function definition; you don't want to know how it works, you just want the result.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Abstraction&lt;/strong&gt; is different. It is a &lt;strong&gt;guide&lt;/strong&gt; for the developer to implement methods of any classes that inherit this guide. Even if hiding some logic is a result of the process, the primary goal is &lt;strong&gt;Standardized Enforcement&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The "Real-World" Python Example
&lt;/h2&gt;

&lt;p&gt;Imagine you are building a "Save" button for an app. You might have a &lt;strong&gt;CloudSaver&lt;/strong&gt; and a &lt;strong&gt;HardDriveSaver&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Without a guide, one developer might name their method &lt;strong&gt;upload()&lt;/strong&gt; and another might use &lt;strong&gt;write_to_disk()&lt;/strong&gt;. Your &lt;strong&gt;"Save"&lt;/strong&gt; button will crash because it doesn't know which name to call.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;abc&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ABC&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;abstractmethod&lt;/span&gt;

&lt;span class="c1"&gt;# 1. THE ABSTRACTION (The Blueprint/Guide)
&lt;/span&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;FileSaver&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ABC&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nd"&gt;@abstractmethod&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;save&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Every child MUST implement this name exactly.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
        &lt;span class="k"&gt;pass&lt;/span&gt;

&lt;span class="c1"&gt;# 2. THE IMPLEMENTATION (The Complex Logic)
&lt;/span&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CloudSaver&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;FileSaver&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;save&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="c1"&gt;# 100 lines of complex API logic hidden here
&lt;/span&gt;        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Cloud: Uploading &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt; to server...&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;HardDriveSaver&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;FileSaver&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;save&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="c1"&gt;# 50 lines of disk-writing logic hidden here
&lt;/span&gt;        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Local: Saving &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt; to C:/ drive...&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# 3. THE POLYMORPHISM (The Result)
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;click_save_button&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;saver_object&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;user_data&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="c1"&gt;# This function is 'shielded' from complexity.
&lt;/span&gt;    &lt;span class="c1"&gt;# It only knows 'save' exists because of the ABC.
&lt;/span&gt;    &lt;span class="n"&gt;saver_object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;save&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user_data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; 

&lt;span class="c1"&gt;# Usage
&lt;/span&gt;&lt;span class="nf"&gt;click_save_button&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;CloudSaver&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;My Document&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The Takeaway
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Abstraction&lt;/strong&gt; is the &lt;strong&gt;Standardization&lt;/strong&gt; of logic. It’s the "Government Standard" for the wall outlet that ensures every plug—no matter how complex the appliance—will fit and work. It moves us from "I hope this class has the right method" to &lt;strong&gt;"The computer guarantees this class has the right method."&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>oop</category>
      <category>programming</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
