[Pharo-users] mentor question 3 is there a formula for this
--- Begin Message --- Hello, I try now to solve this one : ntroduction The diamond kata takes as its input a letter, and outputs it in a diamond shape. Given a letter, it prints a diamond starting with 'A', with the supplied letter at the widest point. Requirements The first row contains one 'A'. The last row contains one 'A'. All rows, except the first and last, have exactly two identical letters. All rows have as many trailing spaces as leading spaces. (This might be 0). The diamond is horizontally symmetric. The diamond is vertically symmetric. The diamond has a square shape (width equals height). The letters form a diamond shape. The top half has the letters in ascending order. The bottom half has the letters in descending order. The four corners (containing the spaces) are triangles. Examples In the following examples, spaces are indicated by · characters. Diamond for letter 'A': A Diamond for letter 'C': ··A·· ·B·B· C···C ·B·B· ··A·· I noticed that if you take a quarter of it. you see this pattern 001 010 100 where a 0 is a space and a 1 is the character. Is there a easy way to make some sort of formula so I can make a output of this ? Roelof --- End Message ---
Re: [Pharo-users] mentor question 3 is there a formula for this
Formula? Well, it's pretty straight forward. Let's start with the size of the diamond (it field, actually). In the example, there are two lines above and two lines below the "C" line. C-A = 2. This number looks useful. The dimension is 2+1+2 square. How many spaces before a letter? C-letter i.e. C-A = 2 C-B = 1 and C-C = 0 The same number of spaces after the second/last occurrence of the letter on the line. The number of spaces between the letters on a line is the size minus the number of spaces before and after plus the two copies of the current line's letter. For the "B" line, there is one space before and after, 2x"B", leaving 5 - 1 -1 - 2 = 1 space between. For the "A" line, the simple arithmetic would give you -1, which also confirms that just one "A" is appropriate with no space between first and last letter on the line. (For "A", it is first and last, once only.) After that, you just need to iterate ($A to: $C), ($(C-1) to: $A by: -1) and do the arithmetic. On Tue, Apr 28, 2020 at 1:23 AM Roelof Wobben via Pharo-users < pharo-users@lists.pharo.org> wrote: > Hello, > > I try now to solve this one : > > ntroduction > > The diamond kata takes as its input a letter, and outputs it in a diamond > shape. Given a letter, it prints a diamond starting with 'A', with the > supplied letter at the widest point. > Requirements > >- The first row contains one 'A'. >- The last row contains one 'A'. >- All rows, except the first and last, have exactly two identical >letters. >- All rows have as many trailing spaces as leading spaces. (This might >be 0). >- The diamond is horizontally symmetric. >- The diamond is vertically symmetric. >- The diamond has a square shape (width equals height). >- The letters form a diamond shape. >- The top half has the letters in ascending order. >- The bottom half has the letters in descending order. >- The four corners (containing the spaces) are triangles. > > Examples > > In the following examples, spaces are indicated by · characters. > > Diamond for letter 'A': > > A > > Diamond for letter 'C': > > ··A·· > ·B·B· > C···C > ·B·B· > ··A·· > > > I noticed that if you take a quarter of it. you see this pattern > > 001 > 010 > 100 > > where a 0 is a space and a 1 is the character. > > Is there a easy way to make some sort of formula so I can make a output of > this ? > > > Roelof > > >
Re: [Pharo-users] mentor question 3 is there a formula for this
--- Begin Message --- Thanks, And the 5 can also be calculated by 2 * (char - $a) + 1 Roelof Op 28-4-2020 om 18:31 schreef Richard Sargent: Formula? Well, it's pretty straight forward. Let's start with the size of the diamond (it field, actually). In the example, there are two lines above and two lines below the "C" line. C-A = 2. This number looks useful. The dimension is 2+1+2 square. How many spaces before a letter? C-letter i.e. C-A = 2 C-B = 1 and C-C = 0 The same number of spaces after the second/last occurrence of the letter on the line. The number of spaces between the letters on a line is the size minus the number of spaces before and after plus the two copies of the current line's letter. For the "B" line, there is one space before and after, 2x"B", leaving 5 - 1 -1 - 2 = 1 space between. For the "A" line, the simple arithmetic would give you -1, which also confirms that just one "A" is appropriate with no space between first and last letter on the line. (For "A", it is first and last, once only.) After that, you just need to iterate ($A to: $C), ($(C-1) to: $A by: -1) and do the arithmetic. On Tue, Apr 28, 2020 at 1:23 AM Roelof Wobben via Pharo-userswrote: Hello, I try now to solve this one : ntroduction The diamond kata takes as its input a letter, and outputs it in a diamond shape. Given a letter, it prints a diamond starting with 'A', with the supplied letter at the widest point. Requirements The first row contains one 'A'. The last row contains one 'A'. All rows, except the first and last, have exactly two identical letters. All rows have as many trailing spaces as leading spaces. (This might be 0). The diamond is horizontally symmetric. The diamond is vertically symmetric. The diamond has a square shape (width equals height). The letters form a diamond shape. The top half has the letters in ascending order. The bottom half has the letters in descending order. The four corners (containing the spaces) are triangles. Examples In the following examples, spaces are indicated by · characters. Diamond for letter 'A': A Diamond for letter 'C': ··A·· ·B·B· C···C ·B·B· ··A·· I noticed that if you take a quarter of it. you see this pattern 001 010 100 where a 0 is a space and a 1 is the character. Is there a easy way to make some sort of formula so I can make a output of this ? Roelof --- End Message ---
Re: [Pharo-users] mentor question 2.
String>> isValidBinary ^self allSatisfy: [:each | each = $0 or: [each = $1]] binaryToDecimal "The caller should ensure that self isValidBinary before calling this." ^self inject: 0 into: [:acc :each | acc*2 + (each codePoint - $0 codePoint)] On Mon, 27 Apr 2020 at 06:05, Roelof Wobben via Pharo-users wrote: > > Hello, > > I have to make some code that convert a binary to a decimal and im not > allowed to use the convert methods that Pharo has. > > So I have written this : > > > decimalFromBinary: aString > | result isValid | > isValid = self isValidBinary: aString. > isValid > ifTrue: [ result := 0. > aString reverse > withIndexDo: > [ :digit :index | result := result + (digit > digitValue * (2 raisedTo: index - 1)) ]. > ^ result ] > ifFalse: [ ^ nil ] > > isValidBinary: aString > ^ aString allSatisfy: [ :c | c = 0 or: [ c = 1 ] ] > > > but on the first method I see a message that the temp variables are read > before written. > and the second one I see a message that I use a or instead of searching > literals. > > Where did I think wrong here ? > > Roelof > >