[Question]
  [
This is a potato:
```
  @@
 @@@@
@@@@@@
@@@@@@
 @@@@
  @@
```
More generally, a size N potato is defined as the following shape: 
If N is even, it is 2 centered `@` symbols, followed by 4 centered `@` symbols, followed by 6 centered `@` symbols, all the way up to N centered `@` symbols; then, N centered `@` symbols, followed by N-2 centered `@` symbols, all the way down to 2.  
If N is odd, a size N potato is generated in the same way as described above, but we begin with 1 `@` symbol, rather than 2.
A potato is peeled by starting in the top right corner, and removing one `@` sign each step, going in a counterclockwise fashion. For instance, peeling a size-3 potato looks like this:
```
 @
@@@
@@@
 @
```
---
```
​
@@@
@@@
 @
```
---
```
 ​
 @@
@@@
 @
```
---
```
  ​
 @@
 @@
 @
```
---
```
 ​
 @@
 @@
 ​
```
---
```
 ​
 @@
 @
 ​
```
---
```
​
 @
 @
 ​
```
---
```
 ​
​
 @
 ​
```
  
# Challenge
Write a program, that, given an integer input, displays all of the steps of peeling a potato of that size.  
Trailing whitespace/newlines are allowed.
# Scoring
This is [code-golf](/questions/tagged/code-golf "show questions tagged 'code-golf'"); the shortest code in bytes wins.
  
  
  
## Sample Test Cases
***N=2***
```
@@
@@
@
@@
@@
 @
```
  
  
***N=7***
```
   @   
  @@@  
 @@@@@ 
@@@@@@@
@@@@@@@
 @@@@@ 
  @@@  
   @   
  @@@  
 @@@@@ 
@@@@@@@
@@@@@@@
 @@@@@ 
  @@@  
   @   
   @@  
 @@@@@ 
@@@@@@@
@@@@@@@
 @@@@@ 
  @@@  
   @   
   @@  
  @@@@ 
@@@@@@@
@@@@@@@
 @@@@@ 
  @@@  
   @   
   @@  
  @@@@ 
 @@@@@@
@@@@@@@
 @@@@@ 
  @@@  
   @   
   @@  
  @@@@ 
 @@@@@@
 @@@@@@
 @@@@@ 
  @@@  
   @   
   @@  
  @@@@ 
 @@@@@@
 @@@@@@
  @@@@ 
  @@@  
   @   
   @@  
  @@@@ 
 @@@@@@
 @@@@@@
  @@@@ 
   @@  
   @   
   @@  
  @@@@ 
 @@@@@@
 @@@@@@
  @@@@ 
   @@  
   @@  
  @@@@ 
 @@@@@@
 @@@@@@
  @@@@ 
   @   
   @@  
  @@@@ 
 @@@@@@
 @@@@@@
  @@@  
   @   
   @@  
  @@@@ 
 @@@@@@
 @@@@@ 
  @@@  
   @   
   @@  
  @@@@ 
 @@@@@ 
 @@@@@ 
  @@@  
   @   
   @@  
  @@@  
 @@@@@ 
 @@@@@ 
  @@@  
   @   
   @   
  @@@  
 @@@@@ 
 @@@@@ 
  @@@  
   @   
  @@@  
 @@@@@ 
 @@@@@ 
  @@@  
   @   
   @@  
 @@@@@ 
 @@@@@ 
  @@@  
   @   
   @@  
  @@@@ 
 @@@@@ 
  @@@  
   @   
   @@  
  @@@@ 
  @@@@ 
  @@@  
   @   
   @@  
  @@@@ 
  @@@@ 
   @@  
   @   
   @@  
  @@@@ 
  @@@@ 
   @@  
   @@  
  @@@@ 
  @@@@ 
   @   
   @@  
  @@@@ 
  @@@  
   @   
   @@  
  @@@  
  @@@  
   @   
   @   
  @@@  
  @@@  
   @   
  @@@  
  @@@  
   @   
   @@  
  @@@  
   @   
   @@  
   @@  
   @   
   @@  
   @@  
   @@  
   @   
   @   
   @   
   @   
 ​
 ​
 ​
 ​  
```
  
## Catalog
Based on [Is this number a prime?](https://codegolf.stackexchange.com/questions/57617/)
```
<style>body { text-align: left !important} #answer-list { padding: 10px; width: 290px; float: left; } #language-list { padding: 10px; width: 290px; float: left; } table thead { font-weight: bold; } table td { padding: 5px; }</style><script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <div id="language-list"> <h2>Shortest Solution by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr> </thead> <tbody id="languages"> </tbody> </table> </div> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr> </thead> <tbody id="answers"> </tbody> </table> </div> <table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr> </tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr> </tbody> </table><script>var QUESTION_ID = 101224; var ANSWER_FILTER = "!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe"; var COMMENT_FILTER = "!)Q2B_A2kjfAiU78X(md6BoYk"; var OVERRIDE_USER = 12012; var answers = [], answers_hash, answer_ids, answer_page = 1, more_answers = true, comment_page; function answersUrl(index) { return "https://api.stackexchange.com/2.2/questions/" + QUESTION_ID + "/answers?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + ANSWER_FILTER; } function commentUrl(index, answers) { return "https://api.stackexchange.com/2.2/answers/" + answers.join(';') + "/comments?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + COMMENT_FILTER; } function getAnswers() { jQuery.ajax({ url: answersUrl(answer_page++), method: "get", dataType: "jsonp", crossDomain: true, success: function (data) { answers.push.apply(answers, data.items); answers_hash = []; answer_ids = []; data.items.forEach(function(a) { a.comments = []; var id = +a.share_link.match(/\d+/); answer_ids.push(id); answers_hash[id] = a; }); if (!data.has_more) more_answers = false; comment_page = 1; getComments(); } }); } function getComments() { jQuery.ajax({ url: commentUrl(comment_page++, answer_ids), method: "get", dataType: "jsonp", crossDomain: true, success: function (data) { data.items.forEach(function(c) { if (c.owner.user_id === OVERRIDE_USER) answers_hash[c.post_id].comments.push(c); }); if (data.has_more) getComments(); else if (more_answers) getAnswers(); else process(); } }); } getAnswers(); var SCORE_REG = /<h\d>\s*([^\n,<]*(?:<(?:[^\n>]*>[^\n<]*<\/[^\n>]*>)[^\n,<]*)*),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/; var OVERRIDE_REG = /^Override\s*header:\s*/i; function getAuthorName(a) { return a.owner.display_name; } function process() { var valid = []; answers.forEach(function(a) { var body = a.body; a.comments.forEach(function(c) { if(OVERRIDE_REG.test(c.body)) body = '<h1>' + c.body.replace(OVERRIDE_REG, '') + '</h1>'; }); var match = body.match(SCORE_REG); if (match) valid.push({ user: getAuthorName(a), size: +match[2], language: match[1], link: a.share_link, }); else console.log(body); }); valid.sort(function (a, b) { var aB = a.size, bB = b.size; return aB - bB }); var languages = {}; var place = 1; var lastSize = null; var lastPlace = 1; valid.forEach(function (a) { if (a.size != lastSize) lastPlace = place; lastSize = a.size; ++place; var answer = jQuery("#answer-template").html(); answer = answer.replace("{{PLACE}}", lastPlace + ".") .replace("{{NAME}}", a.user) .replace("{{LANGUAGE}}", a.language) .replace("{{SIZE}}", a.size) .replace("{{LINK}}", a.link); answer = jQuery(answer); jQuery("#answers").append(answer); var lang = a.language; lang = jQuery('<a>'+lang+'</a>').text(); languages[lang] = languages[lang] || {lang: a.language, lang_raw: lang.toLowerCase(), user: a.user, size: a.size, link: a.link}; }); var langs = []; for (var lang in languages) if (languages.hasOwnProperty(lang)) langs.push(languages[lang]); langs.sort(function (a, b) { if (a.lang_raw > b.lang_raw) return 1; if (a.lang_raw < b.lang_raw) return -1; return 0; }); for (var i = 0; i < langs.length; ++i) { var language = jQuery("#language-template").html(); var lang = langs[i]; language = language.replace("{{LANGUAGE}}", lang.lang) .replace("{{NAME}}", lang.user) .replace("{{SIZE}}", lang.size) .replace("{{LINK}}", lang.link); language = jQuery(language); jQuery("#languages").append(language); } }</script>
```
  
[Answer]
## Perl, 129 bytes
128 bytes of code + `-n` flag.
```
$p=($r=$"x$n++."@"x$_.$/).$p.$r,$_-=2while$_>0;say$_=$p;say y/A/ /r while s/(^| )A(.*
? *)@/$1 $2A/m||s/@( *
?.*)A/A$1 /||s/@/A/
```
You'll need `-nE` flags to run it :
```
perl -nE '$p=($r=$"x$n++."@"x$_.$/).$p.$r,$_-=2while$_>0;say$_=$p;say y/A/ /r while s/(^| )A(.*
? *)@/$1 $2A/m||s/@( *
?.*)A/A$1 /||s/@/A/' <<< 7
```
**Explanations:** (I'll detail them more when I have a moment)  
The first part, `$p=($r=$"x$n++."@"x$_.$/).$p.$r,$_-=2while$_>0;`, generates the initial potato: it starts from the middle line of the potato, and adds two lines at each iteration: one before the previous string, one after. Note that `$"` is a space, and since `$n` isn't initialized, it starts at 0, and `$/` is a newline. 
Note much to say about the `say$_=$p;` that prints the initial potato while storing it in `$_` (which will later be easier to manipulate). 
Finally, `say y/A/ /r while s/(^| )A(.*\n? *)@/$1 $2A/m||s/@( *\n?.*)A/A$1 /||s/@/A/` peels the potato. The last position where a `@` was removed contains a `A` (it's arbitrary, it could have be any symbol). So each iteration consist in finding the `A`, replacing it with a space, and in the meantime replacing the next `@` with a `A`. That's done thanks to two regex: `s/(^| )A(.*\n? *)@/$1 $2A/m` when the `A` is on the left side of the potato (`A(.*\n? *)@` allows to go on the right or down), and `s/@( *\n?.*)A/A$1 /` when the `A` is on the right side (`@( *\n?.*)A` allows to go up or on the left). `s/@/A/` replaces the first `@` with a `A` (that's the initialization). Since we always have a `A` in the string, we need to replace it with a space when printing it, that's what `y/A/ /r` does. 
---
**Just for the eyes**, the animated version looks fairly nice: (to run in a terminal, it's roughly the same code but with `clear` and `sleep`)
```
perl -nE 'system(clear);$p=($r=$"x$n++."@"x$_.$/).$p.$r,$_-=2while$_>0;say$_=$p;select($,,$,,$,,0.1),system(clear),say y/A/ /r while(s/(^| )A(.*\n? *)@/$1 $2A/m||s/@( *\n?.*)A/A$1 /||s/@/A/)&&/@/' <<< 10
```
[Answer]
## Befunge, ~~319~~ 254 bytes
```
&:00p1+:40p2/10p>:40g%20p:40g/30p\:10g30g`:!00g:2%!-30g-*\30g*+:20g1+v
+10g-::40g\-*2*30g+\-1+00g2%!+\00g2/1++20g-:::40g\-*2*+30g-\4*00g2*-v>
v+1\,-**2+92!-g02g00**84+1`\+*`g02g01\*!`g02g01+**!-g02\`g03:/2g00-4<
>:40g00g:2%+*`!#v_$1+:55+,00g::*1-2/+`#@_0
```
The motivation for this algorithm was to try and avoid branching as much as possible, since a single path of execution is generally easier to golf. The code is thus comprised of just two loops: the outer loop iterating over the frames of the peeling process, and the inner loop rendering the potato for each frame.
The rendering loop is essentially just outputting a sequence of characters, the character for each iteration being determined by a rather complicated formula that takes the frame number of the peeling process and the index of the output sequence and returns either an `@`, a space, or a newline, as required.
[Try it online!](http://befunge.tryitonline.net/#code=JjowMHAxKzo0MHAyLzEwcD46NDBnJTIwcDo0MGcvMzBwXDoxMGczMGdgOiEwMGc6MiUhLTMwZy0qXDMwZyorOjIwZzErdgorMTBnLTo6NDBnXC0qMiozMGcrXC0xKzAwZzIlIStcMDBnMi8xKysyMGctOjo6NDBnXC0qMiorMzBnLVw0KjAwZzIqLXY-CnYrMVwsLSoqMis5MiEtZzAyZzAwKio4NCsxYFwrKmBnMDJnMDFcKiFgZzAyZzAxKyoqIS1nMDJcYGcwMzovMmcwMC00PAo-OjQwZzAwZzoyJSsqYCEjdl8kMSs6NTUrLDAwZzo6KjEtMi8rYCNAXzA&input=Mw) 
[Answer]
# Python 3.5.1, 520 bytes
```
n=int(input())L=lenR=rangeP=printdefg(a,b):f=list(a)ifb:foriinR(L(f)):iff[i]=="@":f[i]=""breakelse:foriinR(L(f)-1,-1,-1):iff[i]=="@":f[i]=""breakreturn"".join(f)l=[]s=(2-n%2n)*(((n-2n%2)/2)1)i=2-n%2whilei<=n:l.append("@"*i)i=2j=L(l)-1whilej>=0:l.append(l[j])j-=1y=[rforrinR(int((L(l)/2)-1),-1,-1)]forhinR(L(y)-1,-1,-1):y.append(y[h])defH(q):foreinR(L(l)):P((""*y[e])q[e])P("")H(l)k=0m=0whilek<s:fortinR(L(l)):if'@'inl[t]andm%2==0:l[t]=g(l[t],True)k=1H(l)if'@'inl[t]andm%2==1:l[t]=g(l[t],False)k=1p=l[:]p.reverse()H(p)m=1
```
# Explanation
Basic idea: Alternate between iterating down each line and removing leftmost character and iterating up each line removing rightmost character while there are still `@`s left. 
```
n=int(input())
L=len
R=range
P=print
# g() returns a line in the potato with leftmost or rightmoxt '@' removed
def g(a,b):
    f=list(a)
    if b:
        for i in R(L(f)):
            if f[i]=="@":
                f[i]=" "
                break
    else:
        for i in R(L(f)-1,-1,-1):
            if f[i]=="@":
                f[i]=" "
                break
    return "".join(f)
l=[]
# s is the total number of '@'s for size n
s=(2-n%2+n)*(((n-2+n%2)/2)+1)
i=2-n%2
# store each line of potato in l
while i<=n:
    l.append("@"*i)
    i+=2
j=L(l)-1
while j>=0:
    l.append(l[j])
    j-=1
# this is used for spacing
y=[r for r in R(int((L(l)/2)-1),-1,-1)]
for h in R(L(y)-1,-1,-1):
    y.append(y[h])
# print the potato
def H(q):
    for e in R(L(l)):
        P((" "*y[e])+q[e])
    P("\n")
H(l)
k=0
m=0
# while there are still '@'s either
# go down the potato removing leftmost '@' 
# go up the potato removing rightmost '@'
while k<s:
    for t in R(L(l)):
        if '@' in l[t] and m%2==0:
            l[t]=g(l[t],True)
            k+=1
            H(l)               
        if '@' in l[t] and m%2==1:
            l[t]=g(l[t],False)
            k+=1
            p=l[:]
            p.reverse()
            H(p)
    m+=1
```
Overall a sad attempt at a straightforward procedure.
]