Sponsored Content
Top Forums Shell Programming and Scripting awk diamond code golf (just for fun!) Post 302986567 by Don Cragun on Sunday 27th of November 2016 12:39:04 PM
Old 11-27-2016
Yes, this is fun. Smilie

This isn't quite as compact as Scrutinizer's approach (and calculates each line as it goes instead of memorizing lines), but there are some fun games you can play with this one using multi-character strings that produce different artifacts with Scrutinizer's code and with pilnet101's code:
Code:
#!/bin/ksh
IAm=${0##*/}
if [ $# -gt 2 ]
then	printf 'USAGE:		%s [size [character]]

DESCRIPTION:	Print a diamond  of "character" characters that is "size"
		characters wide at the widest point.

OPERANDS:	size		The size of the diamond.  (Default 15).
		character	The character to print. (Default "*".)

EXAMPLES:	In addition to the obvious single character "character"
		operands, try commands like:

		    diamond 20 "<>"

		and:

		    diamond 29 "Happy New Year "\n' "$IAm" >&2
	exit 1
fi
awk -v s="${1:-15}" -v c="${2:-*}" '
BEGIN {	n = s - ((s + 1) % 2)	# # of lines to print.
	m = int((s + 1) / 2)	# middle line #.
	for(i = 1; i <= s; i++)	# S is a string of s c characters (the middle
		S = S c		# and longest line).
	w = 2 - s % 2		# The width (i.e. # of c characters to print on
				# the current line) which will be 1 or 2 on the
				# first line.
	for(i = 1; i <= n; i++){# Print each of the n lines...
		printf("%*s%.*s\n",(s - w) / 2,N,w,S)
		w += i < m ? 2 : -2	# ... and update w for the next line to
					# be printed (i.e. 2 more if we have not
					# reached the middle line yet; otherwise
					# 2 less).
	}
}'

and for the obligatory 1-liner:
Code:
awk -v s="${1:-15}" -v c="${2:-*}" 'BEGIN{n=s-((s+1)%2);m=int((s+1)/2);for(i=1;i<=s;i++)S=S c;w=2-s%2;for(i=1;i<=n;i++){printf("%*s%.*s\n",(s-w)/2,N,w,S);w+=i<m?2:-2}}'

If you store either of these in a file named diamond, make it executable, and invoke it with:
Code:
./diamond 20 '<>'

you get:
Code:
         <>
        <><>
       <><><>
      <><><><>
     <><><><><>
    <><><><><><>
   <><><><><><><>
  <><><><><><><><>
 <><><><><><><><><>
<><><><><><><><><><>
 <><><><><><><><><>
  <><><><><><><><>
   <><><><><><><>
    <><><><><><>
     <><><><><>
      <><><><>
       <><><>
        <><>
         <>

and with:
Code:
./diamond 29 'Happy New Year '

you get:
Code:
              H
             Hap
            Happy
           Happy N
          Happy New
         Happy New Y
        Happy New Yea
       Happy New Year 
      Happy New Year Ha
     Happy New Year Happ
    Happy New Year Happy 
   Happy New Year Happy Ne
  Happy New Year Happy New 
 Happy New Year Happy New Ye
Happy New Year Happy New Year
 Happy New Year Happy New Ye
  Happy New Year Happy New 
   Happy New Year Happy Ne
    Happy New Year Happy 
     Happy New Year Happ
      Happy New Year Ha
       Happy New Year 
        Happy New Yea
         Happy New Y
          Happy New
           Happy N
            Happy
             Hap
              H

Compare these outputs to the results you get with the other proposals using the same counts and strings. Smilie With single character strings we all produce the same output.

Last edited by Don Cragun; 11-27-2016 at 01:50 PM.. Reason: Add note about single-character string results.
These 2 Users Gave Thanks to Don Cragun For This Post:
 

7 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

Diamond operator in Until Statement (perl)

Hello: I have the following perl script which is giving me trouble inside the second elsif statement. The purpose of the script is to go through a file and print out only those lines which contain pertinent information. The tricky part came when I realized that certain items actually spanned... (5 Replies)
Discussion started by: erichpowell
5 Replies

2. Shell Programming and Scripting

Fun with awk

uggc://ra.jvxvcrqvn.bet/jvxv/EBG13 #!/usr/bin/awk -f BEGIN { for (n=0;n<26;n++) { x=sprintf("%c",n+65); y=sprintf("%c",(n+13)%26+65) r=y; r=tolower(y) } } { b = "" for (n=1; x=substr($0,n,1); n++) b = b ((y=r)?y:x) print b } ... (0 Replies)
Discussion started by: colemar
0 Replies

3. Shell Programming and Scripting

More fun with awk

#!/usr/bin/ksh ls -l $@ | awk ' /^-/ { l = 5*log($5) h = sprintf("%7d %-72s",$5,$8) print "\x1B ls command with histogram of file sizes. The histogram scale is logaritmic, to avoid very short bars for smaller files or very long bars for bigger files. Screenshot: (4 Replies)
Discussion started by: colemar
4 Replies

4. Shell Programming and Scripting

Perl Diamond Operator

I know that when using 'while (<FILE>) {}', Perl reads only one line of the file at one time, and store it in '$_'. Can I change some parameters so that 'while (<>) {}' can read more than one lines, like 2 or 5 lines at one time? Thanks for the help! (1 Reply)
Discussion started by: zx1106
1 Replies

5. UNIX for Dummies Questions & Answers

fun and easy awk question

I have a file called mytitles.txt containing a list of book titles I have a second file called abfile.txt containing a list of book titles (in the 3rd field) and it has author info and copyright year info as well.. I want to search mytitles.txt for a match in the 3rd field of abfiles.txt, and... (2 Replies)
Discussion started by: glev2005
2 Replies

6. What is on Your Mind?

Place your bets! - Ryder Cup 2012 (Golf)

Who will win the 2012 Ryder Cup. Europe vs USA There is an open event in the Event Prediction Forum. The event closes on 27th Sep 2012. 2012 Ryder Cup - Wikipedia, the free encyclopedia (0 Replies)
Discussion started by: ni2
0 Replies

7. Shell Programming and Scripting

To print diamond asterisk pattern based on inputs

I have to print the number of stars that increases on each line from the minimum number until it reaches the maximum number, and then decreases until it goes back to the minimum number. After printing out the lines of stars, it should also print the total number of stars printed. I have tried... (13 Replies)
Discussion started by: rohit_shinez
13 Replies
All times are GMT -4. The time now is 03:41 PM.
Unix & Linux Forums Content Copyright 1993-2022. All Rights Reserved.
Privacy Policy