We are currently working on new rules for what content should and shouldn't be allowed on this website, and are looking for feedback! See Esolang:2026 topicality proposal to view and give feedback on the current draft.

FuckPutin

From Esolang
Jump to navigation Jump to search

FuckPutin is stack based esoteric programming language invented in 2022 by user PoetLuchnik. Stack - 65536 cells. Cell - 32 bit integer. Two stacks (A and B). Program is a sequence of digits and notes. Each digit it is offset for operation-accumulator. Operation-accumulator can be from 0 to 9. After offset operation-accumulator, program interpret operation-accumulator. At the beginning operation-accumulator is zero.

Operations

operation-accumulator value operation description
0 A.pop()
1 A.push(1)
2 A.push(A.pop() + A.pop())
3 A.push(~(A.pop() | A.pop()))
4 A.push(A.pop() >> 1)
5 A.push(B.pop())
6 B.push(A.peek())
7 tmp = B.pop(); if A.pop() != 0 then go to tmp
8 output(A.pop())
9 A.push(input())

Examples

print A

1597497497497497497916

Description: push_1 dup add dup add dup add dup add dup add dup add push_1 add out

C implementation

#include<stdlib.h>
#include<stdio.h>
#include<stdint.h>

FILE* fp = 0, * fi = 0, * fo = 0;

struct stk {
	long _[0x10000];
	uint16_t i;
} A = { .i = 0 }, B = { .i = 0 };

long fp_len = 0;

void push(struct stk* s, long d) {
	s->_[(s->i)++] = d;
}
long poop(struct stk* s) {
	return s->_[--(s->i)];
}
long peek(struct stk* s) {
	return s->_[(s->i) - 1];
}
void jump() {
	long t = poop(&B);
	if (poop(&A)) fseek(fp, t % fp_len, SEEK_SET);
}

int main(int argc, char** argv) {
	// open
	if (argc > 1) fp = fopen(argv[1], "r");
	if (fp == 0)  return 1;
	fseek(fp, 0, SEEK_END);
	fp_len = ftell(fp);
	fseek(fp, 0, SEEK_SET);
	if (argc > 2) fi = fopen(argv[2], "r");
	if (fi == 0)  fi = stdin;
	if (argc > 3) fo = fopen(argv[3], "w");
	if (fo == 0)  fo = stdout;
	// run
	uint8_t  op = 0;
	for (int c = fgetc(fp); c != EOF; c = fgetc(fp)) {
		if ('0' > c || c > '9') continue; // ignore
		op = (op + c - '0') % 10; // op += c (WARNING: NOT op = c)
		switch (op)
		{
		case 0: poop(&A);                         break; // pop
		case 1: push(&A, 1);                      break; // one
		case 2: push(&A, poop(&A) + poop(&A));    break; // add
		case 3: push(&A, ~(poop(&A) | poop(&A))); break; // nor
		case 4: push(&A, poop(&A) >> 1);          break; // shr
		case 5: push(&A, poop(&B));               break; // bta
		case 6: push(&B, peek(&A));               break; // atb
		case 7: jump();                           break; // jmp
		case 8: fputc(poop(&A), fo);              break; // put
		case 9: push(&A, fgetc(fi));              break; // get
		}
	}
	// close
	fclose(fp);
	if (fi != stdin)  fclose(fi);
	if (fo != stdout) fclose(fo);
	return 0;
}