{"id":20425309,"url":"https://github.com/catseye/etcha","last_synced_at":"2026-07-03T07:32:44.589Z","repository":{"id":3601935,"uuid":"4666404","full_name":"catseye/Etcha","owner":"catseye","description":"MIRROR of https://codeberg.org/catseye/Etcha : A BitChanger-like esolang where the tape head is a turtle","archived":false,"fork":false,"pushed_at":"2023-10-25T12:45:19.000Z","size":80,"stargazers_count":1,"open_issues_count":1,"forks_count":0,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-03-05T04:45:03.843Z","etag":null,"topics":["esolang","esoteric-language","esoteric-programming-language","turtle-graphics"],"latest_commit_sha":null,"homepage":"https://catseye.tc/node/Etcha","language":"JavaScript","has_issues":false,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"unlicense","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/catseye.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2012-06-14T17:40:47.000Z","updated_at":"2023-10-24T18:53:46.000Z","dependencies_parsed_at":"2025-01-15T15:08:49.768Z","dependency_job_id":"553f5092-5d2b-460e-8e98-66cb0f906b03","html_url":"https://github.com/catseye/Etcha","commit_stats":null,"previous_names":[],"tags_count":8,"template":false,"template_full_name":null,"purl":"pkg:github/catseye/Etcha","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/catseye%2FEtcha","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/catseye%2FEtcha/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/catseye%2FEtcha/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/catseye%2FEtcha/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/catseye","download_url":"https://codeload.github.com/catseye/Etcha/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/catseye%2FEtcha/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35077505,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-07-03T02:00:05.635Z","response_time":110,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["esolang","esoteric-language","esoteric-programming-language","turtle-graphics"],"created_at":"2024-11-15T07:12:51.444Z","updated_at":"2026-07-03T07:32:44.571Z","avatar_url":"https://github.com/catseye.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"The Etcha Programming Language\n==============================\n\n_Try it online_ [@ catseye.tc](https://catseye.tc/installation/Etcha)\n| _Wiki entry_ [@ esolangs.org](https://esolangs.org/wiki/Etcha)\n| _See also:_ [Whothm](https://codeberg.org/catseye/Whothm#the-whothm-drawing-language)\n∘ [Wunnel](https://codeberg.org/catseye/Wunnel#wunnel)\n∘ [Gemooy](https://codeberg.org/catseye/Gemooy#gemooy)\n\n- - - -\n\nIntroduction\n------------\n\nEtcha is an esoteric programming language based on Jeffry Johnston's\n[BitChanger](http://www.esolangs.org/wiki/BitChanger). Like BitChanger,\nEtcha has four instructions, two of which are used to form\nBrainfuck-like while-loops. Unlike BitChanger, Etcha has a 2-dimensional\nstorage model based on turtle graphics, which permits it to be\nimmediately used for an alternative purpose: graphical composition.\nUnlike a classical turtle in a language such as LOGO however, the turtle\nin Etcha is an integral part of the computation, playing a role similar\nto the tape head of a Turing machine.\n\nInstructions\n------------\n\n-   `+` -- equivalent to FD 1\n-   `\u003e` -- equivalent to RT 90; toggles PU/PD every 4 executions\n-   `[` -- equivalent to While\n-   `]` -- equivalent to Wend\n\nIn Etcha, instructions control a turtle. The turtle exists vis-a-vis an\nunbounded Cartesian grid called the playfield. The turtle has a position\nin that it occupies exactly one of the points on the playfield (which\nare referred to as pixels). Each pixel has a state, which is either\nblack or white; all pixels are initially black.\n\nThe turtle also has an orientation which describes the direction it\nwould move in should it travel forward. Unlike a conventional turtle,\nbecause of its Cartesian context, there are only four possible\norientations which the Etcha turtle can possess: north, east, south, and\nwest, corresponding to headings of 0, 90, 180, and 270 degrees. When an\nEtcha program starts, the turtle is initially oriented north. Because\nposition is relative, it doesn't matter where the turtle is initially\nlocated, but solely for psychological satisfaction we can say that it is\ninitially situated in the very center of this unbounded Cartesian grid.\n\nThe turtle is also equipped with a pen, which has a pen mode and a pen\nposition. The pen mode is always XOR, meaning that when moving forward\nby execution of `+`, the state of the pixel that was previously occupied\nby the turtle gets inverted (from black to white, or vice versa.) The\npen position may be up or down. It is initially down. Every fourth time\nan `\u003e` instruction is executed, the pen's position is toggled from up to\ndown or vice versa. These executions need not be consecutive; there may\nbe any number of intervening instructions executed.\n\nExamples\n--------\n\n    -\u003e Tests for functionality \"Interpret Etcha Program\"\n\n    -\u003e Functionality \"Interpret Etcha Program\" is implemented by shell\n    -\u003e command \"java -cp bin tc.catseye.etcha.Main %(test-body-file)\"\n\n    | \u003e+++\u003e+++\u003e+++\u003e+++\u003e[+]\u003e\u003e\u003e\u003e+\n    = ----\n    = #####\n    =    # \n    =    # \n    =  ### \n    = ----\n\nComputational Class\n-------------------\n\nEtcha is Turing-complete if BitChanger is, because we can easily\ntranslate any BitChanger program into an equivalent Etcha program. Let\nthe Etcha program begin with `\u003e\u003e\u003e\u003e`, to initially lift the pen. The\nBitChanger instruction `\u003c` is translated to the Etcha instructions\n`\u003e\u003e\u003e+\u003e\u003e\u003e\u003e\u003e`, and the BitChanger instruction `}` is translated to\n`\u003e\u003e\u003e\u003e\u003e+\u003e\u003e\u003e`. The instructions `[` and `]` remain the same. The relation\nbetween the BitChanger tape state and the Etcha playfield is quite\nliteral; the y dimension of the grid is simply ignored.\n\nImplementation\n--------------\n\nIn a particular implementation of Etcha on a microcomputer with a finite\nstorage, the playfield cannot be truly unbounded, and there will come a\npoint in a long enough program execution, entirely dependent on the\ncapabilities of the hardware and the implementation, where a pixel\nchange cannot be correctly stored. The behaviour after this point is\nundefined. *Such (m)icro(c)omputer implementations of Etcha may be\nmarketed under the name \"MC Etcha\"*.\n\nCat's Eye Technologies provides an implementation of Etcha written in\nthe Java[TM] programming language. This implementation attempts to\ndemonstrate that the Model-View-Controller design pattern can be applied\nnot only to user interfaces, but also to programming language\ninterpreters. The Model is the state of the program (which is also the\nstate of the Turtle graphics engine.) The View is the interpreter's\ninterpretation of that state, and the Controller is the interpreter's\nbehaviour with respect to the View. For example, the Model exposes the\npen up/down semantics, but it is the Controller that implements the rule\nthat `\u003e\u003e\u003e\u003e` toggles the pen position.\n\nCat's Eye Technologies' ridiculously over-engineered implementation of\nEtcha is in the public domain.\n\nHappy Etchin'!  \nChris Pressey  \nOctober 4th, 2009  \nMold City, USA\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcatseye%2Fetcha","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcatseye%2Fetcha","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcatseye%2Fetcha/lists"}