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.

  • letsgo@lemm.ee
    link
    fedilink
    English
    arrow-up
    0
    ·
    20 hours ago

    C++:

    int i = 5;
    i ^= printf("The initial value of i is %d\n", i)^
    printf("i=i+1; // this increments i\n")^
    printf("Trigger very obscure FPU bug %c",(int)((float)8.5953287712*(double)8.5953287713-'?'))/10;
    printf("i has now been incremented by 1 : %d\n", i);
    

    Output:

    The initial value of i is 5  
    i=i+1; // this increments i  
    Trigger very obscure FPU bug  
    i has now been incremented by 1 : 6
    

    I didn’t test other values but they’re probably OK.

  • Minaltaz@sh.itjust.works
    link
    fedilink
    arrow-up
    0
    ·
    edit-2
    23 hours ago

    C++ templates my beloved

    #pragma pack(1)
    template <size_t i> struct increment;
    template <> struct increment<0> {
    	char _plusone;
    	constexpr static size_t value = 1;
    };
    
    template <size_t i> struct increment<i> {
    	char _plusone;  // this increments i
        constexpr static size_t value = sizeof(increment<i - 1>);
    };
    
    template <unsigned i>
    using increment_v<i> = increment<i>::value;
    
    • Minaltaz@sh.itjust.works
      link
      fedilink
      arrow-up
      0
      ·
      edit-2
      23 hours ago

      Bonus : to use it without knowing i at compile-time :

      template <size_t current_value = 0>
      size_t& inc(size_t& i) {
      	if (i == current_value) {
      		i = increment<current_value>::value;
      		return i;
      	} else {
      		if constexpr (current_value != std::numeric_limits<size_t>::max()) {
      			return inc<increment<current_value>::value>(i);
      		}
      	}
      }
      
      int main() {
      	int i;
      	std::cin >> i;
      	inc(i);  // this increments i
      	std::cout << i << std::endl;
      	return 0;
      }
      

      Hope you’re not in a hurry

  • vithigar@lemmy.ca
    link
    fedilink
    arrow-up
    0
    ·
    edit-2
    24 hours ago

    C# .NET using reflection, integer underflow, and a touch of LINQ. Should work for all integer types.

    // this increments i
    private static T Increment<T>(T i)
    {
        var valType = typeof(T);
        var maxField = valType.GetField("MaxValue");
        var minField = valType.GetField("MinValue");
        if (maxField != null)
        {
            T maxValue = (T)maxField.GetValue(i);
            T minValue = (T)minField.GetValue(i);
    
            var methods = valType.GetTypeInfo().DeclaredMethods;
            var subMethod = methods.Where(m => m.Name.EndsWith("op_Subtraction")).First();
                   
            T interim = (T)subMethod.Invoke(
                null,
                [i, maxValue]);
    
            return (T)subMethod.Invoke(
                null, 
                [interim, minValue]);
        }
        throw new ArgumentException("Not incrementable.");
    }
    
  • calcopiritus@lemmy.world
    link
    fedilink
    arrow-up
    0
    ·
    1 day ago

    C:

    int increment(int i) {
        return (int) (1[(void*) i])
    

    However, if you wanna go blazingly fast you gotta implement O(n) algorithms in rust. Additionally you want safety in case of integer overflows.

    use std::error::Error;
    
    #[derive(Debug, Error)]
    struct IntegerOverflowError;
    
    struct Incrementor {
        lookup_table: HashMap<i32, i33>
    }
    
    impl Incrementor {
        fn new() -> Self {
            let mut lut = HashMap::new();
            for i in 0..i32::MAX {
                lut.insert(i, i+1)
            }
            Incrementor { lookup_table: lut }
        }
    
        fn increment(&self, i: i32) -> Result<i32, IntegerOverflowError> {
            self.lookup_table.get(i)
                .map(|i| *i)
                .ok_or(IntegerOverflowError)
    }
    

    On mobile so I don’t even know if they compile though.

  • Boomkop3@reddthat.com
    link
    fedilink
    arrow-up
    0
    ·
    edit-2
    1 day ago

    writing code on my phone on the train with three minutes of time, let’s go and think of the worst possible solution!

    
    int i = 1337;
    
    for (byte x = 0; x < 32; x++) {
        if (i & (1 << x) == 1) {
            i &= 0xFFFFFFFF ^ ( // dangit I'm out of time
        } else {
            i |= 1 << x;
            break;
        }
    }
    
    
    

    Instead of a loop, you’d use 32 of these copy-pasted if statements and a goto :p

  • notabot@lemm.ee
    link
    fedilink
    arrow-up
    0
    ·
    1 day 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
      0
      ·
      edit-2
      1 day 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
    0
    ·
    edit-2
    2 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;
    }
    
  • Kogasa@programming.dev
    link
    fedilink
    arrow-up
    0
    ·
    edit-2
    2 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.

      • Kogasa@programming.dev
        link
        fedilink
        arrow-up
        0
        ·
        6 hours ago

        The argument describes an algorithm that can be translated into code.

        1/(1-x)^(2) at 0 is 1 (1/(1-x)^(2) - 1)/x = (1 - 1 + 2x - x^(2))/x = 2 - x at 0 is 2 (1/(1-x)^(2) - 1 - 2x) = ((1 - 1 + 2x - x^(2) - 2x + 4x^(2) - 2x(3))/x(2) = 3 - 2x at 0 is 3

        and so on