A couple of years ago, my friend wanted to learn programming, so I was giving her a hand with resources and reviewing her code. She got to the part on adding code comments, and wrote the now-infamous line,

i = i + 1 #this increments i

We’ve all written superflouous comments, especially as beginners. And it’s not even really funny, but for whatever reason, somehow we both remember this specific line years later and laugh at it together.

Years later (this week), to poke fun, I started writing sillier and sillier ways to increment i:

Beginner level:

# this increments i:
x = i 
x = x + int(True)
i = x

Beginner++ level:

# this increments i:
def increment(val):
   for i in range(val):
      output = i
   output = i + 1 
   return output

Intermediate level:

# this increments i:
class NumIncrementor:
	def __init__(self, initial_num):
		self.internal_num = initial_num

	def increment_number(self):
		incremented_number = 0
		# we add 1 each iteration for indexing reasons
		for i in list(range(self.internal_num)) + [len(range(self.internal_num))]: 
			incremented_number = i + 1 # fix obo error by incrementing i. I won't use recursion, I won't use recursion, I won't use recursion

		self.internal_num = incremented_number

	def get_incremented_number(self):
		return self.internal_num

i = input("Enter a number:")

incrementor = NumIncrementor(i)
incrementor.increment_number()
i = incrementor.get_incremented_number()

print(i)

Since I’m obviously very bored, I thought I’d hear your take on the “best” way to increment an int in your language of choice - I don’t think my code is quite expert-level enough. Consider it a sort of advent of code challenge? Any code which does not contain the comment “this increments i:” will produce a compile error and fail to run.

No AI code pls. That’s no fun.

    • palordrolap@fedia.io
      link
      fedilink
      arrow-up
      5
      ·
      3 days ago

      This is actually the correct way to do it in JavaScript, especially if the right hand side is more than 1.

      If JavaScript thinks i contains a string, and let’s say its value is 27, i += 1 will result in i containing 271.

      Subtraction doesn’t have any weird string-versus-number semantics and neither does unary minus, so i -=- 1 guarantees 28 in this case.

      For the increment case, ++ works properly whether JavaScript thinks i is a string or not, but since the joke is to avoid it, here we are.

  • dont_lemmee_down@lemm.ee
    link
    fedilink
    arrow-up
    26
    ·
    4 days ago

    Create a python file that only contains this function

    def increase_by_one(i):
        # this increments i
        f=open(__file__).read()
        st=f[28:-92][0]
        return i+f.count(st)
    

    Then you can import this function and it will raise an index error if the comment is not there, coming close to the most literal way

    Any code which does not contain the comment “this increments i:” will produce a compile error and fail to run.

    could be interpreted in python

  • Azzu@lemm.ee
    link
    fedilink
    arrow-up
    25
    ·
    edit-2
    4 days ago
    int toIncrement = ...;
    int result;
    do {
      result = randomInt();
    } while (result != (toIncrement + 1));
    print(result);
    
    • Ace@feddit.ukOP
      link
      fedilink
      arrow-up
      11
      ·
      edit-2
      4 days ago

      haha, bogoincrement! I hadn’t thought of that, nice :D

      (shame it fails to compile though)

  • notabot@lemm.ee
    link
    fedilink
    arrow-up
    10
    ·
    3 days ago

    Trying to avoid using any arithmetic operators, and sticking just to binary (extending beyond 16 bit unsigned ints is left as an exercise for the interested reader):

    #!/usr/bin/perl
    
    # This increments $i
    
    my $i=1;
    print "Start: $i ";
    
    if (($i & 0b1111111111111111) == 0b1111111111111111) {die "Overflow";}
    if (($i & 0b0000000000000001) == 0b0000000000000000) {$i=(($i & 0b1111111111111110) | 0b0000000000000001);}
    else
    {
            if (($i & 0b0111111111111111) == 0b0111111111111111) {$i=(($i & 0b0000000000000000) | 0b1000000000000000);}
            if (($i & 0b0011111111111111) == 0b0011111111111111) {$i=(($i & 0b1000000000000000) | 0b0100000000000000);}
            if (($i & 0b0001111111111111) == 0b0001111111111111) {$i=(($i & 0b1100000000000000) | 0b0010000000000000);}
            if (($i & 0b0000111111111111) == 0b0000111111111111) {$i=(($i & 0b1110000000000000) | 0b0001000000000000);}
            if (($i & 0b0000011111111111) == 0b0000011111111111) {$i=(($i & 0b1111000000000000) | 0b0000100000000000);}
            if (($i & 0b0000001111111111) == 0b0000001111111111) {$i=(($i & 0b1111100000000000) | 0b0000010000000000);}
            if (($i & 0b0000000111111111) == 0b0000000111111111) {$i=(($i & 0b1111110000000000) | 0b0000001000000000);}
            if (($i & 0b0000000011111111) == 0b0000000011111111) {$i=(($i & 0b1111111000000000) | 0b0000000100000000);}
            if (($i & 0b0000000001111111) == 0b0000000001111111) {$i=(($i & 0b1111111100000000) | 0b0000000010000000);}
            if (($i & 0b0000000000111111) == 0b0000000000111111) {$i=(($i & 0b1111111110000000) | 0b0000000001000000);}
            if (($i & 0b0000000000011111) == 0b0000000000011111) {$i=(($i & 0b1111111111000000) | 0b0000000000100000);}
            if (($i & 0b0000000000001111) == 0b0000000000001111) {$i=(($i & 0b1111111111100000) | 0b0000000000010000);}
            if (($i & 0b0000000000000111) == 0b0000000000000111) {$i=(($i & 0b1111111111110000) | 0b0000000000001000);}
            if (($i & 0b0000000000000011) == 0b0000000000000011) {$i=(($i & 0b1111111111111000) | 0b0000000000000100);}
            if (($i & 0b0000000000000001) == 0b0000000000000001) {$i=(($i & 0b1111111111111100) | 0b0000000000000010);}
    }
    print "End: $i\n";
    
    • 18107@aussie.zone
      link
      fedilink
      arrow-up
      3
      ·
      edit-2
      3 days ago

      I decided to use NAND instead of NOR, but it’s effectively the same thing.

      Scala:

      //main
      @main
      def main(): Unit =
        var i = 15 //Choose any number here
        i = add(i, 1) //this increments i
        println(i)
      
      //Adds 2 numbers in the most intuitive way
      def add(a: Int, b: Int): Int =
        val pairs = split(a).zip(split(b))
        val sumCarry = pairs.scanLeft(false, false)((last, current) => fullAdder(current._1, current._2, last._2))
        return join(sumCarry.map(_._1).tail.reverse)
      
      //Converts an integer to a list of booleans
      def join(list: Seq[Boolean]): Int = Integer.parseInt(list.map(if (_) '1' else '0').mkString, 2)
      
      //Converts a list of booleans to an integer
      def split(num: Int): Seq[Boolean] = num.toBinaryString.reverse.padTo(32, '0').map(_ == '1')
      
      //Adds 2 booleans and a carry in, returns a sum and carry out
      def fullAdder (a: Boolean, b: Boolean, c: Boolean): (Boolean, Boolean) =
        (NAND(NAND(NAND(NAND(a, NAND(a, b)), NAND(NAND(a, b), b)), NAND(NAND(NAND(a, NAND(a, b)), NAND(NAND(a, b), b)), c)), NAND(NAND(NAND(NAND(a, NAND(a, b)), NAND(NAND(a, b), b)), c), c)), NAND(NAND(NAND(NAND(a, NAND(a, b)), NAND(NAND(a, b), b)), c), NAND(a, b)))
      
      //The basis for all operations
      def NAND(a: Boolean, b: Boolean): Boolean = !a || !b
      

      try it online here

  • FuckBigTech347@lemmygrad.ml
    link
    fedilink
    arrow-up
    10
    ·
    edit-2
    4 days ago

    Your CPU has big registers, so why not use them!

    #include <x86intrin.h>
    #include <stdio.h>
    
    static int increment_one(int input)
    {
        int __attribute__((aligned(32))) result[8]; 
        __m256i v = _mm256_set_epi32(0, 0, 0, 0, 0, 0, 1, input);
        v = (__m256i)_mm256_hadd_ps((__m256)v, (__m256)v);
        _mm256_store_si256((__m256i *)result, v);
        return *result;
    }
    
    int main(void)
    {
        int input = 19;
        printf("Input: %d, Incremented output: %d\n", input, increment_one(input));
        return 0;
    }
    
  • Sonotsugipaa@lemmy.dbzer0.com
    link
    fedilink
    English
    arrow-up
    14
    ·
    edit-2
    4 days ago
    // C++20
    
    #include <concepts>
    #include <cstdint>
    
    template <typename T>
    concept C = requires (T t) { { b(t) } -> std::same_as<int>; };
    
    char b(bool v) { return char(uintmax_t(v) % 5); }
    #define Int jnt=i
    auto b(char v) { return 'int'; }
    
    // this increments i:
    void inc(int& i) {
      auto Int == 1;
      using c = decltype(b(jnt));
      // edited mistake here: c is a type, not a value
      // i += decltype(jnt)(C<decltype(b(c))>);
      i += decltype(jnt)(C<decltype(b(c(1)))>);
    }
    

    I’m not quite sure it compiles, I wrote this on my phone and with the sheer amount of landmines here making a mistake is almost inevitable.

    • Ace@feddit.ukOP
      link
      fedilink
      arrow-up
      6
      arrow-down
      1
      ·
      edit-2
      4 days ago

      I got gpt to explain this and it really does not like this code haha

      It also said multiple times that c++ won’t allow the literal string ‘int’? I would be surprised if that’s true. A quick search has no relevant results so probably not true.

        • Sonotsugipaa@lemmy.dbzer0.com
          link
          fedilink
          English
          arrow-up
          3
          ·
          4 days ago

          Multiple-character char literals evaluate as int, with implementation defined values - it is extremely unreliable, but that particular piece of code should work.

      • Sonotsugipaa@lemmy.dbzer0.com
        link
        fedilink
        English
        arrow-up
        3
        ·
        4 days ago

        It’s funny that it complains about all of the right stuff (except the ‘int’ thing), but it doesn’t say anything about the concept.

        About the ‘int’ literal (which is not a string): cppreference.com has a description on this page about it, ctrl+f “multicharacter literal”.

    • Sonotsugipaa@lemmy.dbzer0.com
      link
      fedilink
      English
      arrow-up
      1
      ·
      edit-2
      3 days ago

      Just tested this: the “original+” code compiles, but does not increment i.

      There were two problems:

      • b(bool) and b(char) are ambiguous (quick fix: change the signatures to char b(bool&) and auto b(char&& v));
      • The concept def. has to come after the b functions, even if the constraint is only checked after both, I was unaware of this (fix: define C immediately before void inc(int&)).
  • Kogasa@programming.dev
    link
    fedilink
    arrow-up
    10
    ·
    edit-2
    4 days ago

    Let f(x) = 1/((x-1)^(2)). Given an integer n, compute the nth derivative of f as f^((n))(x) = (-1)(n)(n+1)!/((x-1)(n+2)), which lets us write f as the Taylor series about x=0 whose nth coefficient is f^((n))(0)/n! = (-1)^(-2)(n+1)!/n! = n+1. We now compute the nth coefficient with a simple recursion. To show this process works, we make an inductive argument: the 0th coefficient is f(0) = 1, and the nth coefficient is (f(x) - (1 + 2x + 3x^(2) + … + nx(n-1)))/x(n) evaluated at x=0. Note that each coefficient appearing in the previous expression is an integer between 0 and n, so by inductive hypothesis we can represent it by incrementing 0 repeatedly. Unfortunately, the expression we’ve written isn’t well-defined at x=0 since we can’t divide by 0, but as we’d expect, the limit as x->0 is defined and equal to n+1 (exercise: prove this). To compute the limit, we can evaluate at a sufficiently small value of x and argue by monotonicity or squeezing that n+1 is the nearest integer. (exercise: determine an upper bound for |x| that makes this argument work and fill in the details). Finally, evaluate our expression at the appropriate value of x for each k from 1 to n, using each result to compute the next, until we are able to write each coefficient. Evaluate one more time and conclude by rounding to the value of n+1. This increments n.

  • Admiral Patrick@dubvee.org
    link
    fedilink
    English
    arrow-up
    11
    ·
    edit-2
    4 days ago
    // this increments i:
    // Version 2: Now more efficient; only loops to 50 and just rounds up.  That's 50% less inefficient!
    
    function increment(val:number): number {
      for (let i:number = 0; i < 50; i = i +1) {
        val = val + 0.01
      }
    
      return Math.round(val)
    }
    
    
    let i = 100
    i = increment(i)
    // 101
    
    • Susaga@sh.itjust.works
      link
      fedilink
      English
      arrow-up
      10
      ·
      4 days ago

      This should get bonus points for incrementing i by 1 as part of the process for incrementing i by 1.

    • Ace@feddit.ukOP
      link
      fedilink
      arrow-up
      6
      ·
      edit-2
      4 days ago

      but if i gets randomly bitflipped, wouldn’t i != i+1 still be false? It would have to get flipped at exactly the right time, assuming that the cpu requests it from memory twice to run that line? It’d probably be cached anyway.

      I was thinking you’d need to store the original values, like x=i and y=i+1 and while x != y etc… but then what if x or y get bitflipped? Maybe we hash them and keep checking if the hash is correct. But then the hash itself could get bitflipped…

      Thinking too many layers of redundancy deep makes my head hurt. I’m sure there’s some interesting data integrity computer science in there somewhere…

      • psud@aussie.zone
        link
        fedilink
        arrow-up
        1
        ·
        3 days ago

        You just wait for the right bit too be flipped and the wrong ones flipped are flipped an even number of times

      • charizardcharz@lemmy.world
        link
        fedilink
        arrow-up
        1
        ·
        4 days ago

        I didn’t really dig too deep into it. It might be interesting to see what it actually compiles to.

        From what I can remember result of i+1 would have to be stored before it can be compared thus it would be possible for i to experience a bit flip after the result of i+1 is stored.