Quine

From APL Wiki
Revision as of 22:16, 10 September 2022 by Adám Brudzewsky (talk | contribs) (Text replacement - "<source" to "<syntaxhighlight")
Jump to navigation Jump to search

A quine is a program which takes no input and produces a copy of its own source code as its only output.

Traditional expression

In APL, a quine is listed in the FinnAPL idiom library as "an expression giving itself": <syntaxhighlight lang=apl>

     1⌽22⍴11⍴1⌽22⍴11⍴

</source>

Modern update

In 2019, Nick Nikolov proposed to shorten it using the commute operator:[1] <syntaxhighlight lang=apl>

     1⌽,⍨9⍴1⌽,⍨9⍴

</source>

Explanation

This shorter version is explain as follows:[2]

  • <syntaxhighlight lang=apl inline>1⌽,⍨9⍴</source> the characters <syntaxhighlight lang=text inline>'1⌽,⍨9⍴'</source>
  • <syntaxhighlight lang=apl inline>9⍴</source> reshape to shape 9, resulting in <syntaxhighlight lang=text inline>'1⌽,⍨9⍴</source>
  • <syntaxhighlight lang=apl inline>,⍨</source> concatenate with itself, resulting in <syntaxhighlight lang=text inline>'1⌽,⍨9⍴'1⌽,⍨9⍴</source>
  • <syntaxhighlight lang=apl inline>1⌽</source> rotate one character to the left, getting the characters: <syntaxhighlight lang=text inline>1⌽,⍨9⍴1⌽,⍨9⍴</source>

Further Entries

Based on replicating quote

In May 2022, APL Farm user OsKaR31415 shared the following:[3] <syntaxhighlight lang=apl>

     '{∊⍵⍺⍵⍺,4/⍵}'{∊⍵⍺⍵⍺,4/⍵}'

</source>

Explanation

In this code, the main function is <syntaxhighlight lang=apl inline>{∊⍵⍺⍵⍺,4/⍵}</source> with the right argument <syntaxhighlight lang=apl inline>⍵</source> being single quote literal (spelled with four quotes, <syntaxhighlight lang=apl inline>'</source>, because single quotes delimit APL character literals, and quotes inside such must be doubled), and the left argument <syntaxhighlight lang=apl inline>⍺</source> being the character vector representation of the function (<syntaxhighlight lang=apl inline>'{∊⍵⍺⍵⍺,4/⍵}'</source>).

The idea behind this quine is that the only thing you need to have a string containing the original code is to reproduce this structure: [quote] [function] [quote] [function] [quote] [quote] [quote] [quote]. This is precisely what the function does. Given the representation of a function <syntaxhighlight lang=apl inline>⍺</source> (itself in this case), and character <syntaxhighlight lang=apl inline>⍵</source> (here, the quote), it produces the structure <syntaxhighlight lang=apl inline>⍵ ⍺ ⍵ ⍺ ⍵ ⍵ ⍵ ⍵</source>. A more explicit version would be <syntaxhighlight lang=apl inline>'{⍵,⍺,⍵,⍺,⍵,⍵,⍵,⍵}'{⍵,⍺,⍵,⍺,⍵,⍵,⍵,⍵}'</source> which simply concatenates together the required parts. The original quine is very similar, only using the shorter <syntaxhighlight lang=apl inline>4/⍵</source> to produce the 4 occurrences of <syntaxhighlight lang=apl inline>⍵</source>, and golfs away the spaces, instead opting for Enlist (<syntaxhighlight lang=apl inline>∊</source>) to flatten the intermediary nested array.

Based on code point of quote

In Jun 2022, Jay Foad shared the following:[4] <syntaxhighlight lang=apl>

     {,⍨⍵,⎕UCS 39}'{,⍨⍵,⎕UCS 39}'

</source>

Explanation

In this code, the main function is <syntaxhighlight lang=apl inline>{,⍨⍵,⎕UCS 39}</source> with the argument <syntaxhighlight lang=apl inline>⍵</source> being the function itself which avoids duplication of quotes by generating the quote from its Universal Character Set code point (<syntaxhighlight lang=apl inline>⎕UCS</source>).

The idea behind this quine is that the only thing you need to have a string containing the original code is to reproduce this structure: [function] [quote] [function] [quote]. This is precisely what the function does. Given the representation of a function <syntaxhighlight lang=apl inline>⍵</source> (itself in this case), it generates a quote and concatenates it on the right of the function definition, giving [function] [quote]. It then uses self-concatenation (<syntaxhighlight lang=apl inline>,⍨</source>) to repeat the two parts into the required four.

External links