# Perl / Java / PCRE / .NET, 35 bytes ((\2x|^x)+)\1(\3xx|x(?=\2$))+$|^x?$ This beats [primo's solution](https://codegolf.stackexchange.com/a/22084/17216) by 4 bytes while supporting the exact same set of regex engines. [Try it online!](https://tio.run/##RU5Na8MwDP0roojGIglxsu0yx00K3XWn3ZbOdKMBg9dmdgYebvbXM7cr9CL0PqT3hr01D/PnD6AVEMzxY2cACxGhrDfrl/Vqgv5oGTrJRb0SFED3EVEYrD6MsOgOCzFBa6QbjB5ZkieZ@353YzxRWV5mJe2/zqbmxvLI0yMqEudfLibubGvqikJrXsutjJNvxTVXXyHqWl7kuKUpBd0DY4lPwEM0EYH8hQJtQQHdcnkpd@kWi5fivytqMU2TUk/PG6VmxrrKn948pdSVrLvz/uRZI7sKiVKMQoPzzPP7ivM/ "Perl 5 – Try It Online") - Perl [Try it online!](https://tio.run/##bVLbbtswDH3vV3BGh0hJqjoZ9jLVKLZhAwas29A@Jhmg2HKiVqY9SW7c27dnlONdCtQvNMmjQ50jXqtbdXJd3OxN1dQuwDXlwtRiLOH/ShuMfbHm9EZ31Dlq2rU1OeRWeQ8XyiA8wFDzQQUKt7UpoKIOuwrO4AaU2/jFikPYunrn4VOX6yaYmk4eAXw2VkOZod71vywReV1oQf2Eyw9tWWqni0utCu1g3cOeF9mfk0Naci6HuX4a5G4b@Rnz2Zo0qOKrQc04f5Vhay03JfNC/2qV9Sw5HY/HCecPz6EHBsbCiwQPxBD@MhDBKTGsCXcj/SQbLXEUY5BPh9rTDxWCdgguG/5IbdXEAZ5LcmNd11YrhPusJEYt4SpXiCTdYNMGyCCqHWrs6s4HXQmDXMKgs4eJrfLfdBfomr3FAIMhlu5OHAcQEmKQOPQXK7DUjijhG2sCS07oEQgfAFPqfMFAa@BEo5zXlDC7SFd8Cjh7sSmsxk3Yns3hHCIS3lGYrYgx3yq3WHWDnj7D2UrCe@fUnRelsZZ101E36k0BKGsXtdE1Mkwl4FmGMwqTCQm8UCHfkkMVsTlRHTLWby7Sgn8k8sPGiJ1TDRtG5HVz9728VLjRNCmdIudRaQmsovFYkHfxbe/5YHJNju2cCZrFR@XyPguuje/zr92Qh6FkyWufkCVcPsXvKG7VnrHlvHv82fEJX87Y8k3XPXbsPFvOjzmfHFPj/Hgfl2efnszfpulv "Java (JDK) – Try It Online") - Java [Try it online!](https://tio.run/##nVJNi9swEL37VwxCYM3Gjj82bcnKbi7tQqD00O1tvRWOo6xFHdnIChiy@e3pOLSXHleHQfPx3hvNaFeP7XX7@FSC0/UeYreHMARXFKF61wmDYjO0A3AHJbCEwRIGp1@V00NXN1qEyfJuo1Rbd141/XEwnXaVqFBWP5IxjEg8ggMF1aueC6zX1o9Cqcftt69KYQQZEiURy8BYo0btBRsap5e7uvntHRnVmaPxLAK2yter9cdP@foDQxkceie4KVPJu/JA7KN4@vll@x0lnsEcBO@eR@86bemGcfZSlqyyDKl4PO0oQ@EojeIMZ7yehq7fa8FiFlG5JHzTn6yfsUVOoGciIJu@yADgpmz/@twW5S1Pt8UCSRrEbULH2jet4C4isXlcuvYinMKIW0SE89yiQd20/dyXBHpKJmH2gVt5IZnLf2MVKK9CVPn09mvCBVaZqO6n6W0Sm7LKOeKCU2LDr@9bdHCTji0wfnYPD3F2YZ8bmsmSti/1pBtITqNLdsYm83/4l7qm8SpP0z8 "Bash – Try It Online") - PCRE1 [Try it online!](https://tio.run/##XVDBasMwDL33K4wxxFqSNsm6jeKGXLZBYeyw7dZ0Js2cJix1jONCoN23Z0rZaQcLSU/vPVmmNuM6M7UhzJKU0AUlc2KsOkirTFuUinuL@U0mZV20Tpbd0TStsjnPQeRvi94LiIevwqY8qGlAO6Vdz6V83rw8SQkBiQElUVjMGt3IXjlOTWnVfF@U385ikG1zbBwNCF0mq@Xq/iFZ3VEQs6qznDVpJFibVqje8/ePx80rCDiTpuKs3fbOtkpjBmG8S1Oaawo43J/2iGA7iIIwhomvBtN2X4rTkAY4LpBfdiftJu46QdIWBTBGOzEj5Oqs/2qm1@kVx8z3Aa0Jv17oWLiy5swGaDadSxWOe4MXMA0A5Dyt2IAq627aSxD8SizIVBOmxQ/a/Pw7Kwcxcp4nw@VzAB/ymOe3w3AZeJbmCQPwGQIZG8coXCZR9As "PHP – Try It Online") / [Attempt This Online!](https://ato.pxeger.com/run?1=XVHNTtwwEFav-xSWsRRP19lNUgqsvNEe2q20UgVVQFwIWCE4rNWsEzleGgl4kl6QUNW36b19mk4WLu3B4_n55vtm7O_P7bp9-vPm13yBDmGOpIROKZmQ1ulb5XRbF6XmwXTydqHUuqi9KptNa2rtcp6DzLNpFwgS4KkwqW71ALBeW99xpT6tPi-VAkFiQEoklqPqmzNe89Ozj8ssE_TLh2yZkDsK8t8CknS-sJ4HA0KdL7PT1clxACBHxhrVac9pWzo9uS7Kr96hUbXZGE8FofvJbH92cJjM3iPtqGocZyaNJKvTCufrBonVMUi4J6birL7ovKu1RQ_C-DJNaW4pILjbXmMF0yISYQxDv-7burnRnIZUIFxif9lscUoM5gk2XSAB2uhSjgjZKdvXmNl5uqujNx4DShO-e-NN4cs1Z06g2PDgusCl-0AwCwDkfhjRgC7XzTCXJLhKLMkQE2blI8o8_vcxHOSPra_Co997nOdJ_3DVwxjymOfv-v6h54s0TxjAmGFhwV6gT6_XzyiM4yiKXsK_ "PHP - Attempt This Online") - PCRE2 [Try it online!](https://tio.run/##RY/RaoQwFER/JcgFk9os0dKXlbALfe4XqAWxd9dAeiMxi2Fdv91qS@njmRmGmcFN6McerV3B68rjFWNzPBJO/JyunNdFfHxEkYk65/VLjI/IT7ouQIgMNuMEa3p@Tt7c12AsfiaihLtW5cV5bLueg2WGGBgabkHM0GqwchysCYlMSnPh0B46d6MgbWDFHsg0tJVqlq2AA@nKUGh@lBJIWvzjfOcsE/Pe4Q/vbeh6HHka0ycg8SvfxTx5E1D2bgzLNisv/5lJcttHawgZ0LIsq5LFq1Lf "PowerShell – Try It Online") - .NET It works by first finding two consecutive triangular numbers whose sum is \$n\$ (using the equivalent of `(\1x|^x)+` to find the smaller one), so that \$\sqrt n\$ will be the triangular root of the larger triangular number. Then it tries to match that root as itself being a perfect square, using the equivalent of `(\1xx|^x)+$`. If it did not need to match \$0^4\$, the regex would be **34 bytes**, and if it didn't need to match \$1^4\$ either, it would be 30 bytes. ``` # tail = N = input number ( # \1 = a triangular number T_0; tail -= \1; # \2 = triangular root of \1 ( \2x # On iterations after the first, \2 = \2 + 1 | ^x # On the first iteration, \2 = 1 )+ # Iterate the above any nonzero number of times ) # T_1, the next consecutive triangular number after \1, is \1 + \2 + 1. # N is a perfect square iff tail == T_1. \1 # tail -= \1 ( \3xx # On iterations after the first, \3 = \3 + 2 | x # On iterations after the first, \3 = 1 (?=\2$) # Assert that this is the first iteration, while # simultaneously asserting that N is a perfect square, # because if tail == \2 here, it will have equalled \2+1 # before this loop began. )+ # Iterate the above any nonzero number of times $ # Assert tail == 0 | ^x?$ # Allow us to match N=0 or N=1, which can't be matched above ``` Alternative 35 bytes: ((\2x|^x\B|^)+)\1(\3xx|x?(?=\2$))+$ This avoids the special cases for \$n\in [0,1]\$ at the end, while working around PCRE1's atomic behavior, by hinting that the group 2 loop should only capture \$1\$ `x` in its initial iteration if there are more `x`s following it. This way we can get the same behavior as the 32 byte version below, where both `\1` and `\2` capture an empty string when \$n\in [0,1]\$ – but unlike that version, this happens for \$n=1\$ without any backtracking. # Perl / Java / PCRE2 <sub><sup>v10.34 or later</sup></sub> / .NET, 32 bytes ((\2x|^x?)+)\1(\3xx|x?(?=\2$))+$ This drops 3 bytes at the cost of sacrificing support for PCRE1 and older versions of PCRE2, because they automatically force capture groups with nested backreference(s) to be atomic – which would prevent `x?` from ever matching \$0\$ instead of \$1\$, blocking \$1^4\$ from being matched. If it did not need to match \$0^4\$, the regex would be **31 bytes**. [Try it online!](https://tio.run/##RY7NasMwEIRfZQki1mIbS257iazYgfTaU291KtIQg0BNXMkFFcV9dVdxA7ksO7M/8/VHa56mzx8gVkAw58PeAClElLLabl436xG6s6XESSaqtcAAuosKQ2/1aYBFe1qIERojXW/0QJM8ydz3hxviicpynnE8fl2X6rvLoo8rolBcf7mYuLeNqUoMjXnjOxkr24lbrr5Jois5j2OXphh0B5QmPgEPcQkR5C8UxBYYiFsuZ7iZLYJz8c9KtBjHUannl61SE6Vt6S/vvsYUW07bB@8vvqa1bEuCmJJpYvljydgf "Perl 5 – Try It Online") - Perl [Try it online!](https://tio.run/##bVLvb9owEP3OX3GLOmEDdQPTvsyN0DZt0qR1m8pHYJJJHOLWcTLbKYG2fzs7h@xHJfLlcnfP7/ye7048iMu77P6oyrqyHu4wZ6piIw7/Vxqv9NmalVvZYmdQNxutUki1cA5uhDLwCH3NeeExPFQqgxI7ZOGtMlsQduuWawq@sNXOwac2lbVXFZ4cAHxWWkKeGLnrfknE0iqTDPsR5R@aPJdWZrdSZNLCpoO9LJI/J/s0p5T3c93E810R@AlxyQY1iOyrMpJQ@ioxjdZU5cQx@asR2pHoajQaRZQ@voSeGAjxZwkekcH/ZUCCK2TYIO6eu3EyXJlhiJ4/n2rPP4T30hqwSf@Hass6DHCUoxubqtJSGDgkOTJKDotUGIPSlakbDwkEtX2NLPbOy5IpQzn0OjsYK4T7JluP1@wsBugN0Xh35DiBDCJ6iX1/uQaN7YBirtbKk@gSHwHxHkyMnS/G4xpYVgvrJCZEL@M1nYCZnm0yLc3WF9czmENAwjsM0zUypoWwy3Xb6@kyM11zeG@t2DuWK61JOxm2w84UgLyyQRteIzExB3OdmCmG8RgF3gifFuhQiWyWlaeMdJtrcME/IvlpY9jOipr0I9Kq3n/Pb4XZSpwUTwylQWkOpMTxJkPvwtseaG9yhY7trPKShEel/JB424T3@deu0UOfk@i1i9ASyp/DNwhbdSRkNWuffrZzOqarKVm9adundk7myWp2Qen44hg25xhfzt7G8W8 "Java (JDK) – Try It Online") - Java [Attempt This Online!](https://ato.pxeger.com/run?1=XVHNbtQwEBbXfYqRZSke1tlNQvlZeaMcYJFWQgWliEtTrDQ43YisEzleiNT2SbhUQoi34Q5Pw2TbCxw8np9vvm_G_va93_V3fx79WmfkAHeQAlsyWEDvzJV2pm_LyohguXicab0rW6-rbt83rXGFKFAV-XIIJAR0akrqKzMBrDfWD0Lr19s3G61RQoxEScRqVn91jTfi7P2rTZ5L9u5lvkngC0P1b4FIBl9aL4IJoT9s8rPt29MAUc0a2-jBeMH6ypnFZVl99o6Mbpt945kEdpKsTlbPnierp0Q7qzsneJNGirdpTfMNk8T2FBVeQ1ML3p4P3rXGkodhfJGmrLAMCTwcLqlCaRnJMMap34x9230ygoVMElxRf9UdaEoK1gk1nRMB2ehCzQCOyvYh5nadHuvkzedI0iCOb7wvfbUT3EkSmx7clLT0GEhuERGupxEbNNWum-ZSQKvECqYYuFW3JHP738cIVD8Ovg5f_AYhimS8-ThmOMciFsWTcbwZM5GlRcIR5_wed_dw_YzCOI6i6D78Cw "PHP - Attempt This Online") - PCRE2 v10.40+ [Try it online!](https://tio.run/##RY9Ra4MwFIX/isgFk6Up6thLJVjo836BOhB3WwPZjcQUQ62/3enG2ON3OHycM9gJ3dijMSs4VTm8YWhOJ8KJnZOVsToPz49QcsHrjNWvITxDyUpV58C5gDU5H@KL/Rq0wc@YF/BQaXG1DtuuZ2AiTRFoGu6ez9AqMHIcjPaxjAt9ZdAeO3snL42P8r0gFLRV2iybgAGpSpNvfpICSBr842xnIfi8O9zxvfVdjyNLQvICxH/jB58npz3K3o5@2WZlxT9Hkux20GjCCGhZljWV@VuafgM "PowerShell – Try It Online") - .NET --- # Perl / Java / PCRE / .NET, 39 bytes ^(?=((\2x|^x)*)\1(\2?x)?)(\4\3\3|^\3)*$ This was a stepping stone from [40 bytes](https://codegolf.stackexchange.com/a/223129/17216) to the 35 byte answer above. Try it online! - [Perl](https://tio.run/##RU5BasMwEPzKEkSsTWws2@2hlRU7kF576q2KRVpiEKiJK7ngorhfdxU30MsyMzu7M93Rmvvp4xuI5eDN@f1ggKQ8UFHuti/bzQjt2VLiBOPlhqMH3QaGvrP61MNCnhZ8hNoI1xnd0yiJYvf15vpwouIkizM8fl5N1b/Kgo6PRCG//nIh8WBrU@boa/Oa7UWYbM9vufpGiS7FvA5ovUavW6A0GiIYIJgQQfxASmyKnrjlci43dwvFM/7XlWg@jqNST887paaGVoJSmQ@XZsAVyizgasAKqbyThSwujSxwRaaJJfkDY@wX "Perl 5 – Try It Online") / [Java](https://tio.run/##bVLLbtswELznK7ZCC5N@MLLTXsoIRlu0QIGmLZKj5QC0RNl0KEolqVhO4m93l7L6CBBdlrs7muUMdyvuxWSb3x1VWVfWwxZzpio25PB/pfFKv1izci1b7JzVzUqrDDItnIMroQw8Ql9zXngM95XKocQOufFWmTUIu3aLJQW/sdXOwec2k7VXFf55BvBFaQlFYuSuO5KIZVUuGfYjyj82RSGtzK@lyKWFVQd7XiR//uzTglLez3Vjz3ebwE@IS1aoQeTflJGE0leJabSmqiCOyV@N0I5E58PhMKL08Tn0xECIf5HgERn8XwYkOEeGFeLuuBslg9QMQvT8cKodfgrvpTVgk/6Eass6DHCUoxurqtJSGHhICmSUHG4yYQxKV6ZuPCQQ1PY1crN3XpZMGcqh19nB2Ea477L1eM3OYoDeEI13R44TyCCil9j3F0vQ2A4o5mqtPIkm@AiI92Bi7Hw1HtfAslpYJzEhehEv6RjM9MUm09Ks/eZyBnMISHiPYbpExmwj7GLZ9nq6zEyXHD5YK/aOFUpr0o4H7aAzBaCobNCG10hMzMFcJmaKYTRCgVfCZxt0qEQ2y8pTRrrNNbjgn5D8tDFsZ0VN@hFZVe9/FNfCrCVOiseG0qC0AFLieJOjd@FtH2hvcoWO7azykoRHpfwh8bYJ7/OvXaOHviDRGxehJZQfwncWtup4S@YJIemsfbpt6ZCmUzzPWzqnJH2bXqQXT7fpBR2@PoYFOsaT2bs4/g0 "Java (JDK) – Try It Online") / [PCRE1](https://tio.run/##nVJNj5swEL3zK0aWJTxZCJBkW2UN5dKuFKnqYbe3ZWMR4iyoxCDjSEjZ/PZ0iLqXHteH0Xy998Zj78qhvm4enzOwutxDaPfg@2DT1FefOr6X5n3dA7eQAYsYzKG3@k1Z3bdlpYUfzWe5UnXZOlV1x75ptS1EgbJ4igY/IPEADpRUb3pqME4bNwilHjc/fyiFASRIlEQsvcY0atBOsL6yer4rqz/OklFtc2wcC4CtFuvV@svXxfqeofQOnRW8yWLJ2@xA7IN4/v198wslnqE5CN6@DM622pCHYfKaZawwDKl5OO2oQukgDsIEJ7we@7bba8FCFlC7JHzVnYybsOmCQC9EQDZ@lR7ATdn8i7lJs1udvLs7JGkQtw0dS1fVgtuAxKZ16dIJf/QDbhARztOIDeqq7qa5JNBVEglTDNzIC8lc/lurQHndijwToliM79sRZ1gk5Ocj5iiKVbEslu/bYokzfv3cY3s3@dAA42f78BAmF/ator3M6QdIPeoKotNgo11joulPfJSucZjcx3H8Fw "Bash – Try It Online") / [PCRE2 v10.33](https://tio.run/##XVBda8IwFH33V4QQaK5Wbf3YkFj6sg2EsYdtb0ZD7aItq2lIIxR0v727lT3tIZdzP845N9cWtluntrCEOZIQOqVkQqzTJ@W0rbJc82A6GaZKFVnlVV6fbVlpJ7kEId@nTRCSAN8Ri@qk@wHjtfENV@pl8/qsFIQkBpREYTEoTaka7Tm1udOTQ5Z/e4dBVeW59DQkdDFbLVYPj7PVkoIYHGvHWZlEglXJEdUb/vH5tHkDAVdSHjmrto13lTaIYBzvkoRKQwGHm8sBO1gOo3AcQ8/Xra3qL83pmIY4LpCf1xfje@56hqQtCmCMdmJAyN3Z/OXMrJN7H9FoBGhN@P1C58znBWcuRLP@XDrzPGiDkBkAINd@xRJ0XtT9XoLgV2JB@pwwI37Q5uffWTmIbs/ThHM5a2/7FoYgY8RpCylwuZBzOb/t5RyGrOuicbyMougX "PHP – Try It Online") / [PCRE2 v10.40+](https://ato.pxeger.com/run?1=XVFLbtswEEW3PgVBEBDHkWxJdj8GLWjROoCBIimUoJswJhSVioXKlEDRrYAkJ-kmQFD0Nt0np8nIyaZdcDifN-_NkL8e2m17__Tm7zJFhzBLEkKnlExIa_W1srqt80JzbzoZp0pt89qpotm1Va2t5BKEzKad5xMPT4lJda0HgHHauI4rdbz-vFIKfBIBUiKxGJU_beU0Pzv_tMoyn375mK1i8oOC-LeAJJ3LjePegFBfV9nZ-vTEAxCjylSq047TtrB6cpUX351Fo-pqVznqEzqPF_PFu_fx4i3SjsrGclYloWB1UuJ83SCxPgEBN6QqOasvOmdrbdCDILpMEioNBQR3-yusYNoP_SCCoV_3bd1805wG1Ee4wP6i2eOUGCxjbLpAArThpRgRclA2rzEzy-RQR-_oCFCa8MMb73JXbDmzPooND65zXLr3fGYAgNwMI1agi20zzCUIrhIJMsSEGXGHMnf_fQwH8XvvyuDDo7fhacK5jPvbTQ9jkBH6aQ8pcDmXMzm73cgZjNkL_P71-hMGURSG4Uv4DA "PHP - Attempt This Online") / [.NET](https://tio.run/##RY/daoQwFIRfReSAiTaLP9ubleBCr/sERkHs2RpIE4lZlHXz7FZbSu/mG4ZhZjQz2mlApTawvLb4iUtzuWicyTXaWlJxQkS@PNuFxlRku64WWlEizqIQxbMVBY1hi64v4Zv5GqXCj5CW8OBpeTMWu34goAKpA5B6vDu6QsdBsWlU0oUsLOWNQHfqzV07plyQH4GEQ1enjd8LCGheS@2aH6cEzRT@cXZwktD16LCn9871A04kWqIYNP21H3SdrXTIBjM5v8/Kyn8OmDb7TyU1BqC991vK8tc0/QY "PowerShell – Try It Online") Alternative 39 bytes, slower in most of the regex engines: ^(\1\4\4|^(?=((\3x|^x)*)\2(\3?x)$)\4)*$ # Perl / Java / PCRE2 <sub><sup>v10.34 or later</sup></sub> / .NET, 38 bytes ^(\1\4\4|(?=((\3x|^x?)+)\2(\3x)$)\4)*$ This was a stepping stone from [40 bytes](https://codegolf.stackexchange.com/a/223129/17216) to the 32 byte answer above. Try it online! - [Perl](https://tio.run/##RY5fS8MwFMW/ymWENde2NJ31QdOsHcxXn3xbtjBlhUDcalKhktWvXtM68OVyf@f@Oac9WfMwfnwDsRy8ubwfDZCMBxTldvO6WQ/QXCwlTjBerjl60E0g9K3V5w4W8rzgA9RGuNbojkZplLivN9eFE5WkeZLj6XNaqv5VFnR8Igr59MsFx6OtTblCX5tdvhehsj2/@eobEl2KeRy6OEavG6A06iPoISwhgviBjNgMPXHL5RxuzhaC5/wvK9F8GAalnl@2So0HKnNZyOJKK0GpvO@vh77CGOVqAoIoC7wj48jS1SNj7Bc "Perl 5 – Try It Online") / [Java](https://tio.run/##bVJdb9swDHzvr@CMDpGSVHW67mWqEWzDBhRYt6F9jFNAseVEqSx7kty4SfPbM8rxPgrULzTJ01F34lo8irN1/nBQZV1ZD2vMmarYkMP/lcYr/WrNyqVssXNSNwutMsi0cA5uhDKwg77mvPAYHiuVQ4kdcuetMksQdulmcwp@ZauNgy9tJmuvKjx5AvBVaQlFYuSm@yURy6pcMuxHlH9qikJamd9KkUsLiw72skj@nOzTglLez3VjzzerwE@ISxaoQeTflJGE0jeJabSmqiCOyV@N0I5E58PhMKJ09xJ6ZCDEv0qwQwb/lwEJzpFhgbgH7kbJIDWDED3fH2v7n8J7aQ3YpP9DtWUdBjjK0Y1FVWkpDGyTAhklh7tMGIPSlakbDwkEtX2N3D05L0umDOXQ6@xgbCXcd9l6vGZnMUBviMa7I8cRZBDRS@z7szlobAcUc7VWnkRn@AiI92Bi7Fwbj2tgWS2sk5gQPYvndAxm8mqTaWmWfnV1AVMISPiAYTJHxmwl7Gze9nq6zEzmHD5aK54cK5TWpB0P2kFnCkBR2aANr5GYmIO5SswEw2iEAm@Ez1boUIlslpXHjHSba3DBPyP5cWPYxoqa9COyqn76UdwKs5Q4KR4bSoPSAkiJ402O3oW33dLe5Aod21jlJQmPSvk28bYJ7/OvXaOHviDRWxehJZTvw3cStupwT9JJeplePpNpQkj6rn2@b6d0RNOLkNBTml7S4ekh7M8hPrt4H8e/AQ "Java (JDK) – Try It Online") / [PCRE2 v10.40+](https://ato.pxeger.com/run?1=XVFBbtswEESvfgVBEBU3pmxJUdoatOBD6wIGiqRQil7ChFBUKhYqUwJFpwaSvKSXAEHR3_SevqYrJ5f0wOUOd3ZmSf586Nbd_d9Xf-YLTAhzJCN0SsmEdM5caWe6pigND6aTg4XW66Lxumw3Xd0Yp7gCqfJpHwgS4KrwUF-ZgWC9sb7nWn9cfVpqDYLEgJIoLEfVD1d7w0-_fFjmuaCf3-fLhFxTkC8LKNL7wnoeDAz9dZmfrk6OAwA5qm2te-M57UpnJpdF-d07DLqpN7WngtA0maWzN2-T2RHKjqrWcVZnkWRNVuF8_WCxOgYJN6SuOGvOeu8aYzGDMD7PMqosBST320us4LGIRBjD0G92XdN-M5yGVCBdYn_ZbnFKBPMEm85QAGN0LkeE7J3tM2Z2nu3rmI3HgNaE7994U_hyzZkTaDY8uCnw0rtAMAsA5GYYsQZTrtthLknwKrEkAybMyju0ufvvYzjIX1tfhe8eX19wFatUpbd8kXGuDne3F7sFjEElAwAGKoUD9sS-f95-R2EcR1H0BP8B "PHP - Attempt This Online") / [.NET](https://tio.run/##RY9Ra4MwFIX/isgFk9oUde6lElro836BsSDutgayG4kpSq2/3enG2ON3OHyc09kBXd@iMQs4WTq841gdj4QDO0fLlalU5Sp/sZNkTL2Nr@t44jFX2QYcuMr5DpbovA8v9qvTBj9DXsBTJsXNOqybloEJNAWgqXt4PkEtwYi@M9qHIiz0jUF9aOyDvDA@yLZCLKEuk2peBQxIlpp89ZMUQMLgH6cbxzGfNoc7fNS@abFn0RjtgPhv/OTT4LRH0drez@ustPjnQJBdbxpNGADN87wkIntPkm8 "PowerShell – Try It Online") Alternative 38 bytes, slower in most of the regex engines: (?=((\2x|^x?)+)\1(\2x)?)(\4\3\3|^\3)*$ --- # Perl / Java / PCRE, 39 bytes ^((((\3|^x)xx)*)x?+)(?=(\1*)\2+$)\1*$\5 [Try it online!](https://tio.run/##RU7LasMwEPyVJYhYG9tYdvElsmIH0mtPvdWJSEMMAjVxJRdUVPfXXcUNZA/LzOxjpj8bXU4f30AMB6@vp6MGkvFARbXbvm43I3RXQ4kVjFcbjh5UFxj63qjLAIv2suAjNFrYXquBRmmU2K93O4QTmaR5kuP587ZUP1QWdFwTifz2ywbHo2l0VaBv9Fu@F6GzPb/7qjslqhLzOKA4Rq86oDRyETgIS4ggfiEjJkNP7HI5h5uzheA5/89KFB/HUcrnl52U04GGap9@Dg6dwxW6OkZaC9rmK2yLmGAApC2niaVFydgf "Perl 5 – Try It Online") - Perl [Try it online!](https://tio.run/##bVLvT9swEP3OX3GLmGq3xaRMfJmJ0DZt0iTYJvjYFslNnNbgXDLboQHG396d0@wHEv5i393zO7/nu1X36ui2uNuZqqldgFuKhanFWML/mTYY@2rO6bXuqHLQtCtrcsit8h4ulUF4giHngwq03demgIoq7Do4g2tQbu3nSw5h4@qth89drptgarp5APDFWA1lhnrbH1ki8rrQguoJlx/bstROF1daFdrBqoe9TLI/N4ew5FwOff00yO0m8jPmsxVpUMWFQc04f5Nhay03JfNC/2yV9Sw5Ho/HCedPL6F7BsbCqwRPxBD@MhDBMTGsCHcn/SQbLXAU9yCf97nnHyoE7RBcNpxIbdXEBp5LcmNV11YrhMesJEYt4TpXiCTdYNMGyCCqHXLs@sEHXQmDXMKgs4eJjfLfdBfomb3FAIMhlt5OHHsQEmKQONTnS7BUjijhG2sCS47oEwgfAFOqfMVAY@BEo5zXFDA7T5d8Cjh7tSisxnXYnJ3AOUQkvKdttiTGfKPcfNkNevoIZ0sJH5xTD16UxlrWTUfdqDcFoKxd1EbPyDCVgGcZzmibTEjgpQr5hhyqiM2Jah@xfnKRBvwTke8nRmydatjQIq@bh@/llcK1pk7pFDmPSktgFbXHgryLf/vIB5NrcmzrTNAsfiqXj1lwbfyff@WGPAwlS976hCzh8jmugzhVuxtGa/Hu103Hu46PeXc@4ew8Y4vZmC9OJoecDoeL010coF16dHKapr8B "Java (JDK) – Try It Online") - Java [Try it online!](https://tio.run/##nVJLb9swDL77VxCCAIuJHT@abkhlN5e2QIBhh3W3uhUcR6mNOrIhK4CBLL89o4P1smN5IPj6@FEUt@VQXzZPzzlYXe4gtDvwfbBZ5qsvie9l677ugVvIgUUMFtBb/a6s7tuy0sKPFrO1UnXZOlV1h75ptS1EgbL4FQ1@QOQB7Cmo3vVUYJw2bhBKPW1@PCqFASRILamx9BrTqEE7wfrK6sW2rD6cJaXa5tA4FgBbpqvl6tv3dHXLUHr7zgre5LHkbb6n7oN4/v2w@YkST9DsBW9fBmdbbcjCMHnNc1YYhlQ8HLeUoXAQB2GCE16PfdvttGAhC6hcEr7qjsZN2Cwl0As1IB2/Sg/gymz@@dxk@TVP1nyORA3iuqFD6apacBsQ2bQuXTrhj37ADSLCaRqxQV3V3TSXBHpKImHygRt5Jprzf2sVKC9vgqS4@fM24jjiDMf1HMU6F0UywyKdcySDF7eXr322d6UPDTB@snd3YXJm9xXtZUEXIPWoK4iOg422jYmmm/hMXeJwmcbxXw "Bash – Try It Online") - PCRE1 [Try it online!](https://tio.run/##XVDfa4MwEH7vXxFCwFzVVl27UVLpyzYojD1se6ttsC5WmY0hpiB0@9vdWfa0wB336/u@y5nKDOuNqQxhlqSEzimZEWPVSVplmrxQ3JvPphspq7xxsmjPpm6UzXgGInubd15APLQSi/KkxgHtlHYdl/J5@/IkJQQkBqREYjGpdS075Tg1hVWzY158OYtONvW5djQgdJGsFqv7h2S1pCAmZWs5q9NIsCYtkb3j7x@P21cQcCV1yVmz65xtlMYIwnifpjTTFHC4uxyxg@UgCsIYRrzqTdN@Kk5DGuC4QHzRXrQbsesEQTskQB/txYSQm7L@y5lep7c@Rr4PKE347ULn3BUVZzZAsfFcKnfc672AaQAg13HFGlRRteNeguBXYkHGnDAtflDm599ZOYjhwPFld9@HHvoeptBvfOCblGfxFLLEZ4ABy5bDEIWLJIp@AQ "PHP – Try It Online") / [Attempt This Online!](https://ato.pxeger.com/run?1=XVDdSsMwFMbbPUUIgeZs7dbWTR1Z6Y0KA_FCvVs11JraYpeWNIOC-ga-gTeC6Dvp03i67cpATs7P953v5Lx_NkXz8XvwtojRIcyQiNAJJWPSGPUojWqqNFPcmYyHsZRFWlmZ1eumrJRJeAIiuZq0jkscvDkm5aPqAdoqbVsu5fny4kxKcEkA2BIbi0GpS9kqy2mTGTW-T7Mna9DIqlyXlrqETsP5dH50HM5nFMQgrw1nZeQLVkU5dm_59c3p8hIEPJMy56xatdZUSqMHXnAbRTTRFBDcbu6xgmnXd70Aer7qmqp-UJx61EW4QH5Wb7TtuYsQSStsgNa_FQNCtsp6HzO9iLZ19EYjQGnCtxtapzYrODMuivXrUqnlTue4TAMAee5HLEFlRd3PJQh-JRCkjwnT4hVlXv-tlYP42tjcO_lx7jie5PDlroOugyF08Qh4HPEkGEISjhigw5LZDv6xf759bxr6_i76Aw "PHP - Attempt This Online") - PCRE2 This is the same as the 40 byte regex below, but drops .NET support by using a possessive quantifier, `x?+` instead of `|^$`, to match \$0^4\$. This works because `x?+` will always consume 1 `x` if it can, and will only consume 0 `x`s if \$\it\text{tail}=0\$, which can happen in two ways: - If the input was \$0\$, in which case `\1` and `\2` will have both captured \$0\$, and the second half of the regex will match. - If the input was nonzero, in which case `\2` will have captured the entire nonzero input value, making it impossible for the second half of the regex to match, as `\2+` won't be able to match with \$\it\text{tail}=0\$. # Perl / Java / PCRE / .NET, <s>42</s> 40 bytes ^((((\3|^x)xx)*)x)(?=(\1*)\2+$)\1*$\5|^$ [Try it online!](https://tio.run/##RU7LasMwEPyVJYhYG9tYdvGlshIH0mtPvVWJSEsMAjVxJRdUVPfXXcUNZA/LzOxjpj9ZU08f30Ash2Au70cDpOCRima3fdmuR@gulhInGG/WHAPoLjIMvdXnARbyvOAjtEa43uiBJnmSua83N8QTleVlVuLp87q0uass6vhIFPLrLxcdj7Y1TYWhNa/lXsTO9vzmq2@U6EbM44jSFIPugNLEJ@AhLiGC@IWC2AIDccvlHG7OFoOX/D8r0XwcR6WenndKTQcaSz78HDx6jyv0SDeCynKFskoJRkBkPU0sr2rG/gA "Perl 5 – Try It Online") - Perl [Try it online!](https://tio.run/##bVLLbtswELznK7ZCCpO2w8gpcikjBG3RAgWatkiOtgPQEmUzoVYqScXK69vdpaw@AoQXcneHs5zh3qg7dXRT3O5M1dQuwA3FwtRiLOH/TBuMfTXn9Fp3VDlo2pU1OeRWeQ8XyiA8wpDzQQXa7mpTQEUVdhWcwTUot/bzJYewcfXWw@cu100wNd08APhirIYyQ73tjywReV1oQfWEy49tWWqni0utCu1g1cNeJtmfm0NYci6Hvn4a5HYT@Rnz2Yo0qOKbQc04f5Nhay03JfNC/2qV9Sw5Ho/HCeePL6F7BsbCqwSPxBD@MhDBMTGsCHcr/SQbLXAU9yCf97nnnyoE7RBcNpxIbdXEBp5LcmNV11YrhIesJEYt4SpXiCTdYNMGyCCqHXLs6t4HXQmDXMKgs4eJjfLfdRfomb3FAIMhlt5OHHsQEmKQONTnS7BUjijhG2sCS47oEwgfAFOqfMVAY@BEo5zXFDA7T5d8Cjh7tSisxnXYnJ3AOUQkvKdttiTGfKPcfNkNevoIZ0sJH5xT916UxlrWTUfdqDcFoKxd1EbPyDCVgGcZzmibTEjghQr5hhyqiM2Jah@xfnKRBvwTke8nRmydatjQIq@b@x/lpcK1pk7pFDmPSktgFbXHgryLf/vAB5NrcmzrTNAsfiqXD1lwbfyff@WGPAwlS976hCzh8jmugzhVu2tGa/Hu6brjXcfHvOPsPGOL2ZgvTiaHnA6Hi9On68NdnKBdenRymqa/AQ "Java (JDK) – Try It Online") - Java [Try it online!](https://tio.run/##nVJLb9swDL77VxCCAIuJHT@abkhlL5etQIBhh3W3uhEcR6mNObIhK4CBNL89pYP1smN5IPj6@FEUd@VQXzePTzlYXe4htHvwfbBZ5qtPie9l677ugVvIgUUMFtBb/aqs7tuy0sKPFrO1UnXZOlV1x75ptS1EgbL4HQ1@QOQBHCioXvVUYJw2bhBKPW5@/lAKA0iQWlJj6TWmUYN2gvWV1YtdWf11lpRqm2PjWABsma6Wqy9f09U9Q@kdOit4k8eSt/mBug/i6c/3zS@UeIbmIHj7PDjbakMWhslLnrPCMKTi4bSjDIWDOAgTnPB67NturwULWUDlkvBVdzJuwmYpgZ6pAen4RXoAN2bzz@cmy295suZzJGoQtw0dS1fVgtuAyKZ16dIJf/QDbhARztOIDeqq7qa5JNBTEgmTD9zIC9Fc/lurQHndCpLi7m074jjiDEcU61wUyQyLdM6RDF7cv2359XO/7d34QwOMn@3DQ5hc2LeKFrOgE5B61BVEp8FGu8ZE01F8pK5xuEzj@B0 "Bash – Try It Online") - PCRE1 [Try it online!](https://tio.run/##XVDfa8IwEH73rwgh0Jy22na6IbH4sg2EsYdtb1ZD7VJbVtOQRiiof3t3lT0tcMf9@r7vcqY0/WptSkOYJQmhM0qmxFh1lFaZOssV92bT8VrKMqudzJuTqWplU56CSD9mrecTD63AojyqYUA7pV3LpXzdvL1ICT6JACmRWIwqXclWOU5NbtX0kOU/zqKTdXWqHPUJncfL@fLxKV4uKIhR0VjOqiQUrE4KZG/559fz5h0EXEhVcFZvW2drpTGCINolCU01BRxuzwfsYNkP/SCCAa86UzffitOA@jguEJ83Z@0G7CpG0BYJ0Ic7MSLkrqz/cqZXyb2P0WQCKE34/UKnzOUlZ9ZHseFcKnPc6zyfaQAgl2HFClReNsNeguBXIkGGnDAtbihz@3dWDqLfc3zpw3XfQdfBGDrg64Sn0RjSeMIAA5YurnvW92Ewj8PwFw "PHP – Try It Online") / [Attempt This Online!](https://ato.pxeger.com/run?1=XVDdSsMwFMbbPUUIgeZs7dbWTR1Z2Y0Kgnih3q0u1Jq6YJeWNIOC-ga-gTeC6Dvp03i67cpATs7P953v5Lx_1qv64_fgbTZHhzBLEkJHlAxJbdWjtKous1xxbzTsz6VcZaWTebWudalsylMQ6fWo8Xzi4S0wKR9VBzBOGddwKc8vLs-kBJ9EgC2xsehpo2WjHKd1btXwPsufnEUjS73WjvqEjuPpeHp0HE8nFESvqCxnOgkFK5MCuzf85vb04goEPBNdcFYuGmdLZdCDILpLEpoaCghuNvdYwbQf-kEEHV-1dVk9KE4D6iNcID-vNsZ13FmMpAU2QBveiR4hW2Wzj5mZJds6eoMBoDTh2w2tM5evOLM-inXrUpnjXuv5zAAAee5G1KDyVdXNJQh-JRKkiwkz4hVlXv-tlYP42rgiOPnhS44nPXxZttC20IcW-DzhadSHNB4wQIelk5cl2-E_9s93GIzjMNxFfw "PHP - Attempt This Online") - PCRE2 [Try it online!](https://tio.run/##RY/daoNAEIVfRWTAXe0GteQmsiSQ6z6BPyB2Ehe2s7JucInx2a22lM7V@Q6Hw5zBTGjHHrVewcrS4h19fToRTuwSrQ3brnp/NZ57z2PuOTtLVmUxr/IE@CagOr4aWKPLW3g1X4PS@BnyAp4yLW7GYtv1DHSgKABFw8PxGVoJWoyDVi4UYaFuDNpDZx7khHZBvgcSCW2Z1stWwIBkqcjVP04BJDT@cbZzkvB577CHj9Z1PY4s8lEMxH/tJ58nqxyK3oxu2d7Kin8OBJltqFaEAdCyLGsq8mOafgM "PowerShell – Try It Online") - .NET This uses the equivalent of `^(\1xx|^x)*$` to match a perfect square using a nested backreference (made more complicated by needing to capture that square minus \$1\$), and then uses a square-testing algorithm which works thanks to the Chinese remainder theorem (which only requires ECMAScript or better, and is the reason for needing to capture the square minus \$1\$), to assert that the captured perfect square is the square root of the inputted number. The latter algorithm is [explained in this post](https://codegolf.stackexchange.com/questions/179239/find-a-rocco-number/179420#179420), and this exact square-testing regex is used [in the second answer in this post](https://codegolf.stackexchange.com/questions/144561/golf-the-pseudoprimes/179024#179024). ``` ^ # tail = N = input number ( # \1 = the largest perfect square for which the # subsequent expression matches; tail -= \1 ( # \2 = \1 - 1 ( # \3 = nested backreference # On the first iteration, \3 = 1 + 2 = 3; # on subsequent iterations, \3 = \3 + 2 (\3|^x) xx )* # iterate \3 any number of times (may be zero); \2 # becomes the total of all these iterations ) x # \1 = \2 + 1 ) # Assert that N == \1^2 (?= (\1*)\2+$ # iff \1*\1 == N, the first match here must capture \5=0 ) \1*$\5 # assert \1 divides N-\1, and \5==0 | ^$ # Allow us to match N=0, which can't be matched above ```