IRCPuzzles is an IRC-based puzzle game hosted every year on April 1st. The event lasts for several days. The answers are keys to channels and contestants progress from the first level to the final level. The levels usually get progressively harder. Each level is solvable with the original clue alone, but additional hints are added later if the contestants are stuck on a level for long.

Picture showing a jigsaw puzzle map, with one piece missing

Picture showing a jigsaw puzzle map, with one piece missing

Since I enjoy solving puzzles and challenges, I usually participate in this event every year. Cluelessly staring at a vague hint for hours, relentlessly going down multiple rabbit holes, the joy of finally finding a solution… what’s not to love? After all, this is fairly similar to a regular day in information security. I decided to check out this year’s puzzles.

Picture showing Weechat, an IRC client

Picture showing Weechat, an IRC client

For those who are unfamiliar with IRC:

  • IRC is a text-based chat system for instant messaging. You can connect to an IRC server using an IRC client.
  • Channel refers to an IRC channel. This is similar to a channel/group on messaging apps.
  • Topic refers to the IRC channel’s title. The information regarding a level is given in the corresponding channel’s topic.
  • Key refers to the secret channel key (similar to a password) that’s required to join the next level’s channel. You get this by solving the previous level.

The Tips page on the IRCPuzzles website contains more helpful information regarding the challenge format:

  • The clue is, by itself, the main puzzle for each level.
  • The hints are to help point you in the right direction with the clue.
  • Channel keys only contain the following characters: [a-z0-9]. Solutions have spaces and dashes stripped, so French Revolution becomes frenchrevolution and Voight-Kampff becomes voightkampff

Table of Contents

This post is fairly lengthy, so you can browse puzzles based on your interest:

Level 0

This is where the event begins. I joined the channel, and found the following channel topic: | 2022 AFPC has begun, first clue is: aGlzdG9yeQ== | #ircpuzzles-2022-afpc-01 is the first channel | #ircpuzzles-chat for off-topic chat | Rules: | Tips:

As an IRCPuzzles tradition, the first challenge is usually a base64-encoded string:

$ echo "aGlzdG9yeQ==" | base64 -d

The answer (key to the next level) was history. I joined level 1 with /join #ircpuzzles-2022-afpc-01 history.

Level 1

Channel topic:

Welcome to Level 01 of #ircpuzzles || Clue(s): MKMyoaD=

The string looked like base64. However, given the first couple of levels of AFPC have involved ROT13 in some fashion in previous years, I applied ROT-13 decoding on the string:

$ rot13 MKMyoaD=

The output looked like another base64 string, so I decoded it like before:

$ echo "ZXZlbnQ=" | base64 -d

That wasn’t very hard!

Level 2

Channel topic:

Welcome to Level 02 of #ircpuzzles || This year’s theme: Historic Moments & Personalities || Clue(s): ET TV | AVC || Hints: τέκνον |

The first two levels were just introductory. The theme for this year (Historic Moments & Personalities) looked pretty interesting. However, as I’m not a history nerd, I wasn’t sure whether it was going to be easy.

ET TV | AVC didn’t give me any ideas on how to proceed. I thought I had to figure out what ET TV meant and then apply AVC to it. Advanced Video Coding (AVC) is a video compression standard, but I could not find any connection to ET TV. ETTV was a torrent distribution group, so that appeared to make some kind of sense, but I ruled it out because it didn’t connect with the rest of the hints.

The hint picture given was of the Pantheon, which is a monument in Rome:

Hint picture: Pantheon monument in Rome

Hint picture: Pantheon monument in Rome

Googling for “avc rome” gave me This was a method to represent a date in years since 753 BC, the traditional founding of Rome. The year 1 BC would be written AUC 753, and 2022 AD (current year) would be written AUC 2775. Furthermore, the hint τέκνον translates to “child” — this did not seem particularly helpful.

I thought about ET TV. Initially, I tried to relate Entertainment Tonight (because it’s a TV channel) and Ab Urbe Condita / Rome; however, that proved fruitless. Then I went on multiple tangents about ET: Economic Times, Extra Terrestrial, etc. But those were all dead ends.

After being stuck for a while, I read the Wikipedia article for Ab Urbe Condita and found that AUC is also abbreviated as AVC. If AUC meant AVC then ET TV could mean ET TU. Googling for “et tu + rome” gave me,_Brute%3F. Et Tu is a Latin phrase used to signify an unexpected betrayal by a friend. I was pretty sure this was the solution, but I wasn’t sure of the answer key.

I then remembered seeing a list of years and their corresponding AUC values in the “Ab urbe condita” Wikipedia article:

Table listing historic events and their corresponding AUC years

Table listing historic events and their corresponding AUC years

As ET TU was said during the assassination of Julius Caesar, I tried the year of death as the answer: 710 AUC.

710 was the answer. I later found out that Caesar’s last words were supposedly καὶ σύ, τέκνον (you too, child). Onto the next one!

Level 3

Channel topic:

Welcome to Level 03 of #ircpuzzles || Clue(s): 𒃲 𐦂 ♌︎

The clue was surprisingly brief. I found the meanings of each Unicode codepoint (they were Cuneiform symbols):

𒃲 = large/great/GAL
𐦂 = meroitic hieroglyphic letter i 
♌︎ = leo

Googling for great eye leo pointed me to Leo constellation, which also links to Rome, so I thought I was on the right track. However, none of the answers I tried from the constellation Wikipedia page worked. Then, googling Great i Leo (the three unicode meanings) pointed me to Pope Leo I (also Leo the Great) was a Bishop of Rome. After learning a bit about Leo the Great, I went through

Wikipedia table showing stars in Orion and their Bayer Designation Symbol

Wikipedia table showing stars in Orion and their Bayer Designation Symbol

I noticed each star had a symbol associated with it (second column). B stands for Bayer Designation Symbol.

From Wikipedia:

A Bayer designation is a stellar designation in which a specific star is identified by a Greek or Latin letter followed by the genitive form of its parent constellation’s Latin name.

I tried to see if the Bayer designation symbol somehow connects to any of the Unicode characters in the clue. Unfortunately, it did not.

Since a word could mean different things in different contexts, I might have taken the incorrect interpretation of the symbols. I looked at the alternate meanings of these words. Reading them out in order helped: GAL + i + leo => Galileo. That was it! I ended up going the longer and more scenic route to arrive at the answer, but oh well.

Level 4

Channel topic:

Welcome to Level 04 of #ircpuzzles || Clue(s): -18697508872 | 선 || Hint(s):

Like the previous level, the clue was very short: -18697508872 | 선. My first thought was that -18697508872 was a Unix timestamp (something I’ve written about on Stack Overflow years back — meant “good” or “line” in Korean.

The hint was a picture of a date fruit — this solidified my assumption that the clue string was a representation of a date or multiple dates.

Picture of a date fruit

Picture of a date fruit

I tried arranging 18697508872 as a sequence of dates: 186, 697, ..., 872, 1869, 7508, 872, etc. I was hoping to find some connection between those years. However, the second arrangement did not even make sense: 7508 is a year in the future!

I thought about how I could relate to the years 186, 697, ..., 872. However, after a quick investigation, I found that nothing notable happened in those years. Then I considered the meaning of to be “line”. Accordingly, I looked into International Date Line, but that was hopeless.

Then I noticed the negative symbol on the date. I quickly went back to my original idea of the clue string being a Unix timestamp. Unix epoch starts in 1970, and the negative symbol meant I had to work backwards. There are 3.154e+7 seconds in a year, so I calculated the year as such:

>>> ((1970*3.154e+7)-18697508872)/3.154e+7

It looked like I was getting somewhere! I googled 1377 korea and found And that was the answer.

Jikji is the abbreviated title of a Korean Buddhist document whose title can be translated to “Anthology of Great Buddhist Priests’ Zen Teachings”

Level 5

Channel topic:

Welcome to Level 05 of #ircpuzzles || Clue(s):

I visited the URL and was greeted by a funny meme:

Meme picture: It’s not DNS; There’s no way it’s DNS; It was DNS

Meme picture: It’s not DNS; There’s no way it’s DNS; It was DNS

Because of nightmares from some of the CTFs I’d played before, I attempted steganography on the image, but that turned up nothing.

I checked the page source:

<!DOCTYPE html>
<html lang=en>
        <title>this title is not a clue</title>
	<img src=dns.jpg alt="It's not DNS / There's no way it's DNS / It was DNS"/>

The title was demotivating. Then I thought of DNS. The usual place to put some text in DNS would be in the TXT record, so I queried it using dig:

$ dig TXT +short
"\232\161\140\227\129\143\230\152\165\227\130\132 / \233\179\165\229\149\188\227\129\141\233\173\154\227\129\174 / \231\155\174\227\129\175\230\179\170"

I was getting somewhere. I knew I needed to convert this into something readable, but I did not know how to. I tried to interpret the text as ASCII (with a modulo) and some ciphers; unfortunately, that didn’t work. After some searching, I found which was a table containing Unicode code points ↔ UTF8 Decimal Points mapping. I Ctrl + F’d for 232 161 140 and found:

U+884C    行    232 161 140

Beautiful! It looked like each byte was represented separately. Now I just needed to decode the rest of the message. I used an online converter and got:

行く春や / 鳥啼き魚の / 目は泪

I removed the / and translated 行く春や 鳥啼き魚の 目は泪. I got:

The eyes of the spring and the bird-growing fish are tears

It’s a Haiku by Matsuo Bashō, a Japanese poet/saint!

Spring departs.
Birds cry
Fishes’ eyes are filled with tears

I tried basho as the answer, and that worked!

Level 6

Channel topic:

Welcome to Level 06 of #ircpuzzles || Clue(s): || Hint(s):

The picture was of Wright Brothers as kids and a Male sign. The hint image was the cover of the “God of War - PS2” game.

Picture showing Wright brothers and a Male symbol

Picture showing Wright brothers and a Male symbol

I searched for Wright brothers + Male + war, god of war, and other combinations. I didn’t find anything useful. After some reading, I discovered a patent war involving the Wright Brothers. However, that wasn’t very useful either.

I went back to the clue string to see if I was missing something obvious. Sure enough, I was! I had assumed the third symbol was Male, but after reading, I found the following:

The symbol of the Roman god Mars (god of war) is often used to represent the male sex.

I quickly googled Wright Brothers Mars and found results about Ingenuity:

Ingenuity, the Mars Helicopter, has a tiny piece of the 1903 Wright Flyer on board.

ingenuity was the answer!

Level 7

Channel topic:

Welcome to Level 07 of #ircpuzzles || Clue(s): | where? || Hint(s): || License Information: MrAuralization “Relay” (adapted) CC-BY 3.0

The URL ( (archive link) was an audio file. The audio resembled morse (long and short sounds), but I was unable to make sense of it. I took a break and decided to revisit it later.

The next day, I listened to the audio again. The clue image said “two of them”:

Clue picture showing two cats

Clue picture showing two cats

I thought it meant that two of the consecutive sounds made up one character in the morse code. Upon listening carefully, I found that the audio resembled the sound of a clicky pen. The clue made sense — each character was represented by two sounds.

Manually decoding the sounds was going to be time-consuming and error-prone, so I decided to use the tool for the job: oh, the Audacity!

I opened up the audio file in Audacity:

Screenshot of audio in Audacity

Screenshot of audio in Audacity

For easier visualization, I changed the view to Spectrogram, set Split Stereo to Mono, and removed the second track. The spectrogram looked like this:

Screenshot of the spectrogram in Audacity

Screenshot of the spectrogram in Audacity

According to my theory, the dot was the two “lines” that appeared immediately next to each other, and the dash was the two “lines” that were slightly more distant:

Screenshot showing morse code overlay on audio

Screenshot showing morse code overlay on audio

It took me multiple listens to decode the audio to morse. Here was my first decoding:

.-- .... .- - .... .- - .... --. .. -.. .-- ... .. ..- --. .... .

I converted it to ASCII:


WHAT HATH was readable, but GIDWSIUGHE did not make sense. Googling the output did not help either. Perhaps I’d made an error while decoding the Morse.

Indeed, I was not accounting for the minor delays in between two dots. After fixing that error, I got the output:


In American morse, .. is an I and . . is an O. That was why my output did not make sense. Here’s an illustration that compares both versions:

Comparison of the previously incorrect output with the current one

Comparison of the previously incorrect output with the current one

I googled the phrase What hath God wrought and found I quickly learned this was the first Morse message transmitted to officially open the Baltimore–Washington telegraph line.

The answer was:


In retrospect, I could’ve found the solution by just googling what hath but there’s no fun in that!

Level 8

Channel topic:

Welcome to Level 08 of #ircpuzzles || Clue(s): | whodunit || Hint(s): meta

Clue image: space station from Interstellar

Clue image: space station from Interstellar

The clue image pointed to Interstellar. The other clue was whodunit:

“A whodunit or whodunnit (a colloquial elision of “Who [has] done it?”) is a complex plot-driven variety of detective fiction in which the puzzle regarding who committed the crime is the main focus.”

I thought it was about the creators of Interstellar. One possible answer to the question “who done it?” was Christopher Nolan, the director of the movie. I spent some time connecting Nolan and the image itself, but I came up empty.

Then I searched interstellar + whodunit and found an article on the NASA website with the title Hubble Solves Cosmic ‘Whodunit’ with Interstellar Forensics.

The article mentioned that the Hubble telescope was able to solve an age-old “whodunit” mystery related to dwarf galaxies. I was intrigued. That seemed like the right direction. Nevertheless, I was unable to make any progress with that.

I decided to check the EXIF data of the image. Haunted by the memories of my previous experience reversing an ExifTool RCE, I thought I’ll just check if the EXIF data has been tampered with:

exiftool image.jpg

The output was interesting! I found the following in the metadata:

GPS Altitude                    : 0 m Above Sea Level
GPS Date/Time                   : 1915:11:21 19:00:00Z
GPS Latitude                    : 68 deg 38' 30.00" S
GPS Longitude                   : 52 deg 58' 0.00" W
GPS Position                    : 68 deg 38' 30.00" S, 52 deg 58' 0.00" W

That seemed odd. I’d never seen the GPS Altitude field specified. GPS Date/Time field showed 21st November 1915. The GPS coordinates were provided in Degrees, Minutes, and Seconds format. Using an online converter, I converted 68 deg 38' 30.00" S 52 deg 58' 0.00" W to latitude and longitude:


I checked the location in Google Maps: it was in the middle of nowhere in the Chilean sea.

The coordinates on Google Maps

The coordinates on Google Maps

I backtracked a bit and checked to see the important events that happened in the year 1915. november 21 1915 chile also returned the same Wikipedia article.

Under November 21, 1915 (Sunday), I noticed the following:

The British polar exploration ship Endurance finally broke apart from the pressure of the ice pack around it and sank into the Weddell Sea, stranding the Imperial Trans-Antarctic Expedition party in the Antarctic.[99][100] The remains of Endurance, 10,000 feet (3,000 m) beneath the surface of the Weddell Sea, would not be rediscovered for more than 106 years, finally spotted in March 2022. [101]

That seemed interesting and appeared to be fairly connected to what I had. I opened the Endurance article and Ctrl F’d for 21 November: I found the following passage:

In the late afternoon of 21 November,[68] movement of the remaining wreckage was noticed as another pressure wave hit. Within the space of a minute, the stern of the Endurance was lifted clear of the ice as the floes moved together and then, as the pressure passed and they moved apart, the entire wreck fell into the ocean. The ice surrounding the spot where the Endurance had sunk immediately moved together again, obliterating any trace of the wreck. Worsley fixed the position as 68° 38.5’S 52° 58’W.[69]

FrankWorsley was the solution. From the Wikipedia article, I also learned that the wreckage of Endurance was found in the Weddell Sea, 3.5 nautical miles (6.4 km) south of Worsley’s original calculated location, on March 22, 2022.

Level 9

Channel Topic:

Welcome to Level 09 of #ircpuzzles || Clue(s): | || Hint(s): | How about some more

The clue image: a bunch of barcode-looking columns

The clue image: a bunch of barcode-looking columns

The clue image was confusing. I had no idea what it meant.

The second image was the picture of a cat in the White House:

Cat in the White House

Cat in the White House

The hint was the following image:

A bar with C code that runs printf(“A man walks into a bar…”)

A bar with C code that runs printf(“A man walks into a bar…”)

I tried scanning parts of the first image with Google Lens (which allows you to do reverse image searches), hoping to find flags of various countries. But that effort was in vain.

Then I opened up the image in GIMP, rearranged the different sections, did bucket fill with various colours, experimented with the opacity, etc., but nothing helped. I also checked for hidden data via steganography and inspected the EXIF metadata; however, I could not find anything.

I thought the takeaways from the cat picture could be “The United States”, “White House”, or just “cat”. The hint picture suggested a “bar” or “bar layout”. I tried arranging the different sections in the first image in a “bar layout”, but that didn’t help.

The flags in the Confederate States of America were called “stars and bars”, so I checked those flags to see if they’d match the ones in the first image; unfortunately, they did not. I also unsuccessfully explored other elaborations of BAR, such as Body of Lawyers.

Then it struck me: it was a bar code! But not a regular bar code. I checked Wikipedia for Bar code, and found that the first image is a Kartrak code.

In the Kartrak code, each bar has a special meaning. The decoded bar code looked like this:

Decoded Kartrak code

Decoded Kartrak code

Reading the Wikipedia article, I found:

The labels are to be read from bottom to top:

  • Line 13: check digit.
  • Line 12: stop label.
  • Lines 6 to 11: car number.
  • Lines 2 to 5: equipment owner code.
  • Line 1: start label.

Reading the first image bottom-to-top, I got:

0 -> privately owned
9 -> type of unit
0 -> suffix number
X -> unsure what this is
2 -> check digit

The 9th line was an empty bar; I did not know what that meant. Reading the Wikipedia article further, I found the following:

The first digit of the equipment owner (line 2) marks the type of equipment: 0 for railroad-owned, 1 for privately-owned, or 6 for non-revenue equipment.

The car number is left-padded with zeroes if necessary. For locomotives, line 6 is the type of unit and line 7 is the suffix number.

The check digit is calculated as follows: Each number digit is multiplied by two to the power of the labels’ position minus two. Thus, the first digit (line 2) is multiplied by 1, the second by 2, the third by 4, the fourth by 8 and so on, until the 10th, which is multiplied by 512. The sum of all these numbers modulo 11 is the check digit.[1]

I quickly realized the missing digit is not a space. It’s indeed a missing digit that we needed!

Assuming the missing digit was X, the sum of the digits as mentioned would be:

0*1 + 2*2 + 4*4 + 0*8 + 9*16 + 0*32 + 1*64 + x*128 + 3*256 + 1*512

I knew that the check digit was 2. Therefore,

(0*1 + 2*2 + 4*4 + 0*8 + 9*16 + 0*32 + 1*64 + x*128 + 3*256 + 1*512) % 11 = 2

Solving for X, I got 8 (the missing digit).

The last hint was suggesting a “date”. I wrote down the digits in order:


This was indeed a date in disguise:

24 09 1831

Googling September 24th, 1831 wikipedia gave me The article contained the following:

“1831 – The Mohawk and Hudson Railroad opens between Albany and Schenectady, New York.”

After trying a few potential candidates from as the answer, I noticed the following paragraph:

The DeWitt Clinton locomotive, built by the West Point Foundry in New York, made its first test run on July 2, 1831. After some hesitation, it was decided that the engine would burn wood rather than coal. The official opening took place on September 24, 1831, with approximately eighty politicians and dignitaries.

The answer was DeWittClinton. What a fun level!

Level 10

Channel topic:

Welcome to Level 10 of #ircpuzzles || Clue(s): || Hint(s): | coordinates | location, rotation, stringification | one codepoint per piece | ♘ < ♗ | ♙ < ♟ | hïñt

The clue image had a chessboard with multiple pieces:

Odd chessboard with pieces facing many directions

Odd chessboard with pieces facing many directions

Despite my love for chess, staring at the board for a while did not give me any ideas on how to solve this level. However, some of the pieces were oriented in two directions. Additionally, the kings were in adjacent squares, and the black pawn was on the first rank. This wasn’t a valid chess position.

Since the clue mentioned “coordinates”, I started thinking about coordinate chess notation. I didn’t get anywhere with that. Then I noticed there’s only A-F on the board instead of the usual A-H. I thought it was a subtle hint at “hexadecimal”; that led me to 0x88 board representation: Still, I couldn’t make much out of this.

The clue about one codepoint per piece seemed to suggest something about UTF8 codepoints, but without decoding the board itself, I felt that hint was useless.

I set up the pieces in a board editor and created the FEN notation (it is the standard notation to describe positions of a chess game) disregarding the fact that pieces were rotated. However, after staring at an incorrect position, I felt lost. This was absurd!

I found the coordinates of the pieces:

E8 F8 B7 D6 E6 D4 E4 F4 B3 E2 F2 D1

I converted them to hex and then Unicode, but got alien-speakèø·ÖæÔäôô³. Then, I remembered that I hadn’t used the first hint, a picture of Battleship:

Battleship game cover image

Battleship game cover image

Since the general theme of this year was history, I thought maybe it was hinting at a historic battle between two kings? I felt like I was grasping at straws.

Hint ♘ < ♗ could mean that knights are less valuable than bishops. I found's_system to support this idea. The next hint was ♙ < ♟, which could’ve similarly meant that black pawns were less valuable than white pawns. However, that isn’t true in normal chess: both pieces are equally valued. My hypothesis seemed to be incorrect.

I also explored another tangent: Bobby Fischer is a player who was usually able to exploit the strengths of the bishop against the knight. He’s also had a good history of winning with black pieces, but since that did not link well with other clues, I ruled that path out.

Then I labelled the pieces with their coordinates to see if that would help:

Chess board annotated with coordinates

Chess board annotated with coordinates

Following my logic above, I interpreted ♘ < ♗ to mean that black knights came before white bishops (before-rotation coordinates first). Same with ♙ < ♟ — black pawns before white pawns, working upwards from A1.

I got something like:

D1 F2 B3 B7 F8 E8 6D 4D 6E 4E 2E 4F

After reaching nowhere with that idea, I started to think about Unicode. I discovered there are Unicode characters for rotated chess pieces as well. I checked the values in multiple encodings such as UTF-8m UTF-16BEm UTF-32BE, UTF-32LE, HTML code, CSS code, etc., but in all of them, the value of Bishop was lower than Knight.

I searched a lot; yet, I could not find an ordering system involving chess pieces. The closest match I found was that knighthood is given by church folks like the Pope (Bishop is another similar one). That seemed like a stretch. The Periodic table had B < N, too.

After a while of head-scratching, I realized maybe I did not have to find an ordering system, but order pieces in that order.

I found the corresponding Unicode codepoints for the all the relevant chess symbols from a Unicode chart online:



These were the pieces from the board (along with their coordinates that I found earlier):

B3 - 2659 ♙ WHITE CHESS PAWN - 


Looking at this, I realized maybe I did not need to think about the colour of the bishops. Maybe the clue meant any knight is less valuable than any bishop, and white before black, just to hint at the order.

I listed them in the following order: Pawn, Knight, Bishop, Rook, Queen, King. White pieces were listed first and knights were listed before bishops. I got:


Then I converted them to hex and then Unicode:

>>> print(u"\xB3\x4D\xE8\x6E\x2E\x4F\xD1\xB7\x6D\xF8\xF2\x4E")

“3 men on moon”. Finally, a readable output!

Shortly after, I found Apollo 11, the American spaceflight that first landed humans on the Moon. apollo11 was the answer! That was an intriguing puzzle.

Level 11

Channel topic:

Welcome to Level 11 of #ircpuzzles || Clue(s): | 名

There weren’t any hints and that was relieving — I hoped that meant this level wasn’t as difficult as the previous one.

Puzzle-looking grid

Puzzle-looking grid

This looked like a Nonogram puzzle ( is Japanese for “name”. Maybe I needed to find the name of whatever the first image turned out to be.

I solved the Nonogram using an online tool:

Solution to the Nonogram puzzle

Solution to the Nonogram puzzle

It resembled a QR code in some ways, but I was unable to scan it. After pondering a while, I remembered there were different types of Bar codes (from level 9’s Wikipedia reading).

I found Aztec code to be somewhat similar to the image output I had, but that was not accepted as the answer. After scrolling down the Wikipedia page, I found Han Xin code, which was a strong match with my output!

Indeed, the answer was hanxin.

Level 12

Channel topic:

Welcome to Level 12 of #ircpuzzles || Clue(s): || Hint(s):

This was the clue image:

White swan flying onto water

White swan flying onto water

The first thing I noticed was something opaque within the swan image. It looked like a fighter jet. To make the number on the jet clearer, I opened the image in GIMP and played with the colour settings, brightness, etc. It looked like 5082, 5092, or 6062. After googling the numbers, I reached, but that did not look like the jet in the picture.

From reverse-image searching, I found the original swan image. I opened the original and the modified images in GIMP, and used layer subtraction to see the difference in two images. That gave a much clearer result:

GIMP showing difference of two layers

GIMP showing difference of two layers

Searching 6062 (from the plane rubber) gave me, and the image on Wikipedia was an exact match!

Wikipedia image of X-1 Jet

Wikipedia image of X-1 Jet

Now I needed to find some connection between Bell-X1 and the swan. I found that there’s a replica of Bell X1 at a restaurant in Los Angeles with Bird in its name, but that was not very useful.

From a reverse image search, I noticed the swan was a Mute Swan, a different swan species. I tried many searches with mute + bell x1, mute supersonic, mute + mach3 (since Bell X1 was the first to cross Mach 3 speed), etc.

Then I learned that swans are of the genus “Cygnus”. I tried a couple more searches such as cygnus bell x1 and cygnus x1. The latter yielded

CygnusX1 was the answer!

Cygnus X-1 is a galactic X-ray source in the constellation Cygnus and was the first such source widely accepted to be a black hole.

Later, I found out that the EXIF data for the swan image contained a UUID (0d0f04a0-c0b8-447b-8a37-b1536da5b8f1) that was

Level 13

Channel topic:

Welcome to Level 13 of #ircpuzzles || Clue(s): | le chiffrage indéchiffrable

I opened the URL and saw the following:

“Popular Word Game” webpage that looks like a Wordle clone

“Popular Word Game” webpage that looks like a Wordle clone

A word game? I liked playing Wordle, so I was excited!

The gameplay appeared to be similar to Wordle, but I had to guess 2 words at once, and instead of 5 letter words, there were 9 letter words:

Word guesses on the webpage, laid out side by side

Word guesses on the webpage, laid out side by side

Furthermore, the words changed every game.

After a couple of attempts, I was able to guess a word on the left with regular Wordle gameplay. But no matter how many times I played, I was not able to guess the word on the right.

The clue string had le chiffrage indéchiffrable — this is a French phrase meaning “the indecipherable cipher”. The Vigenère cipher was thought to be unbreakable until late in the 19th century. It seemed like the clue string was hinting at the Vigenère cipher.

I started thinking about how to apply the Vigenère cipher in this context.

I knew that:

vigenere_encode(plaintext, secret_key) = ciphertext

Assuming they used a unique secret_key on the backend to generate the word on the right:

vigenere_encode(first_word, secret_key) = second_word
vigenere_decode(second_word, secret_key) = first_word

But I did not know the secret_key they used. However, in a Vigenère cipher, the ciphertext is calculated by adding the n-th letter of the plaintext and the key, modulo 26 (for the English alphabet). In mathematical terms, it can be represented as below:

Cn = Pn + Kn mod 26

To decrypt the message, the key is subtracted from the plaintext:

Pn = Cn - Kn mod 26

Conversely, if we know Pn and Cn, we can solve for Kn, and get the following:

Kn = Cn - Pn mod 26

This translates to:

vigenere_decode(first_word, second_word) = secret_key

This meant I needed the first word and the second word to obtain the secret key. I was able to find the first word in a few attempts, but the second word appeared to be a random sequence of characters instead of a word, so guessing it wasn’t as straightforward.

Then, I automated the process. First, I built a wordlist of 9-letter words. Later, I wrote a script to solve the 9-wordle: given the current state of the game, the script would find the next optimal guess. This was to help me solve the current first word. Afterwards, the script would find the optimal guesses for finding the second word.

At last, I got a solution:

The correct guesses on the webpage

The correct guesses on the webpage

My first word was DECLINING and my second word was RQZHRAAUI. Do note that when I originally solved the challenge, the process of guessing the second word took more steps than depicted above.

I had a pair of words. To find the secret key, all I needed to do was to do vigenere_decode(first_word, second_word):

>>> vigenere_decode('DECLINING', 'RQZHRAAUI')

That was correct!

Level 14

Channel topic:

Welcome to Level 14 of #ircpuzzles || Clue(s): || Hint(s): 😐😶😮😶😮😐😶😮😮 |

I opened the clue URL and found the following:


It was a bunch of faces! It did not make any sense to me. The hint was another set of emojis, which did not help either.

I tried searching for the hint string (😐😶😮😶😮😐😶😮😮) in the clue string, but the full hint string was not a substring of the clue string. Then, I tried replacing each emoji with another character to see if a pattern would emerge — it didn’t.

I noticed the emojis had dots and dashes — that made me think of Morse code. I tried to decode it as Morse, but that gave me gibberish. My next thought was Braille. Unfortunately, that idea did not pan out either.

Next, I attempted to fold the clue string into different widths. I obtained the list of divisors for 252 (the total number of emojis) to find all the possible ways I could evenly wrap the text. For instance, this is an 18x14 grid:


However, I did not notice any patterns in any of these layouts.

Then I took a screenshot of the emojis and opened it in GIMP to see if I could construct connections between similar emojis. However, I found nothing.

I decided to do some frequency analysis on the clue/hint strings. I found the bigrams:

Bigrams - Clue

    ('😶', '😮'): 60,
    ('😮', '😮'): 53,
    ('😮', '😐'): 45,
    ('😐', '😶'): 35,
    ('😮', '😶'): 26,
    ('😐', '😐'): 12,
    ('😐', '😮'): 11,
    ('😶', '😶'): 8,
    ('😶', '😐'): 1

Bigrams - Hint

    ('😶', '😮'): 3, 
    ('😐', '😶'): 2, 
    ('😮', '😶'): 1, 
    ('😮', '😐'): 1, 
    ('😮', '😮'): 1

Trigrams - Clue

    ('😶', '😮', '😮'): 37,
    ('😐', '😶', '😮'): 32,
    ('😮', '😐', '😶'): 27,
    ('😮', '😮', '😐'): 25,
    ('😮', '😶', '😮'): 24,
    ('😶', '😮', '😐'): 19,
    ('😮', '😮', '😮'): 14,
    ('😮', '😮', '😶'): 14,
    ('😮', '😐', '😐'): 9,
    ('😮', '😐', '😮'): 9,
    ('😐', '😮', '😶'): 9,
    ('😐', '😐', '😶'): 8,
    ('😶', '😶', '😶'): 4,
    ('😶', '😶', '😮'): 4,
    ('😶', '😮', '😶'): 3,
    ('😐', '😶', '😶'): 3,
    ('😐', '😐', '😐'): 2,
    ('😐', '😐', '😮'): 2,
    ('😐', '😮', '😮'): 2,
    ('😮', '😶', '😶'): 1,
    ('😮', '😶', '😐'): 1,
    ('😶', '😐', '😐'): 1

Trigrams - Hint

    ('😐', '😶', '😮'): 2,
    ('😶', '😮', '😶'): 1,
    ('😮', '😶', '😮'): 1,
    ('😶', '😮', '😐'): 1,
    ('😮', '😐', '😶'): 1,
    ('😶', '😮', '😮'): 1

Some observations I made:

  • (😮, 😐) repeated more than others in the clue string, but that didn’t suggest much.
  • There were many repeating trigrams in the clue string with high-frequency counts. It could have meant it was some sort of monoalphabetic substitution cipher.
  • All the trigrams in the hint also appeared in the clue string.

After some research, I found an esoteric language called unicat, that’s made of cat emojis. I tried converting these emojis to their cat emoji equivalents and tried to evaluate it as a unicat — however, that wasn’t useful.

It started to feel like these faces were laughing at my futile attempts to decode them.

I decided to concentrate more on the hint. There were 9 emojis, and they served a purpose. I needed to find out what they meant.

While zooming in on the GIMP image I was playing around with earlier, I noticed each emoji had a horizontal line in it (the mouth) and 2-3 black circles (eyes, mouth). It was a stretch, but the 1s and 0s resembled binary.

I tried replacing the hint string in the following manner: 😐 => 1; 😶 => space; 😮 => 0… and received the output: 1 0 01 00. That did not seem particularly helpful.

I tried another variation: 😮 => 1; 😶 => space; 😐 => 0. To my surprise, that gave me 0 1 10 11 as the output. I had found the right way to decode the emojis — they’re counting from 0 to 3 in binary!

I did the same operation on the clue string and got the following output:

100 100 110 1 111 11 
  101 0000 110 110 11
0 101 111 10 110 100 
  110 110 111 10 110 
1001 1101 1111 111 10
0   110 1011 110 101 
110 1001 110 1110 110
 101 110 1110   100 1
11 111 101 111 10 110
 1011 110 101 110 111
0 111 11 110 1 110 11
00 110 1 111 100 10 1

I noticed there were as many as 3 consecutive spaces in the output. I wasn’t sure if that was relevant. I converted the binary values to their decimal equivalents:

4 4 6 1 7 3 
5 0 6 6 3 
0 5 7 2 6 4 
6 6 7 2 6 
9 13 15 7 2 
0 6 11 6 5 
6 9 6 14 6 
5 6 14 4 1 
3 7 5 7 2 6 
11 6 5 6 7 
0 7 3 6 1 6 3 
0 6 1 7 4 2 1 

Without the newlines and spaces, I had 446173 5066657264 667269df74 6b65696e656e 4775726b656e73616c617421. The numbers did not make much sense. I couldn’t notice a pattern here. After a while, I fruitlessly tried to decode them as A1Z26 cipher (A=1, B=2, …, Z=26). My next attempt was to decode them as hex (A=1, F=15). I got the following:


After trying out a few different ways to decode it, I figured it out — I had to decode them as ASCII:

for a in re.findall(r'..', '4461735066657264667269df746b65696e656e4775726b656e73616c617421'):
    print(chr(int(a, 16)), end='')

I received the following output:


Finally, a readable output! I was relieved. I googled the string and arrived at

The Reis telephone was an invention by Johann Philipp Reis, a German scientist. It is considered by many today as the first telephone, which predates Alexander Graham Bell’s telephone. The actual credit for the telephone’s invention is a subject of great dispute to this day.

reistelephone was accepted! That took forever — the phone line with the answer must’ve been slow!

Level 15

Channel Topic:

Welcome to Level 15 of #ircpuzzles || Clue(s):

Another file! I quickly downloaded the file and ran file -k:

$ file -k pcap capture file, microsecond ts (little-endian) - version 2.4 (Ethernet, capture length 262144)\012- data

It was a network capture file! As part of my routine, I ran strings just to be sure — but there was no output. I opened the PCAP file in Wireshark:

Wireshark of the PCAP, showing a single TCP packet

Wireshark of the PCAP, showing a single TCP packet

There was only a single TCP packet. The TCP payload was not readable either, and nothing else stood out to me.

Maybe I needed to do some data mangling to make it readable. I wrote the following snippet to open the packet capture file using the scapy library:

from scapy.all import *
packets = rdpcap('')

The output looked like this:


I then decoded the binary data:


A flag! That was unexpected. It was ironic that I hadn’t completed the level despite having the flag.

I read up on the history of the checkered flag, but that did not lead anywhere. I was missing something. I inspected the packet again.

While checking the attributes, I noticed the sequence number:

Wireshark of the PCAP, highlighting the sequence number

Wireshark of the PCAP, highlighting the sequence number

That looked like a date! 19830101 was January 1st, 1983.

I googled January 1st, 1983 + flag and found

On January 1, 1983, also known as flag day, NCP on the ARPANET was replaced by the TCP/IP protocols, marking the start of the modern Internet.

flagday was the answer!

Level 16

Channel topic:

Welcome to Level 16 of #ircpuzzles || Clue(s): | Hint(s): protons

The clue image was:

Clue image showing 9 chemistry molecules

Clue image showing 9 chemistry molecules

Chemistry was not my favourite subject back in school. But I knew this resembled molecules. There were atoms… that’s all I could understand. I started reverse searching the molecular structures one by one on Google, but except for the last one, I could not find any hits.

I discovered there were websites like PubChem that allowed me to search for molecules by drawing their structure using a web interface. I spent some time scribbling using the online tool, but I was unsuccessful. That made me believe that some of the structures may not have been valid.

I was completely clueless about how to proceed with this level — I felt like I was stuck in school again. We used to write the given problem information in Chemistry class, so I decided to list all the information I could gather.

I found that atoms are assigned colours in molecular models:

Wikipedia table of atoms and their assigned colours

Wikipedia table of atoms and their assigned colours

Carbon did not use Black, but the rest were as per the table on Wikipedia:

  • Carbon = Gray
  • Chlorine = Green
  • Hydrogen = White
  • Nitrogen = Blue
  • Oxygen = Red
  • Phosphorous = Orange
  • Sulphur = Yellow

Based on this colour coding, I started writing down what the molecular compounds would be named. They did not have to be correct. At this point, I was just writing down the information I had. It looked something like:

Compound names attempted on the clue image

Compound names attempted on the clue image

Then I remembered that I hadn’t thought much about the hint — “protons”. I knew Hydrogen is also called proton. And Hydrogen appeared to be present in all the molecules shown. It felt to me as if I should focus on Hydrogen. As per this year’s theme, I started looking into Hydrogen’s history, but that was in vain.

I tried counting the number of hydrogen atoms on each molecule, like so:

5H 4H 7H 4H 6H 3H 8H 8H 2H

And then I futilely tried to interpret the above as hours, dates, hex, ASCII, etc. I created a 3x3 grid (since there were 9 molecules) containing the chemical symbols and atomic numbers of each atom, but that did not pan out either.

Proton also meant “first” in Greek, and I tried taking the first letters of all the elements and solving them as an anagram; however, that was not very helpful. I was missing something crucial.

The protons hint could also mean “atomic number” (since the atomic number is the number of protons in an atom). I decided to write down the atomic numbers of all the elements in each of the molecules. I also summed all the atomic numbers in each molecule.

Sums on the clue image

Sums on the clue image

I got something like the above. The atomic sums were:

[95, 42, 28, 33, 39, 7, 90, 99, 53, 16] 

I tried converting them to 1-26 alphabet mapping, and I got:


That seemed like it could’ve been ROT-N encoded, so I tried decoding it as ROT-N. That didn’t help.

Then I noticed all the numbers were less than 112, which is the highest atomic number.

I took the element corresponding to each atomic number in the list above, and got the following:

americium molybdenum nickel arsenic yttrium nitrogen thorium einsteinium iodine sulfur

The first letters of each of these elements yielded:


That meant nothing.

Then I had another idea to interpret the numbers as years:

  • 1995
  • 1942
  • 1916

I started looking up who won the Nobel for chemistry in these years, but quickly noticed there was no Nobel awarded for Chemistry in 1916, so this was the wrong path.

After pondering a while, I realized I may have missed something. When I took the first letters of the elements, I could have instead taken the chemical symbols ( Americanum = Am, Molybdenum = Mo, Nitrogen = N, and so on). I did that:

pt = requests.get('').json()
print(''.join([pt[elements[x-1]]['symbol'] for x in atomic_sums]))

The output was:


That worked! What a satisfying challenge — maybe Chemistry class was useful after all.

Level 17

Channel topic:

Welcome to Level 17 of #ircpuzzles || Clue(s):

Picture of the grid that looks like yet another nonogram puzzle

Picture of the grid that looks like yet another nonogram puzzle

It was another nonogram! I solved it using an online nonogram solver and got the following output:

Solved nonogram

Solved nonogram

It read: YOU WON CHAAYC. What in the history was CHAAYC?!

I was bored and did not have any ideas, so I took the orphaned pieces and tried to construct a word (similar to how jigsaw pieces are assembled):

CHAAYC in a grid

CHAAYC in a grid

I also cut out pieces of paper in the shapes of these letters to see if I could make a word that made sense. However as there were so many possible ways to do it, that couldn’t have been the way to do it.

After a while, I decided to recheck my nonogram. I found I had some numbers incorrect. I redid it and got the following output:

Another nonogram solution

Another nonogram solution

This time it read:


I wasn’t sure about the R. I thought about it for a long time but did not have any new ideas. I thought maybe the word CHMMYR is encoded in a certain fashion. I tried ROT-13 first. To my surprise, the output was readable!



I quickly typed /join #ircpuzzles-2022-afpc-18 puzzle. I was in!

The channel topic read:

Welcome to the winner’s circle!

I had won! My IRCPuzzles journey was over. Kudos to the IRCPuzzles team for organizing the whole event, and coming up with thoughtful puzzles.

I would like to thank @KarimPwnz for proofreading the blog post and offering helpful suggestions prior to publication.