Encode: Difference between revisions
(Created page with "{{Built-in|Encode|⊤}}, also called '''Represent''' or '''Antibase''', is a dyadic primitive function which computes the representation of the right argument in the r...") |
m (Text replacement - "<source" to "<syntaxhighlight") |
||
(2 intermediate revisions by 2 users not shown) | |||
Line 1: | Line 1: | ||
{{Built-in|Encode|⊤}}, also called '''Represent''' or '''Antibase''', is a [[dyadic]] [[primitive function]] which computes the representation of the right argument in the radix system defined by the left argument. Some implementations add [[monadic]] usage to this function, which computes the binary representation using as many bits as needed. Encode is the [[inverse]] of [[Decode]] < | {{Built-in|Encode|⊤}}, also called '''Represent''' or '''Antibase''', is a [[dyadic]] [[primitive function]] which computes the representation of the right argument in the radix system defined by the left argument. Some implementations add [[monadic]] usage to this function, which computes the binary representation using as many bits as needed. Encode is the [[inverse]] of [[Decode]] <syntaxhighlight lang=apl inline>⊥</syntaxhighlight> with the same left argument X, when X is a [[vector]]. | ||
== Concept == | == Concept == | ||
Encode works by finding the "digits" one by one from the rightmost digit. Let's consider < | Encode works by finding the "digits" one by one from the rightmost digit. Let's consider <syntaxhighlight lang=apl inline>0 7 24 60⊤12345</syntaxhighlight> (convert 12345 minutes to weeks, days, hours, and minutes) as an example. | ||
< | <syntaxhighlight lang=apl> | ||
60|12345 ⍝ Minute's digit; 45 minutes | 60|12345 ⍝ Minute's digit; 45 minutes | ||
45 | 45 | ||
Line 18: | Line 18: | ||
7÷⍨8-1 ⍝ 1 week remaining to convert | 7÷⍨8-1 ⍝ 1 week remaining to convert | ||
1 ⍝ No more conversion needed, since there is no limit for the highest digit | 1 ⍝ No more conversion needed, since there is no limit for the highest digit | ||
</ | </syntaxhighlight> | ||
Collecting all the digits gives the desired result. | Collecting all the digits gives the desired result. | ||
< | <syntaxhighlight lang=apl> | ||
0 7 24 60⊤12345 | 0 7 24 60⊤12345 | ||
1 1 13 45 | 1 1 13 45 | ||
</ | </syntaxhighlight> | ||
If the left argument has high [[rank]], the vectors over the first [[axis]] act as independent radix systems. | If the left argument has high [[rank]], the vectors over the first [[axis]] act as independent radix systems. | ||
< | <syntaxhighlight lang=apl> | ||
⎕←mat←8 3⍴2 10 16 ⍝ Base 2, 10, and 16, being able to represent at most 8 digits | ⎕←mat←8 3⍴2 10 16 ⍝ Base 2, 10, and 16, being able to represent at most 8 digits | ||
2 10 16 | 2 10 16 | ||
Line 48: | Line 48: | ||
0 2 7 | 0 2 7 | ||
1 1 9 | 1 1 9 | ||
</ | </syntaxhighlight> | ||
== Examples == | == Examples == | ||
Line 54: | Line 54: | ||
A common use case is to convert an integer to base N, usually base 2 or 10. However, Encode does not know how many digits to produce, so it needs to be supplied as the [[shape]] of the left argument. | A common use case is to convert an integer to base N, usually base 2 or 10. However, Encode does not know how many digits to produce, so it needs to be supplied as the [[shape]] of the left argument. | ||
< | <syntaxhighlight lang=apl> | ||
10⊤12345 ⍝ This does not work | 10⊤12345 ⍝ This does not work | ||
5 | 5 | ||
Line 61: | Line 61: | ||
((1+⌊10⍟12345)⍴10)⊤12345 ⍝ Convert to decimal digits using just as many digits as needed | ((1+⌊10⍟12345)⍴10)⊤12345 ⍝ Convert to decimal digits using just as many digits as needed | ||
1 2 3 4 5 | 1 2 3 4 5 | ||
</ | </syntaxhighlight> | ||
Encode can be also used to convert a measure given in the smallest unit to a hierarchy of units. For example, given that 1 day = 24 hours, 1 hour = 60 minutes, and 1 minute = 60 seconds, how many days/hours/minutes/seconds is 210859 seconds? | Encode can be also used to convert a measure given in the smallest unit to a hierarchy of units. For example, given that 1 day = 24 hours, 1 hour = 60 minutes, and 1 minute = 60 seconds, how many days/hours/minutes/seconds is 210859 seconds? | ||
< | <syntaxhighlight lang=apl> | ||
0 24 60 60⊤210859 | 0 24 60 60⊤210859 | ||
2 10 34 19 | 2 10 34 19 | ||
</ | </syntaxhighlight> | ||
Another common usage of Encode is to simulate "divmod": a function which, given two integers, computes the quotient and remainder at once. The construct can also be used to extract the integer part and fractional part of a real number. | Another common usage of Encode is to simulate "divmod": a function which, given two integers, computes the quotient and remainder at once. The construct can also be used to extract the integer part and fractional part of a real number. | ||
< | <syntaxhighlight lang=apl> | ||
⌊7÷3 ⍝ Quotient | ⌊7÷3 ⍝ Quotient | ||
2 | 2 | ||
Line 81: | Line 81: | ||
0 1⊤○1 ⍝ Integer and fractional parts of pi | 0 1⊤○1 ⍝ Integer and fractional parts of pi | ||
3 0.1415926536 | 3 0.1415926536 | ||
</ | </syntaxhighlight> | ||
Encode has an important property with array [[index]]: Given an arbitrary array A with [[shape]] S, encoding a [[ravel|raveled]] index by S gives the original index in A. This can be used to generate all indices of a given array or array shape. Note that [[index origin]] 0 (< | Encode has an important property with array [[index]]: Given an arbitrary array A with [[shape]] S, encoding a [[ravel|raveled]] index by S gives the original index in A. This can be used to generate all indices of a given array or array shape. Note that [[index origin]] 0 (<syntaxhighlight lang=apl inline>⎕IO←0</syntaxhighlight>) is required for this to hold. | ||
< | <syntaxhighlight lang=apl> | ||
⎕IO←0 | ⎕IO←0 | ||
⎕A[17]=(2 3 4⊤17)⌷2 3 4⍴⎕A | ⎕A[17]=(2 3 4⊤17)⌷2 3 4⍴⎕A | ||
Line 93: | Line 93: | ||
0 0 0 0 1 1 1 1 2 2 2 2 0 0 0 0 1 1 1 1 2 2 2 2 | 0 0 0 0 1 1 1 1 2 2 2 2 0 0 0 0 1 1 1 1 2 2 2 2 | ||
0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 | 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 | ||
</ | </syntaxhighlight> | ||
== External links == | == External links == | ||
Line 105: | Line 105: | ||
* [https://help.dyalog.com/latest/#Language/Primitive%20Functions/Encode.htm Dyalog] | * [https://help.dyalog.com/latest/#Language/Primitive%20Functions/Encode.htm Dyalog] | ||
* [http://microapl.com/apl_help/ch_020_020_650.htm APLX] | * [http://microapl.com/apl_help/ch_020_020_650.htm APLX] | ||
* J [https://www.jsoftware.com/help/dictionary/d402.htm Dictionary], [https://code.jsoftware.com/wiki/Vocabulary/numberco NuVoc] (as < | * J [https://www.jsoftware.com/help/dictionary/d402.htm Dictionary], [https://code.jsoftware.com/wiki/Vocabulary/numberco#dyadic NuVoc] (as <syntaxhighlight lang=j inline>#:</syntaxhighlight>) | ||
{{APL built-ins}}[[Category:Primitive functions]] | {{APL built-ins}}[[Category:Primitive functions]] |
Latest revision as of 22:21, 10 September 2022
⊤
|
Encode (⊤
), also called Represent or Antibase, is a dyadic primitive function which computes the representation of the right argument in the radix system defined by the left argument. Some implementations add monadic usage to this function, which computes the binary representation using as many bits as needed. Encode is the inverse of Decode ⊥
with the same left argument X, when X is a vector.
Concept
Encode works by finding the "digits" one by one from the rightmost digit. Let's consider 0 7 24 60⊤12345
(convert 12345 minutes to weeks, days, hours, and minutes) as an example.
60|12345 ⍝ Minute's digit; 45 minutes 45 60÷⍨12345-45 ⍝ 205 hours remaining to convert 205 24|205 ⍝ Hour's digit; 13 hours 13 24÷⍨205-13 ⍝ 8 days remaining to convert 8 7|8 ⍝ Day's digit; 1 day 1 7÷⍨8-1 ⍝ 1 week remaining to convert 1 ⍝ No more conversion needed, since there is no limit for the highest digit
Collecting all the digits gives the desired result.
0 7 24 60⊤12345 1 1 13 45
If the left argument has high rank, the vectors over the first axis act as independent radix systems.
⎕←mat←8 3⍴2 10 16 ⍝ Base 2, 10, and 16, being able to represent at most 8 digits 2 10 16 2 10 16 2 10 16 2 10 16 2 10 16 2 10 16 2 10 16 2 10 16 mat⊤121 ⍝ 121 is 1111001 in binary, 121 in decimal, 79 in hexadecimal 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0 1 0 0 2 7 1 1 9
Examples
A common use case is to convert an integer to base N, usually base 2 or 10. However, Encode does not know how many digits to produce, so it needs to be supplied as the shape of the left argument.
10⊤12345 ⍝ This does not work 5 (10⍴10)⊤12345 ⍝ Convert to ten decimal digits, giving leading zeros if too small 0 0 0 0 0 1 2 3 4 5 ((1+⌊10⍟12345)⍴10)⊤12345 ⍝ Convert to decimal digits using just as many digits as needed 1 2 3 4 5
Encode can be also used to convert a measure given in the smallest unit to a hierarchy of units. For example, given that 1 day = 24 hours, 1 hour = 60 minutes, and 1 minute = 60 seconds, how many days/hours/minutes/seconds is 210859 seconds?
0 24 60 60⊤210859 2 10 34 19
Another common usage of Encode is to simulate "divmod": a function which, given two integers, computes the quotient and remainder at once. The construct can also be used to extract the integer part and fractional part of a real number.
⌊7÷3 ⍝ Quotient 2 3|7 ⍝ Remainder 1 0 3⊤7 ⍝ Quotient and remainder at once 2 1 0 1⊤○1 ⍝ Integer and fractional parts of pi 3 0.1415926536
Encode has an important property with array index: Given an arbitrary array A with shape S, encoding a raveled index by S gives the original index in A. This can be used to generate all indices of a given array or array shape. Note that index origin 0 (⎕IO←0
) is required for this to hold.
⎕IO←0 ⎕A[17]=(2 3 4⊤17)⌷2 3 4⍴⎕A 1 2 3 4⊤⍳×/2 3 4 ⍝ Generating all indices of a 2×3×4 array as columns 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 1 1 1 1 2 2 2 2 0 0 0 0 1 1 1 1 2 2 2 2 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3
External links
Lesson
Documentation
- Dyalog
- APLX
- J Dictionary, NuVoc (as
#:
)