previndexinfonext

code guessing, round #5 (completed)

started at ; stage 2 at ; ended at

specification

hello everyone
for round 5 of code guessing, the challenge is base32-encode a string.
acceptable languages are C, Python and Java

your input string will contain only ascii characters, and will have a maximum length of 256 characters (bytes).
your output string must be the input string encoded in base32. the base32 character set is the uppercase ascii letters A-Z followed by the ascii numerals 2-7, additionally using = as a padding character. the base32 should be encoded according to section 6 of rfc4648 ( https://tools.ietf.org/html/rfc4648#section-6 )

in C: provide a function char *entry(char *input) which takes a null-terminated string as an input and returns a null-terminated string as output containing the base32 result.
in Python: provide a function entry that takes as input a normal python string and returns a normal python string as output containing the base32 result.
in Java: provide a class Entry containing a public static String entry(String input)method.

results

  1. 👑 Olivia +4 -0 = 4
    1. razetime
    2. IFcoltransG
    3. LyricLy (was ubq323)
    4. citrons
    5. ubq323 (was LyricLy)
    6. gollark
  2. ubq323 +2 -1 = 1
    1. gollark (was razetime)
    2. IFcoltransG
    3. Olivia (was citrons)
    4. LyricLy
    5. razetime (was gollark)
    6. citrons (was Olivia)
  3. IFcoltransG +2 -2 = 0
    1. gollark (was razetime)
    2. Olivia (was ubq323)
    3. citrons
    4. LyricLy
    5. razetime (was gollark)
    6. ubq323 (was Olivia)
  4. razetime +2 -3 = -1
    1. Olivia (was IFcoltransG)
    2. ubq323
    3. LyricLy (was citrons)
    4. citrons (was LyricLy)
    5. gollark
    6. IFcoltransG (was Olivia)
  5. citrons +1 -2 = -1
    1. razetime
    2. gollark (was IFcoltransG)
    3. LyricLy (was ubq323)
    4. Olivia (was LyricLy)
    5. ubq323 (was gollark)
    6. IFcoltransG (was Olivia)
  6. gollark +1 -2 = -1
    1. razetime
    2. citrons (was IFcoltransG)
    3. LyricLy (was ubq323)
    4. ubq323 (was citrons)
    5. Olivia (was LyricLy)
    6. IFcoltransG (was Olivia)
  7. LyricLy +0 -2 = -2
    1. gollark (was razetime)
    2. Olivia (was IFcoltransG)
    3. razetime (was ubq323)
    4. IFcoltransG (was citrons)
    5. ubq323 (was gollark)
    6. citrons (was Olivia)

entries

you can download all the entries

entry #1

written by razetime

guesses
comments 0

post a comment


17f8c2.java ASCII text
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class Entry {
private static final String base32Chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567";
public static String entry(String input){ // bees problem
    int l = input.length();
    String bits= "";
    String finalT = "";
    for(int i = 0; i<input.length();i++){
        String bit = Integer.toString((int)input.charAt(i),2);
        while(bit.length()!=8)bit = "0"+bit;
        //System.out.println(bit);
        bits += bit;
    }
    while(bits.length()%5!=0)bits += "0";
    //System.out.println(bits);
    for(int j=0; j< bits.length(); j+=5) {
        finalT += base32Chars.charAt(Integer.parseInt(bits.substring(j,j+5),2));
    }
    while(finalT.length()%8!=0)finalT+="=";
    return finalT;
}
public static void main(String[] args){
System.out.println(entry("Hiiii "));
System.out.println(entry("Hello World"));

}
}

entry #2

written by IFcoltransG

guesses
comments 0

post a comment


1e47a3.py ASCII text
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
type,; import string as string_consts, types as types
#pentameter? I barely know her, cripes!

def entry(input: str) -> type((lambda: "screen")()):
    @((size := 1) and (then := "") or types or "").coroutine

    @() or (lambda prose, **verse: lambda *couplet: prose())
    def unionized(): yield False and cools_as_snows

    [rough, *end] = map(bool, unionized().__await__())
    if (load := "2" "3" "4" "5" "6" "7" "8"):

        #the eight takes up an extra syllable
        @[take(i) for i in zip()] or callable

        def sig(): from everything import some_stuff
        its_no_big_deal = _ = 1 + list(range(2 ** 5))[~rough]

    bytes, sig = map(ord, str(input)), 1 + sig.real
    print(*end, sep="", end="Hello!"[its_no_big_deal:])

    for code in string_consts.ascii_letters + load:
        if code < '__apply__': hash(end.append(str(code)))

    big_number = sig.from_bytes(bytes.__iter__(), 'big')
    len = 8 * sum(sig for val in input) // sig

    while 4 < len:#greater len keeps loop alive
        then, size, then, len = then, size + 1, then, len - 5

        then += end[(big_number // 2 ** len) % 32]
        #generic comment line that rhymes with "you"

    if len: then += end[(big_number * 2 ** (5 - len)) % _]
    return str(then) + ((- size) % 8) * "=" if len else then

entry #3

written by ubq323

guesses
comments 0

post a comment


5fcbf9.py ASCII text
1
2
3
4
# this is basically the opposite of my previous submission
# so no one will guess me, probably
import base64
entry = lambda b: base64.b32encode(b.encode("ascii")).decode("ascii")

entry #4

written by citrons

guesses
comments 0

post a comment


a18266.py ASCII text
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
import zlib
import base64

based = """
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
9lFqv/ztv3CW0v8BgQ8MeQ==
"""

esolangs = None

def entry(string):
    global esolangs
    exec(zlib.decompress(base64.decodebytes(based.encode('utf-8'))))
    return esolangs(string)

entry #5

written by LyricLy

guesses
comments 0

post a comment


dcbd65.py ASCII text
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
import base64  # misnomer
import itertools  # this one is written in C (wao!)
from typing import *  # high WPM :3


A = TypeVar("A")
B = TypeVar("B")
def invert_function(
    f: Callable[[A], B],
    domain: Iterator[A],  # cool math term :3
) -> Callable[[B], A]:
    solutions: Dict[B, A]  # mypy can't solve this (wwwwwwwwwwww)
    solutions = {}  # caching
    def inverted_function(x):
        if x in solutions:
            return solutions[x]  # caching!
        else:
            for p in domain:
                try:
                    result = f(p)
                except Exception as e:
                    pass  # so naughty :3
                    # TODO: never fix :3 :3 :3
                else:
                    solutions[result] = p  # caching :3
                    if result == x:
                        return p
    # don't forget
    inverted_function.__name__ = f.__name__ + "_inverted"
    return inverted_function


class Addable(Protocol):
    def __add__(self, other): ...
T = TypeVar("T", bound=Addable)

# better sum function
def sum(l: Iterable[T]) -> T:
    if isinstance(l, str):
        pass  # I'm the cool sum
    value = None
    for v in l:
        if value is None:
            value = v  # inference :4
        else:
            value += v
    assert value is not None  # typechecker again :9
    return value

# you know how people have trouble remembering the alphabet, so they have to remember it using the song?
# this is the modern version of that, where I forgot the song too, so I had to copy it off the Internet.
# I wanted to omit the period, but my line lengths were syncing up, and it would have broken the pattern
alphabet = ("""
A B C D E F G
H I J K L M N O P
Q R S
T U V
W X
Y and Z
"""
"""Now we know our ABCs"""  # small change to make processing easier :!
"""
Next time won't you sing with me
""")

# post-processing :"
alphabet = sum(w for w in alphabet.split() if len(w) == 1) + "234567="

# error: Argument 1 to "map" has incompatible type "Callable[[Iterable[T], Optional[T]], Optional[T]]"; expected "Callable[[Tuple[str, ...]], Optional[T]]"
strings = itertools.chain.from_iterable(map(sum, itertools.combinations_with_replacement(alphabet, n)) for n in itertools.count(start=8, step=8))  # type: ignore

# ignore, ignore :&
entry = invert_function(base64.b32decode, map(str.encode, strings))  # type: ignore

# let's try it :3
import multiprocessing
t = multiprocessing.Process(target=lambda: entry(b"a"))
t.start()
t.join(timeout=10)

if t.is_alive():
    # oh no
    # it's too slow
    # this can't be happening to me
    # oh no no no no
    t.join(timeout=30)
    if t.is_alive():
        # NO
        # NO NO NO
        t.terminate()
        # I never intended it to be this way
        # it's not my fault
        # it's Python
        # I should have used C
        # if I'd used C, everything would have been okay





        # I'm scared
        # what will happen to me if this entry isn't finished?
        # I don't know what to do
        # please, someo--


        # wait.
        # there's something I could do
        # but if it doesn't work...
        # no.
        # it has to work.

        # everything has been done by someone once before.
        # I'll draw on their combined knowledge to acquire an ultimate algorithm that won't fail!

        # Grand Technique: Greater Stealing.
        try:
            from stackoverflow import base32_encode
        except:
            # What?!
            # The world has failed me?
            # No, I can surely take Base64 and convert it downwards...
            try:
                from stackoverflow import base64_encode
            except:
                # No?!
                # Dammit, how do I enc-- wait.
                from stackoverflow import how_to_encode_text_to_base64 as base64_encode

                # ...

                # YES!

            # now, let's see what we have...
            print(dir(base64_encode))
            # oh, it's in a `base64` module...
            print(dir(base64_encode.base64))
            # what?
            # no way.
            print(base64_encode.base64 is base64)
            # something so ridiculous is impossible, surely.

            # wait, is there an opposite to base64.b32_encode already?
            entry = base64.b32encode
            print(entry(b"test"))

            # ...




            # ...





            # ...


            # get lost, Python.
            # now I'm really mad.



































# oops :3 :3 :3
old_entry = entry
entry = lambda s: old_entry(s.encode()).decode()  # type: ignore

entry #6

written by gollark

guesses
comments 0

post a comment


de752b.py ASCII text
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
import string, re

def entry(argv):
    argv = argv.encode("utf-8")
    modulus = len(argv) % 5
    if modulus > 0:
        argv += b"\x00" * (5-modulus)
    chars = string.ascii_uppercase + "234567"
    historyLen = 1
    
    b = 0
    for c in reversed(argv):
        b += c * historyLen
        historyLen *= 256
    data = []
    while b != 0:
        data.append(chars[b % 32])
        b //= 32
    data = "".join(reversed(data))
    
    checksum = { 0: 0, 1: 6, 2: 4, 3: 3, 4: 1 }
    return re.sub("A{%d}$" % checksum[modulus], lambda str: str.group(0).replace("A", "="), data)

entry #7

written by Olivia

guesses
comments 0

post a comment


de85ee.py Unicode text, UTF-8 text, with very long lines (1762)
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
import abc
import ctypes
import enum
import functools
import operator
import random
import sys

'''
PYSP
PYthon String Programming

lisplike language built on Python

nil = ... or Ø
nil () -> 0
n: nat () -> succ n
nil (nil) -> []
l: list (x: any) -> l + [x]
n: nat (node) -> n <latch node to field n>
n: nat (list) -> any <hatch node in field n with msgs>
l: list () -> l + msgs()

field 0 is reserved to root node
field 1 is reserved to trunk node

root & trunk node:
- takes 2+ messages
- 1st message is leaf (nat)
- 2nd message is bug (nat)
- more optional msgs based on op

root node:
	0: ops:
		0: =
		1: !!
		2: !
	1: nat:
		0: +
		1: -
		2: *
		3: /
		4: ^
		5: %
		6: <
		7: >
	2: list:
		0: [x]
		1: [x:y]
		2: len
		3: +
		4: sum
	3: flow
		0: if
		1: wrap
		2: ()
		3: expand msgs
	4: ffi
		0: get
		1: set
		2: !
		3: fn
		4: input
		5: print
trunk node:
	0: rat:
		0: nat->
		1: ->nat
	1: seq:
		0: ~
		1: map
		2: filter
		3: *
	2: rand:
		0: ?
		1: range
		2: choiche
		3: ?!
	3: c:
		0: run gcc
		1: run clanc
	4: extra:
		0: sbstr
		1: b32e
'''

class Block:
	def __init__(self, label): 
		pass
	def __enter__(self):
		pass
	def __exit__(self, *args):
		pass

with Block('PYSP set-up'):
	with Block('Constants'):
		USE_SAFE_SENTINEL = False
		NIL_STR = 'Ø' if USE_SAFE_SENTINEL else '...'
	
	with Block('PYSP Types'):
		class Base:
			__slots__ = ()
			nil_str = NIL_STR
			def __repr__(self):
				return f'({self.__class__.__name__} at {id(self):x})'

		class Nil(Base):
			__slots__ = ()
			def __call__(self, msg = None):
				if msg is None:
					return Nat(0)
				elif isinstance(msg, Nil):
					return List([])
				else:
					raise TypeError(f'Message to Nil must be Nil, not {msg!r}')
			def __init__(self, nil = None):
				pass
			def __eq__(self, other):
				return isinstance(other, Nil)
			def __str__(self):
				return self.nil_str
			def __hash__(self):
				return hash(None)

		class Nat(Base):
			__slots__ = 'value',
			def __init__(self, value):
				self.value = int(value)
			def __call__(self, message = None):
				if message is None:
					return +self
				elif isinstance(message, (str, NodeBase)):
					state_node_field[~self] = to_node(message)
					return self
				elif isinstance(message, List):
					state_priv_msgs[:] = message
					return state_node_field[~self].do()
				else:
					raise TypeError(f'Message to Nat must be Node or List, not {message!r}')
			def __pos__(self):
				return Nat(~self + 1)
			def __invert__(self):
				return self.value
			def __repr__(self):
				return f'({self.__class__.__name__} {self.value} at {id(self):x})'
			def __str__(self):
				return str(~self)
			def __eq__(self, other):
				if not isinstance(other, Nat):
					return False
				return ~self == ~other
			def __lt__(self, other):
				return ~self < ~other
			def __gt__(self, other):
				return ~self > ~other
			def __hash__(self):
				return hash(~self)

		class List(Base):
			__slots__ = 'view',
			def __init__(self, view):
				self.view = view
			def __call__(self, msg = None):
				if msg is None:
					self ^ state_priv_msgs[:]
				elif isinstance(msg, str):
					self <<= Node(msg)
				else:
					self <<= msg
				return self
			def double(self):
				return type(self)([
					x.double() if isinstance(x, List) else x for x in self
				])
			def __invert__(self):
				return self.view
			def __ilshift__(self, other):
				(~self).append(other)
				return self
			def __xor__(self, other):
				(~self).extend(~other)
			def __str__(self):
				return '(' + ', '.join(str(value) for value in ~self) + ')'
			def __len__(self):
				return len(~self)
			def __iter__(self):
				return iter(~self)
			def __eq__(self, other):
				if not isinstance(other, List):
					return False
				return all(x == y for x, y in zip(self, other))

		class NodeBase(Base):
			__slots__ = ()
			@abc.abstractmethod
			def do(self): 
				pass

		def to_node(into):
			if isinstance(into, str):
				return Node(into)
			return into

		class Node(NodeBase):
			__slots__ = 'raw', 'compiled'
			def __init__(self, raw):
				try:
					self.raw = raw
					self.compiled = compile(raw, filename='(Node)', mode='eval')
				except SyntaxError as e:
					raise SyntaxError('Node must contain valid source code') from e
			def __str__(self):
				return f'\'{self.raw}\''
			def do(self):
				return eval(self.compiled)
			def __eq__(self, other):
				if not isinstance(other, Node):
					return False
				return self.raw == other.raw

		class CoreNode(NodeBase):
			__slots__ = 'fn',
			def do(self):
				return self.fn()
			def __init__(self, fn):
				self.fn = fn
	
	with Block('Core Nodes'):
		with Block('Core Node set-up'):
			def get_msgs(min, max = None):
				msg_count = len(state_priv_msgs[:])
				if msg_count < min:
					raise TypeError(f'Root Core node takes at least {min} messages, got {msg_count}')
				if max is not None and msg_count > max:
					raise TypeError(f'Root Core node takes at most {max} messages, got {msg_count}')
				return state_priv_msgs[:]

			def do_core_node(root = True):
				first_msg, second_msg, *other_msgs = get_msgs(2)
				if not isinstance(first_msg, Nat):
					raise TypeError(f'Core node takes Nat as first message, got {first_msg!r}')
				if not isinstance(second_msg, Nat):
					raise TypeError(f'Core node takes Nat as second message, got {second_msg!r}')
				try:
					if root:
						return root_leaves[~first_msg][~second_msg](*other_msgs)
					else:
						return trunk_leaves[~first_msg][~second_msg](*other_msgs)
				except IndexError as e:
					raise ValueError(f'Value too large ({first_msg!r}), maximum is {len(trunk_leaves) - 1}') from e
				# except TypeError as e:
				# 	raise TypeError(f'Wrong number ({len(other_msgs)}) of messages given to leaf (or it could just be an error raised above)') from e

			@CoreNode
			def root_core_node():
				return do_core_node()

			@CoreNode
			def trunk_core_node():
				return do_core_node(root=False)
		
		with Block('Core Node Leaf set-up'):
			def wrap_bin_args(l_wrap, r_wrap):
				def inner(bug):
					def innerer(left, right):
						return bug(l_wrap(left), r_wrap(right))
					return innerer
				return inner

			def wrap_both_bin_args(wrap):
				return wrap_bin_args(wrap, wrap)
			
			def wrap_all_args(wrap):
				def inner(bug):
					def innerer(*msgs):
						return bug(*(wrap(msg) for msg in msgs))
					return innerer
				return inner

			def wrap_return(wrap):
				def inner(bug):
					def innerer(*msgs):
						return wrap(bug(*msgs))
					return innerer
				return inner

			def else_bin_op(op):
				def inner(bug):
					def innerer(l_msg, r_msg):
						value = bug(l_msg, r_msg)
						if value is not None:
							return value
						return op(l_msg, r_msg)
					return innerer
				return inner

			def unwrap_nat(msg):
				if not isinstance(msg, Nat):
					raise TypeError(f'Message given must be nat, not {msg}')
				return ~msg

			def nat_bin_op(op):
				def inner(bug):
					x = wrap_return(Nat)(wrap_both_bin_args(unwrap_nat)(else_bin_op(op)(bug)))
					return x
				return inner

			class LeafMeta(type):
				def __new__(mcls, name, bases, ns, *, abstract = False, root = True):
					if not abstract:
						for bug in ns.values():
							if callable(bug):
								if root:
									root_leaves[RootLeaves[name.lower().removesuffix('leaf')]].append(bug)
								else:
									trunk_leaves[TrunkLeaves[name.lower().removesuffix('leaf')]].append(bug)
					return super().__new__(mcls, name, bases, {})
		
		with Block('Root Core Node Leaves'):
			class RootBase(metaclass=LeafMeta, abstract=True):
				pass

			class RootLeaves(enum.IntEnum):
				ops = 0
				nat = 1
				list = 2
				flow = 3
				ffi = 4

			root_leaves= [[] for _ in RootLeaves]

			def pysp_bool(py_bool):
				if py_bool:
					return Nat(0)
				else:
					return Nil()

			class OpsLeaf(RootBase):
				@wrap_return(pysp_bool)
				@else_bin_op(operator.eq)
				def equality(left, right):
					pass
				
				@wrap_return(pysp_bool)
				def truthy(msg):
					return not isinstance(msg, Nil)

				@wrap_return(pysp_bool)
				def un_truthy(msg):
					return isinstance(msg, Nil)

			class NatLeaf(RootBase):
				@wrap_return(Nat)
				@wrap_all_args(unwrap_nat)
				def add(*nats):
					return sum(nats)

				@nat_bin_op(operator.sub)
				def subtract(l_nat, r_nat):
					if l_nat < r_nat:
						return 0

				@wrap_return(Nat)
				@wrap_all_args(unwrap_nat)
				def multiply(*nats):
					return functools.reduce(operator.mul, nats)

				@nat_bin_op(operator.floordiv)
				def divide(l_nat, r_nat):
					if r_nat == 0:
						raise ZeroDivisionError('Second message is zero Nat')

				@nat_bin_op(operator.mod)
				def modulos(l_nat, r_nat):
					if r_nat == 0:
						raise ZeroDivisionError('Second message is zero Nat')
				
				@nat_bin_op(operator.pow)
				def exponentiate(l_nat, r_nat):
					pass
				
				@wrap_return(pysp_bool)
				@else_bin_op(operator.lt)
				def less_than(l_nat, r_nat):
					pass
				
				@wrap_return(pysp_bool)
				@else_bin_op(operator.gt)
				def greater_than(l_nat, r_nat):
					pass
			
			class ListLeaf(RootBase):
				def sli(pysp_list, nat_idx):
					try:
						return (~pysp_list)[~nat_idx]
					except IndexError as e:
						raise ValueError('Index out of bounds') from e
				
				@wrap_return(List)
				def slice(pysp_list, start_idx, end_idx):
					try:
						return (~pysp_list)[~start_idx:end_idx]
					except IndexError as e:
						raise ValueError('Index out of bounds') from e

				@wrap_return(Nat)
				def length(pysp_list):
					return len(pysp_list)
				
				@wrap_return(List)
				def join(left, right):
					return ~left + ~right
				
				@wrap_return(List)
				def join2(pysp_lists):
					return functools.reduce(operator.add, [~x for x in pysp_lists], [])

			class FlowLeaf(RootBase):
				def if_elsif(cond_msg, *eq_node_pairs):
					for case_val, case_node in zip(eq_node_pairs[::2], eq_node_pairs[1::2]):
						if cond_msg == case_val:
							return case_node.do()
					if len(eq_node_pairs) & 1:
						return eq_node_pairs[-1].do()
					else:
						return cond_msg

				@wrap_return(CoreNode)
				def wrap(msg):
					def inner():
						return msg
					return inner

				@wrap_return(CoreNode)
				def call(nat_ptr, msgs):
					def inner():
						return nat_ptr(msgs)
					return inner
				
				@wrap_return(CoreNode)
				def expand(nat_ptr, node):
					def wrapper(x):
						return x
					def inner():
						for i, msg in enumerate(get_msgs(0)):
							Nat(~nat_ptr + i)(CoreNode(functools.partial(wrapper, msg)))
						return node.do()
					return inner

			with Block('FFI'):
				with Block('FFI set-up'):
					class PyObject(Base):
						@abc.abstractclassmethod
						def from_py(cls, py_obj): pass
						@abc.abstractclassmethod
						def from_pysp(cls, pysp_obj): pass
						@abc.abstractmethod
						def to_py(self): pass

					def py_to_ffi(py_obj):
						py_ffi_mapping = [
							(type(None), PyNone),
							(int, PyInt),
							(list, PyList),
							(bytes, PyBytes),
							(str, PyString),
							(type(lambda: 0), PyLambda),
						]
						for py_t, ffi_t in py_ffi_mapping:
							if isinstance(py_obj, py_t):
								return ffi_t.from_py(py_obj)
						raise TypeError('No basic ffi representation found')

					def pysp_to_ffi(pysp_obj):
						if isinstance(pysp_obj, PyObject):
							return pysp_obj
						if isinstance(pysp_obj, Nil):
							return PyNone.from_pysp(pysp_obj)
						if isinstance(pysp_obj, Nat):
							return PyInt.from_pysp(pysp_obj)
						if isinstance(pysp_obj, List):
							header = (~pysp_obj)[0]
							if header == Nat(0):
								return PyList.from_pysp(pysp_obj)
							elif header == Nat(1):
								return PyBytes.from_pysp(pysp_obj)
							elif header == Nat(2):
								return PyString.from_pysp(pysp_obj)
							else:
								raise TypeError('List header not recognized')
						raise TypeError('No basic ffi representation found')

					class PyNone(Nil, PyObject):
						@classmethod
						def from_py(cls, py_none):
							return Nil()
						@classmethod
						def from_pysp(cls, nil):
							return PyNone()
						def to_py(self):
							return None

					class PyInt(Nat, PyObject):
						@classmethod
						def from_py(cls, py_int):
							if py_int < 0:
								raise TypeError('Nat can only take nonnegative ints')
							return cls(py_int)
						@classmethod
						def from_pysp(cls, nat):
							return cls(~nat)
						def to_py(self):
							return ~self
					
					class PyList(List, PyObject):
						@classmethod
						def from_py(cls, py_list):
							return cls([Nat(0)] + [py_to_ffi(x) for x in py_list])
						@classmethod
						def from_pysp(cls, pysp_list):
							return cls(~pysp_list)
						def to_py(self):
							return [pysp_to_ffi(x).to_py() for x in (~self)[1:]]

					class PyBytes(List, PyObject):
						@classmethod
						def from_py(cls, py_bytes):
							return cls([Nat(1)] + [Nat(c) for c in py_bytes])
						@classmethod
						def from_pysp(cls, pysp_list):
							return cls(~pysp_list)
						def to_py(self):
							temp = []
							for nat in (~self)[1:]:
								if not isinstance(nat, Nat):
									raise TypeError('PyString is a List of Nats')
								temp.append(bytes([~nat]))
							return b''.join(temp)

					class PyString(List, PyObject):
						@classmethod
						def from_py(cls, py_str):
							return cls([Nat(2)] + [Nat(ord(c)) for c in py_str])
						@classmethod
						def from_pysp(cls, pysp_list):
							return cls(~pysp_list)
						def to_py(self):
							temp = []
							for nat in (~self)[1:]:
								if not isinstance(nat, Nat):
									raise TypeError('PyString is a List of Nats')
								temp.append(chr(~nat))
							return ''.join(temp)
					
					class PyLambda(PyObject):
						__slots__ = 'fn',
						@classmethod
						def from_py(cls, py_fn):
							return cls(py_fn)
						def __init__(self, fn):
							self.fn = fn
						@classmethod
						def from_pysp(cls, node):
							raise TypeError('Internal compiler error: attempted to unwrap an Err value')
						def to_py(self):
							return self.fn

				class FfiLeaf(RootBase):
					def py_name(name):
						name_str = PyString(~name)
						return py_to_ffi(globals()[name_str.to_py()])

					@wrap_return(Nil)
					def py_define(name, value):
						name_str = PyString.from_pysp(name)
						globals()[name_str.to_py()] = pysp_to_ffi(value).to_py()
					
					def py_panic(err_code):
						raise Exception(~err_code)

					def py_lambda(node):
						@PyLambda
						def inner(*py_args):
							state_priv_msgs[:] = List([py_to_ffi(py_arg) for py_arg in py_args])
							return pysp_to_ffi(node.do()).to_py()
						return inner
					
					def py_out(pysp_str):
						return Nat(sys.stdout.write(pysp_to_ffi(pysp_str).to_py()))
					
					def py_in(pysp_nat):
						return py_to_ffi(sys.stdout.read(~pysp_nat))

		with Block('Trunk Core Node Leaves'):
			class TrunkMeta(LeafMeta):
				def __new__(mcls, name, bases, ns, *, abstract = False, root = False):
					return super().__new__(mcls, name, bases, ns, abstract=abstract, root=root)

			class TrunkBase(metaclass=TrunkMeta, abstract=True):
				pass

			class TrunkLeaves(enum.IntEnum):
				rat = 0
				seq = 1
				rand = 2
				c = 3
				extra = 4

			trunk_leaves = [[] for _ in TrunkLeaves]

			def do_root(leaf, bug, *msgs):
				return Nat(0)(List([Nat(leaf), Nat(bug), *msgs]))

			class RatLeaf(TrunkBase):
				def from_nat(nat):
					return List([Nil(), nat, Nat(1)])
				
				def to_nat(rat):
					return do_root(1, 3, do_root(2, 0, rat, Nat(1)), do_root(2, 0, rat, Nat(2)))

			class SeqLeaf(TrunkBase):
				def reverse(pysp_list):
					return List(reversed(~pysp_list))
				
				def map(node, pysp_list):
					x = []
					for elem in pysp_list:
						state_priv_msgs[:] = List([elem])
						x.append(node.do())
					return List(x)
				
				def filter(node, pysp_list):
					x = []
					for elem in pysp_list:
						state_priv_msgs[:] = List([elem])
						if not isinstance(node.do(), Nil):
							x.append(elem)
					return List(x)

				def repeat(msg, nat):
					return List([msg for _ in range(~nat)])
			
			class RandLeaf(TrunkBase):
				def rand():
					if random.random() > 0.5:
						return Nil()
					return Nat()

				@wrap_return(Nat)
				def rand_nat(left_nat, right_nat):
					return random.randint(~left_nat, ~right_nat)

				def rand_elems(pysp_list, nat):
					return random.choices(~pysp_list, k=~nat)

				def rand_panic():
					if random.random() > 0.5:
						raise Exception(-1)
					return Nil()
			
			class CLeaf(TrunkBase):
				def gcc(node):
					return None

				def clang(node):
					pass

			class ExtraLeaf(TrunkBase):
				def rep_substring(str_list, chr_nat, count_nat):
					...

				def b32e(str_list):
					return

		with Block('Root & Trunk Core Node wrap-up'):
			class Wrapper:
				def __init__(self, wrapped):
					self[:] = wrapped
				def __getitem__(self, _):
					return self.wrapped.double()
				def __setitem__(self, _, wrapped):
					self.wrapped = wrapped.double()

			state_priv_msgs = Wrapper(List([]))
			state_node_field  = { 0: root_core_node, 1: trunk_core_node }
	
	with Block('Wrap-up'):
		if USE_SAFE_SENTINEL:
			Ø = Nil()
		else:
			ctypes.py_object.from_address(id(...) + 8).value = Nil

with Block('Tests'):
	def test(s):
		import base64
		return base64.b32encode(s.encode()).decode('utf-8')

	def check(s):
		assert test(s) == entry(s)

with Block('Code'):
	...(...)(...()(...(...)(...()()()()())(...()())(...(...)(...()()())(...()(...(...)(...()())(...()()()()()())(...()()()()()()()()()()())(...()()()))())(...()(...(...)(...()())(...()()())(...()()())(...()()()()()())(...()()()()()()()()()()()())))(...()(...(...)(...()())(...()()())(...()()()()())(...()()()()())(...()()()()()()()()))()()()())(...()(...(...)(...()())(...()()())(...()()()()())(...()()()()())(...()()()()()()()()))()())(...()(...(...)(...()())(...()()()()()())(...()()()()()()()()()()()())(...()()()))))(...()(...(...)(...()()()()())(...())(...(...)(...()()())(...()(...(...)(...()())(...()()())(...()()()()())(...()()()()())(...()()()()()()()()))()()()())(...()(...(...)(...()())(...()()()()()())(...()()()()()()()()()()())(...()()()))())(...()(...(...)(...()())(...()()())(...()()()()())(...()()()()())(...()()()()()()()()))()()())(...()(...(...)(...()())(...()()())(...()()()()())(...()()()()())(...()()()()()()()()))()()()()))))))(...()(...(...)(...()()()()())(...()()()()())(...()(...(...)(...()()())(...()()()())(...(...)(...()()()))(...()(...(...)(...()()())(...()()()()())(...()()(...(...)(...()())(...()()()())(...(...)(...()(...(...)(...()())(...()()())(...()()()()())(...()()()()())(...()()()()()()()))())(...()(...(...)(...()())(...()()())(...()()()()())(...()()()())(...()()()())(...()()()()))())(...()(...(...)(...()())(...()()())(...()()()()())(...()()()())(...()()()())(...()()()()))()()())(...()(...(...)(...()())(...()()()()()())(...()()()()()()()()()()())(...()()()))()()())(...()(...(...)(...()())(...()()())(...()()()()())(...()()()()())(...()()()()()()()()))()()()()())(...()(...(...)(...()())(...()()())(...()()()()())(...()()()()())(...()()()()()()()()))()()())(...()()()()()()()()()()()))(...()()()()()()()()()()())))))))))