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+1):
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.
Isn’t beginner++ gonna leave it unchanged?
range(val)
iterates from 0 to val-1, so the final i+1 is val// this increments i var i = new AtomicInteger(0); i.increment();
The best solution for the concurrent and atomic age.
Your intermediate increment looks like serious JavaScript code I’ve seen.
74181
(A + 1)
A0:A3 = (Input Register)
S0:S3 = Low
Mode = Low
CaryN = High
Q1:Q4 = (Output)
https://en.wikipedia.org/wiki/74181
.
Funny enough, it is one of the understood operations that I did not integrate on the truth table on-chip. I had some ideas on extra syntax, but the point is to avoid needing to look at reference docs as much as possible and none of my ideas for this one were intuitive enough this satisfy me.
Why not wait for a random bit flip to increment it?
int i = 0; while (i != i + 1); //i is now incremented
but if
i
gets randomly bitflipped, wouldn’ti != 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
andy=i+1
andwhile x != y
etc… but then what ifx
ory
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…
I like to shake the bytes around a little
i = ( i << 1 + 2 ) >> 1
This is such hax
Wait, why does it multiply by 4? (apparently addition takes precedence over bitwise operations)
Java has AtomicInteger, which is probably one of the more complicated, but also robust, ways of setting an integer.
That’s a tricky problem, I think you might be able to create a script that increments it recursively.
I’m sure this project that computes Fibonacci recursively spawning several docker containers can be tweaked to do just that.
https://github.com/dgageot/fiboid
I can’t think of a more efficient way to do this.
$i = 0; $s = "foobar"; $i+=$s=~/(oo)/; # This increments $i say $i;
I have no idea how your code works but I appreciate it for the excited guy /(oo)/
Looks like perl, they send the result of a regex match in scalar context. IIRC that gets the count of matches of oo in foobar (1)
Yes, that’s right.
Something like that should do it:
i = ~((~i + 1) + ~0) + 1
Use bitwise operations to simulate an adder. Bonus points if you only use NOR
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
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.
OP asked for code, not a lecture in number theory.
That said, as someone with a degree in math…I gotta respect this.
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
calm down, mr Knuth
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; }
I didn’t wake up expecting to hate someone today
First, imagine a number in JavaScript. (Bit of a nail biter here, huh?)
let i = 5
Then, we will construct an incrementor. This is really simple: here is the method.
- Make a bracket-string-centric version of
eval()
.
[]["filter"]["constructor"]("return i+1")()
- Reconstruct stringy
eval()
by using+[]
as 0,+!+[]
as 1, and implicit conversions as ways to create strings. For example, ‘false’ is(![]+[])
, so ‘f’ is(![]+[])[+[]]
.
[][ (![] + [])[+[]] + // f ([![]] + [][[]])[+!+[] + [+[]]] + // i (![] + [])[!+[] + !+[]] + // l (!![] + [])[+[]] + // t (!![] + [])[!+[] + !+[] + !+[]] + // e (!![] + [])[+!+[]] // r ][ ([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]]+[])[!+[]+!+[]+!+[]]+ // c (!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+ // o ([][[]]+[])[+!+[]]+ // n (![]+[])[!+[]+!+[]+!+[]]+ // s (!![]+[])[+[]]+ // t (!![]+[])[+!+[]]+ // r ([][[]]+[])[+[]]+ // u ([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]]+[])[!+[]+!+[]+!+[]]+ // c (!![]+[])[+[]]+ // t (!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+ // o (!![]+[])[+!+[]] // r ]("return i+1")()
- Draw the rest of the fucking owl. Final code:
let i = 5; // haha yay [][ (![] + [])[+[]] + // f ([![]] + [][[]])[+!+[] + [+[]]] + // i (![] + [])[!+[] + !+[]] + // l (!![] + [])[+[]] + // t (!![] + [])[!+[] + !+[] + !+[]] + // e (!![] + [])[+!+[]] // r ][ ([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]]+[])[!+[]+!+[]+!+[]]+ // c (!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+ // o ([][[]]+[])[+!+[]]+ // n (![]+[])[!+[]+!+[]+!+[]]+ // s (!![]+[])[+[]]+ // t (!![]+[])[+!+[]]+ // r ([][[]]+[])[+[]]+ // u ([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]]+[])[!+[]+!+[]+!+[]]+ // c (!![]+[])[+[]]+ // t (!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+ // o (!![]+[])[+!+[]] // r ]( (!![]+[])[+!+[]]+ // r (!![]+[])[!+[]+!+[]+!+[]]+ // e (!![]+[])[+[]]+ // t ([][[]]+[])[+[]]+ // u (!![]+[])[+!+[]]+ // r ([][[]]+[])[+!+[]]+ // n (+[![]]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+!+[]]]+ // ' ' ([![]]+[][[]])[+!+[]+[+[]]]+ // i (+(+!+[]+(!+[]+[])[!+[]+!+[]+!+[]]+[+!+[]]+[+[]]+[+[]])+[])[!+[]+!+[]]+ // + +!+[] // 1 )() // no virus i swear. execute arbitrary code in your browser console.
Anyway, that’s just everyday JS work. It’s like step 5 after resizing the button, but a bit before centering the div.
based on this. some translation methods done differently.
- Make a bracket-string-centric version of
int toIncrement = ...; int result; do { result = randomInt(); } while (result != (toIncrement + 1)); print(result);
haha, bogoincrement! I hadn’t thought of that, nice :D