# 50. bash, 1024 bytes #16 "(}23!@)" 3//v\D(@;'[af2.qc]GkGGZ'#)"14";n4 #/*` "[!PPP(22)SP(>7 7*,;68*,@;'1,@ ␉␉␉␉ q #>␉ # >36!@␉ #`<` #<]+<[.>-]>[ #{ #z} # #=<xR+++++[D>+++++++L+++<-][pPLEASE,2<-#2DO,2SUB#1<-#52PLEASE,2SUB#2<-#32DOREADOUT,2DOGIVEUPDOiiipsddsdoh@O6O4/]>+.-- -. >][ #Rx%>~~~+ +~*ttt*.x #D>xU/-<+++L #R+.----\).>]| #[#[/v/v(/0l0v01k1kx0l0ix0jor0h0h1d111x0eU0bx0b0o1d0b0e0e00m1d0i0fx0g0n0n11x0o0n0cx0c0o0f0c0gx0g0f0h0j0j0i0001k10vx0v0l111111^_) 0046(8+9+9+9+9+=!) ###| '\';echo 50;exit;';print((eval("1\x2f2")and(9)or(13))-(0and 4)^1<<(65)>>(62))or"'x"or'({({1})({1}[(0)])}{1}\{1})'#}#(prin 45)(bye)|/=1/24=x<$+@+-@@@@=>+<@@@=>+<?#d>+.--./ __DATA__=1#"'x"// #.\."12"__*' ###;console.log 39 """"#// =begin // #ssseemeePaeueewuuweeeeeeeeeeCisajjapppp/*/ #define z sizeof'c'-1?"38":"37" #include<stdio.h> main( )/*/ #()`#`\'*/{puts(z );}/*'`` <>{# }// #} disp 49#// #{ 1}<>// $'main'// #-3o4o#$$$ #< >"3"O. =end #// """#"#// #} #|o51~nJ;#:p'34'\ #ss8␛dggi2␛ `|1|6$//''25 =#print(17)#>27.say#]#print(47)#]#echo 21#ss*///nd^_^_Z222999"26 Want to learn more? Try the [polygot chat](http://chat.stackexchange.com/rooms/55553/polyglot-development)! [Try them online!](https://tio.run/nexus/bash#zVpJc9tIlj43/kJd0iDLBEgCIKnFCwlasi3XqDZrLNkVYZKWQDBJwsJWWCRKMhVznYk59L0vc@z/0df5Ff1Har6XCS7aXFWHjhg6CCYyX749X7735N9K9GEHkX8x8aOMZTzN2CjxznhispcXbMfx0q3WhqIIqCQa5a4XTlg25cwL4zxjY8/nqeI6GeuyuMBi0oCVWMKdkQRTxlHCaAsLTn3mMTeO2dB3pqbLfE/AplFA6xlP4oTjmbKQ8xFLY@56Y88VdBifZTxMvShMTea5p@zc83024j42rIi7dSBjebo2JUmZyihSGD5ufIvV5VuZAybkC3F57CRC3IjFQvaF1OeJE8dgUimxQzCeeQFPmZdVUsad1CMdYkvKw5HQVLzUbsSccF1KduY5zAG/eSJwpzzJIJ4p8LIpTzhQOkR8kjgB084TL4MKSJG77IA7CTtKONdBBQbgqevE4OMGSRCLiEJGgpjCUJ1OZe/tmwoMJneYTpwppWTj6N@/Vxxm2qx83MbXVtW2svfza3ZV7tMYXAAZjBonmqMz@5qlVr/P8Z01h9YkmSvAqkArPrOiOLOA2UkysLcaGWctM/bXyLLOLUusOZGEGsEWbD9kH@pCLjdPEg4uVip1TiGyH4UTaBOiJnlI2gjZdgMGcKNwlNYZP4POolBaKDoX@j2aejBZSgZxhlCP45Lm5QEQ6sQRgOcV@lzQTSM/F3DYmWbkftAJthLG/TH7wMaO59MWrBMqyXXC09zPaE8ejsjugRfykckWbLjRiICC6AzkHCAVEzgzwdpJE0wBGGaIhKi09M@//m00mQDPrutGyahw1g9sFLl5AIYdwawDRyR3jULHF2wBrk7U5XYQOHN8b@RkRD68KEgIJgTV8yj3RywCweTcw8GaOmc4jOMxdzMuXTzKM/BYZ4FzKuODJ/0WggfOEIYVBARtIbbBdl7BSi6XDmMEeTZ@yox4j1VS65P24rn24lGfgzfd1Ktly5q04W1mVUzhrfI1x/mwu7Inec@RF9Ep8uNpjpiBlTCNEU0SUqbrQJyUgkqGmFdnQ6FoEYng6OKInvNKwtkQ53ohmPAR6QO036BzW2BY2XQBd9PF@GjNw@CdcLIsvRMk/OgchAVvFDjh0yERdyYOSGWFQLtSIElRzNwU7TSEpxO2IWdPjaEH65AfINQUxliTEeAbLQkDbNJ6a4cicC6AxZUhemVJ5o1h5AB@m1wwl9NhwKngMs4RkVw4RurBj6Ixaxitra3fMX6WWLvGR8sxLq2v2piEv2XmXTbm58x3wknuTODIUYgtjuvyOCtOECRJM5yR22FQTBpFTDfTqVLeuU1bxLYi2q/RoOgjrVdEaIfcHooKoGrDxylnTjIRJ5GNvATnxb@4TR0AZ7eIqycEcoOBE/UBFhYXE5yMz7ibZzhucOTzqedO4bvEXSgPrIyOt8ljap06Qo4xXpImZprdxy3FtJZTxMaDKAyy6F08iPqEqntjQhh/fUIKiJv3kG59hKrFNStOwTIVWMoOZXxPl0jCf82hXPieNwkJxAmXV/RaFPPSsIKw7qUeNESXLfnl0f5bit2/cJlvQEfy3lkPvBGyD2wvLlNaWChM4e40YkbIKgUPmiruvs9gy0oTVwyMtQtf1U1oSyOtiaUFos8yh7p9@bHuXThBslJnPVUd1HHf@CnMHea@j5c8FMdB4/oV/MLlaWrCuXEGTcocwJ1a4/r8JmA2TaJzxud6u3IfuT9pkFf50Jv9P7SIS3zJJ6RaM4OY@iN2uAP4LzbEHXowxX6IWwbx91JcByGFtzzIfSeTGYEb5dDz0hy4Ghy7IS14BB39iCyJ/ejR5TVGTrXKtUV6PqOssq@o8UU2jcKNm@FHXa20ZHr3wQpwG5nxxf0Xr7qOSmz4yQtPI@LNChaj44bZ3LqBAuXB3Z1jL52Kxw3QO2zdXRG702A4Fo97AEJyxVseLxaCKIwkcWjICx3rnfgxEWLv4@BmJLtB/iWHjSfceLZhDb3QGvLxQ5BvXr7cFzDj4dB7CAhqoAJo8XsPWJIP79MSEpjpnZuO3dDzUZ5kvjGyMvrl//sfI@j7rjWmzkWKlPd0OTgO@TlZxhg/aJxiK72Ix/2G/Jz7KId@B4frUJrr@MvB/bies3cc3o6EJBRVEDj1fRxkqAwB5q474yT4@Ygvfu9HKnR488KUu0MvMODL22ZDGBCvlARQKvYQllu3vkRD1UHiR87IkvWax1cWlbrnM2cShRfW2pViJsM/wOriYmarAi2b5lkun1SV/Z7tvJi@XzuCBWRja/dlc6/4eQAeTGw/5Lvy2CSILsYb3zm1hjQ8HmN4v6hSmMSboARc/D4E9sth7LjcOk/p5163@QnplI/C@vDn94cHX/UfgRB5VuLL573o9kMXl1qY/T4mSOmLx59xPOEHruPD@zak71FfxFhTk3dLsb4zvKBCfvrnfYioTmo1ZkSramXVdonjhze57v2bZGNG7HMj1JP8924dXB1eAHFbo7Xhgz7hRcaqJkqlI42pCLwn9jhnDjNc30nhGlmhXX4Ga4jH11yVbgiXfGY1@pqj3mJqUZc@VNqsdsaeG@H2joWZ6cXHy0OX2u3sYYWGGm7isdpKb4W/vubOiK7a6686bORmVFE84DJ3pkUG8k50ZpalUlovGkqY85KigZAue3Sl1SoLnUAUkDReJDdtWaWmU9GaQDU5Qqx9H3oiuXSjRNZasqAX99o//j4qOjYTjpI78FLkUZOQeowoqKbR@QtJt6C@G8cOdXwIB063L9NP49UuS8@9zJ3KRg3ytfdvjp4WVXbR78TLAQXZNS6k3Fgagwcn46IglNyMIi4VXRBe7loIBTvnQcjOvVE2RUp36KFwFlX8orIEJwmBoZyPyFB1ts9GnMKOyJ4/50j4/Cg6FUk7cfKPv8veAhaBDFxjvCAvml1rFBm8vCkKeldmlwsklzyJChCNlAxvzaGRC7gJl/M6c6eOaHokJjMWJT@RkWX/q91DZqDmp1YtdQDa3lgr77777kOvMbCvWWAhBbEofxZ6U781njRTtc4WIO05R8a9vtzA8mq1wtTyTC3Eorag6IItnUo6HNNoLMy1KOED0VEUfsfPRQkv@jQhHUZq1aFKSTO86gK1bO3ZZQ25S4CCxDjM2Bb1szlUgpHsQTLqEIOi2FKesS9sSr5iuKy51cCbVIhPHZDAXmWM60m69ZoPc3G1nbXM1oYtxCkf252uGCV8FFGPrPepfz6w0oVW@v3Zt43WDGqLEoA/tujk7P38@qpsdhtfvqTOBVPVeaUtahn1ucrKVwf7B3uHR7tH7w@hxrleKPCgaP6KRqZTNLbhy3m6OJmF/qgHLvoQoo9NmwXustwqse2T14kzsDjOoLBWy5jSGzXNqdV0fa0lvzdDWITTUmtUtDaVBWdR0bhbWBGHdCorVJStSz9Ml8UmiTCmU@TDEFRNiYwgJUswMrrJdv0UXj8awYzDi4zL4krWl8siUy2xsmMupagzVSHY1L7bwIGVz3ELuidyc1nACczpfT3QPrf@@de/yb5nP8P4P4vxGOP/luNPFmnpbqNM8rhUDanlw/4BSxFapOCBM1uTSVaO8O8wR4EdQINnQiEELpldybvCo/U@QJ8wApRJbkqeKejxZKBNsyx@blkUjCeRPzZFncBnsAMc20RqbP2aUxsah8na3trebCIN5cbZAqHomEwoaZUIdf05U5ly5sX2ydBlnU6HqSjMfW5vt6UirbLzaUM9WTJaBqwi43aPYQ@2rHZgrVts08pOranTVmbbrNKssEEbIVnaBadaEwOA6DQdFvpQETaiQlVU8/NZxuDNycXiPsJlgPoxID2JP0YsEBlAJHHrqnLHd8EvVkRm6t24K811M6i/EJjIY5@r97kOg4f8zz2eE2L8X3Lc6zeM68F9jfSl7@ze7Zdrt7vdJAvbOQwjKlbegFemtazWhtXc1tfOiVqgArd0Kr4AJc4BzpXLvc9RnO6@2tv//u3B4Z1@r4Cs3AarsEq3U@sbZr03WA4q9/j8MvU@ik7B8Vcan0ZGEN7legvUK3ZT37LVtUb8zKLejmJaixXcL1rnBse6bNKuib7gAf5bzJSbKoivCLrKnVJtnZtF7rwkur7zrsyL8Af/KWpFuCT9sY1ac7gjPHCy8wMPQ37BNJyuwIHTOjky7ESvL/7aW1/259ck@bei9Lztc3uVKz/CySpbbXEbtedwr5M@62f9cT8kH2tfWN9YptW@0sq@fWEhLOhdrTy1m7WNaq1WDqtaOaSD8fgxXWLzMs7dsama6gxARtnX24j2OKd2OWyXnY5WHtmtqtiBV9wPV9hwnVrmVdmZW@XHcPM6ZhJO0YRr5VSnjKVhms05@PsceWHZqgdOfKWpTJ3RnzmIfNmr1YgHs3xMDFxb/cMaOMepObTEtdkuwq01CdoiKlVuOutvv5Wa24yp2ry18WhHV9mGZZ31X2s77UrPGbfMX93Bd6ffffexUtLV5qbaDjeVklU9YWrv0cHBgdZq6YcHWvcJe1Ktt7efVuvY16zvsL/gw35VSt2/wIDdje1HOxicdE6UUmdQ6/TMrjHo9pTSlVK6nCslpWR3Zu9q9Om97tbk50d8O8agFx/8uLd7uFdvdYxS6/Xbeuvw/ctSEy9brcUKzdDyBtbf7e2@fvv@qI7hd/sf9t4fvH7reV6cjkbpKJruvN1@u2kNujXTMJhhsu4AXLybfdu9vr6usdp1NcuyqjlTSq@7s/eW0SE@AEDghtHXze7gi1LqlXrWmXWmWQ2/cdZonjZPZxh5s8bnKGlMG9PmqNlszhr8fWM4awwbUXOEJ8e/RoCh1xjPGpNG2AgJKMLAnTVcDMZ4TmhpDCSf8c9rNAh742wGMn5TfD4d64w1Gpvb2tPas@Kf/UinLOOLUukXGdFWo81nXtauSJtrGj9zfE1t9metcUvVcZdqz3R4Z3ND1w2tQXfrpv6p2elo21t6t6ttt3Qsq5WZGiUV7Uq7as51evS0hj7Q5xj1aapSmpfoNIZsc0vHTcH1L5bdtFqb9qxTru3UjB187G6tU/y8KI2E5k1LOT5@vXu0e3xsN0tExrKUktk31WZLPT6uVkicNqWskc9NH/F545mi4lMCnD3kE1CkHWmacuRj/MDhOefneX7Ol59XKJQ@f0ZgimOrCtgRH1NOfMlSBKFoXHErRvOFuvEUyePGE1UpIVBRA61DrcbInHYVahNrjOlit6aflE76lap1RdWedsn09tyqVk5OlE73qsTmxM1cGVFhu/mMuIRrN@edLkblCmGq0JyxEW1GpXK5jGPAuuqG@tZUbPrfFrSDxBMCAlHpS7TVvA6/b5eex5WNzUqfZH36zWgy8VrfsJMvzS/bZcuqVFpbjNklaePmE73UbT0xkRuXBsXcJuYGJeESrSZQVBHFwtGn40/HH1ut1rNnz9TW9m@W9bXLB6vLADzmiE15cF8E3k28nxxKQMNlFMbgpxwBf6lbRsr1vSFp98acVPj6lPhfH5hTiC9hCRqgcnTrIitmVWpE9gY6uxIptzdmGq3iLm7K1F8WOVmehKzRViQQtbPayyGokC8wmwBokgKu5tnNNvM6hAy/iNMFBfosdtRsGvo81AQX3kBvL2GWnHSxe42Xtf21mgSfS7akPG4wkmLLteUr2AuoYne1Yrd@CwDVDmAq/UalEPOPiIGUQltiqLM/Lcat/biS9IVMgoXVYjG/MsVcqWb1oK2Q2NW4rfygufoVXZXt6@DxY/dT3AsGbT2wM/qt1YL2XDnVPAlSzezANprtGMy2s16t5g3sQP9BiwXzgd0AMGgT5lS/Wlo6tAtzpXr9shca1@Gg/qYX1pqDel6vfrQv647dqM/whdrqfv1XKG@hSi2zL2th2@ngS7f2DU3Edlpz2jemaMup5tuXPWdgN/S2j4212hsIAz7Tnl@rDXQQ97F4d2Pbf/zYqfndWds3DJ2gPm28eNPLMBjUbHp/rjmd2YvLXo79zzX82iDj62Ae@27aAPjAXxs6luZbsS55nBF7M7AX2Hb144vqx6r96NFlb2YEg7pU//PGyvDE/IyYX/cRrfpx3bGESkQFr6nfes@/NaspU@vwPii5Hq/tlBxWP2IlXp2G@f8B "Polygot driver on TIO Nexus") As usual, I replaced literal tabs with `␉` and literal ESC characters with `␛`, due to limitations of Stack Exchange. You can get an easily copiable version of the program from the "input" box of the TIO link above. ## Rundown This program prints **50** in bash, **49** in Octave, **48** in Deadfish~, **47** in Lily, **46** in Cubix, **45** in PicoLisp, **44** in alphuck, **43** in reticular, **42** in evil, **41** in brainf\*\*\*, **40** in Minimal-2D, **39** in CoffeeScript, **38** in C, **37** in C++, **36** in Labyrinth, **35** in INTERCAL, **34** in Rail, **33** in Incident, **32** in Whirl, **31** in Modular SNUSP, **30** in Whitespace, **29** in Trigger, **28** in Brain-Flak, **27** in Perl 6, **26** in 05AB1E, **25** in Pip, **24** in Thutu, **23** in Hexagony, **22** in Underload, **21** in Nim, **20** in Prelude, **19** in Reng, **18** in Cardinal, **17** in Julia, **16** in Pyth, **15** in Haystack, **14** in Turtlèd, **13** in Ruby, **12** in Fission, **11** in Befunge-98, **10** in Befunge-93, **9** in Perl 5, **8** in Retina, **7** in Japt, **6** in SMBF, **5** in Python 2, **4** in ><>, **3** in Minkolang, **2** in V/Vim, and **1** in Python 3. ## Verification Most of the languages are tested by the test driver above. The usual four culprits need testing separately: * **Incident** was tested using its official interpreter, offline; * **Deadfish~** was also tested using its official interpreter, offline; * **Modular SNUSP** was tested online [here](http://www.quirkster.com/iano/snusp/snusp-js.html); * **Reng** was tested online [here](https://jsfiddle.net/Conor_OBrien/avnLdwtq/). ## Explanation I was looking at various leads for languages to add. One possibility was to find a language with `#` line comments that could plausibly be added to the "scripting language" line (which handles Perl, Python 2 and 3, and Ruby). It took me a while to think of an appropriate language that could be syntax-compatible with the ones already there, though. It turns out that the answer had been staring me in the face for ages. If you click the TIO link above, it'll open up the polyglot test driver, which is written in bash. So all this time, I had a tab saying "Bash — TIO Nexus". You'd have thought that'd be a hint, but apparently I missed it. As a bonus, bash is also a scripting language, so the term "scripting language line" is still appropriate. The bash program starts in the same place as the other scripting languages. However, there's a fairly simple way to split it away from them; in single-quoted strings, `\` is an escape character in most languages, but not in bash. So we can hide bash code from the other languages via `'\'…';`, which is a degenerate statement (with no effect) in Perl, Python, and Ruby, but executed in bash. `echo 50;exit` is a fairly simple way to end the bash program. Well, almost. The biggest problem here is that bash will, upon running `exit`, continue parsing until the end of the current line (even though it doesn't execute the code in question), so we need to make sure there are no syntax errors on the rest of the line. We have a `'` just after `exit;` that isn't (and cannot be) immediately matched. Later on on the line, `'…'` is used to hide some Brain-Flak code from the scripting languages, but that would unhide it from bash. As a result, we need to change what sort of string literal we're using to hide the code, going from single-quoted to double-quoted strings. `or"'"` does the trick without disturbing Perl, Python, or Ruby (as the left-hand argument is truthy in every case). We now have an unmatched double quote that extends onto a future line. It was fairly hard to close it without disturbing at least one other language; what we actually do is to change the way we hide code from bash from double quote back to an unmatched single quote in a Python/Ruby comment on the subsequent line, and finally close the single quote at the end of the line after that. ### Pyth and 05AB1E Messing around with double quotes also disturbs the languages that were using double-quoted strings to hide code, Pyth and 05AB1E. The main trick we use here is to ensure that every double quote we add has another double quote soon afterwards in order to expose as little code as possible. (This explains the extra double quote on the `__DATA__` line, which isn't necessary for bash.) Pyth uses `\` as an escape character; the main upshot of this is that it limited the scope I had for messing around with strings in the scripting languages, forcing me to use the rather convoluted method above (as I couldn't easily make use of the difference in `\` behaviour between bash and everything else). In 05AB1E, `'` acts as an escape character *outside* strings, and having it escape the leading `"` wouldn't do. So I ended up needing to place a useless padding character (defaulting to my usual `x`; it makes things easier to read!) inside the `"'"` constructs that are used to change between bash quoting styles. ### Prelude By far the hardest language to fix here. The problem is that the scripting line, with all its parentheses, was moved sideways, and thus the Prelude control flow (which cares a lot about the way in which parentheses are vertically aligned) was completely destroyed. I thus had to try to reconstruct something that works. Worse, the current first line (which I really didn't want to rewrite) places something of a hard limit on where the parentheses can appear. It starts off with a nonzero digit (two of them, in fact!), and is soon followed by an opening parenthesis. That's a loop in Prelude, and loops early on in the control flow in Prelude cause a number of different issues (mostly because they cause more code to run, rather than less). As such, I badly needed to open a 0-iteration loop on some other line in order to skip over that code. The `main` line for the C program is highly suitable, but we need to be very careful with where the matching closing bracket is; too far right and the unmatched bracket on the `#R+` line will cause trouble, too far left and it won't comment out enough code. (Bear in mind that an opening parenthesis on one line can match a closing parenthesis o a different line.) Once that's done, we have just enough space to stick in an opening parenthesis on the Incident line, and we've finally got safely past the first few characters of the program. However, the difference in parenthesis placements ends up meaning that some of the Incident/Whirl code actually runs in Prelude, corrupting the stack. Instead of trying to prevent this, I moved some of Whirl's zeroes further to the right, allowing them to give us a working Prelude program again. One other small change was on the first line of the program; the final parenthesis of the line was in a position that was very hard to avoid. I added an extra `c` just after the Pyth code to shift it to the right. (Many languages are parsing that point of the program, so it took a surprising amount of trial and error to find a padding character that wouldn't break at least one language!) ### Incident Prelude was hard enough by itself, but getting Prelude and Incident working at the same time was nightmarish. Prelude placed a lot of constraints on the code which prevented me freely moving things around, and thus made accidental token construction harder to golf out. For example, Prelude only really needs one `0` moved out to the right, but that caused `00` to become a failed token, breaking some of the tokens we wanted as part of the Incident program (because if two tokens overlap, they're both rejected, and the `00` was overlapping a token we wanted in addition to overlapping itself). I had to move both out to make a fourth copy and prevent it being even considered as a token. More subtle are the tokens `;'` and `␠␠` (i.e. two space characters). The issue is that these both appear *before* the `kG` that is being used to jump to the start of the program, and thus will break Incident's control flow (in addition to breaking the program's centre point). Removing a copy of `␠␠` by breaking it up doesn't seem viable. Removing it via overlapping it might be possible (`␠=` is a promising potential overlap), but it's almost certainly less verbose to just add a fourth copy, which is what I did here. Meanwhile, we can use a different trick for `;'`. Breaking it up isn't something I wanted to try, given that it's used in fairly spacing-sensitive situations. However, it's not *that* near the start of the program (despite appearing on the first line), so it's plausible that we could jump over it (thus causing it to not affect control flow) rather than needing it to not exist. I looked for a suitable token to use for the jump which wouldn't screw up any of the other languages. `/v` appears a little earlier on the first line, and doesn't break anything, and thus that's what I used. ## 50 languages in a kilobyte of code It was pointed out by @MistahFiggins that my 1025-byte submission would be way neater if it were 1024 bytes (especially as the fiftieth language is a milestone in its own right). This required finding a byte of savings somewhere. In this case, I saved three bytes in the Deadfish~, at the costs of two extra bytes used to make Incident tokens line up correctly, and thus bringing the program down to 1024 bytes exactly. Previously, the formula that the Deadfish~ code used was (2²+2)²+10×1+2 = 48. The new formula is (3²-2)²-1, also producing 48. Surprisingly, it isn't that much shorter to write in Deadfish~, despite being considerably simpler. This also gives us a ([VIP score](http://codegolf.stackexchange.com/questions/65641/the-versatile-integer-printer)) of .008192. Not only is this a new record, it's also a nicely round number in its own right (which is, obviously, a consequence of having nice round numbers as the inputs to the formula).