Triangle and/or Square?

10

1

Explanation of the challenge

Given an input, return what shapes it could be. There are only a couple options.

  1. Square
  2. Triangle

Square

A square is in the following format:

XXXX
XXXX
XXXX
XXXX

So, in this example, the input would be:

16

And the output would be:

1 or "Square"

Triangle

We are only checking for equilateral triangles:

   X
  X X
 X X X
X X X X

So, in this example, the input would be:

10

And the output would be:

2 or "Triangle"

Rules for input and output

Input must be a number.

Output can be an integer list or string list as long as you specify how your output works in your post. The output will be either a triangle, square, or both; never neither.


Test Cases

36 ->  1,2 or 3 or ["Square","Triangle"] or "Both"

15 ->  2 or "Triangle"

4  ->  1 or "Square"

Leaderboard

var QUESTION_ID=118960,OVERRIDE_USER=20260;function answersUrl(e){return"https://api.stackexchange.com/2.2/questions/118980/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(e,s){return"https://api.stackexchange.com/2.2/answers/"+s.join(";")+"/comments?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),answers_hash=[],answer_ids=[],e.items.forEach(function(e){e.comments=[];var s=+e.share_link.match(/\d+/);answer_ids.push(s),answers_hash[s]=e}),e.has_more||(more_answers=!1),comment_page=1,getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){e.items.forEach(function(e){e.owner.user_id===OVERRIDE_USER&&answers_hash[e.post_id].comments.push(e)}),e.has_more?getComments():more_answers?getAnswers():process()}})}function getAuthorName(e){return e.owner.display_name}function process(){var e=[];answers.forEach(function(s){var r=s.body;s.comments.forEach(function(e){OVERRIDE_REG.test(e.body)&&(r="<h1>"+e.body.replace(OVERRIDE_REG,"")+"</h1>")});var a=r.match(SCORE_REG);a&&e.push({user:getAuthorName(s),size:+a[2],language:a[1],link:s.share_link})}),e.sort(function(e,s){var r=e.size,a=s.size;return r-a});var s={},r=1,a=null,n=1;e.forEach(function(e){e.size!=a&&(n=r),a=e.size,++r;var t=jQuery("#answer-template").html();t=t.replace("{{PLACE}}",n+".").replace("{{NAME}}",e.user).replace("{{LANGUAGE}}",e.language).replace("{{SIZE}}",e.size).replace("{{LINK}}",e.link),t=jQuery(t),jQuery("#answers").append(t);var o=e.language;/<a/.test(o)&&(o=jQuery(o).text()),s[o]=s[o]||{lang:e.language,user:e.user,size:e.size,link:e.link}});var t=[];for(var o in s)s.hasOwnProperty(o)&&t.push(s[o]);t.sort(function(e,s){return e.lang>s.lang?1:e.lang<s.lang?-1:0});for(var c=0;c<t.length;++c){var i=jQuery("#language-template").html(),o=t[c];i=i.replace("{{LANGUAGE}}",o.lang).replace("{{NAME}}",o.user).replace("{{SIZE}}",o.size).replace("{{LINK}}",o.link),i=jQuery(i),jQuery("#languages").append(i)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk",answers=[],answers_hash,answer_ids,answer_page=1,more_answers=!0,comment_page;getAnswers();var SCORE_REG=/<h\d>\s*([^\n,]*[^\s,]),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/,OVERRIDE_REG=/^Override\s*header:\s*/i;
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<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="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><div id="language-list"> <h2>Winners 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><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>

Neil

Posted 2017-05-04T21:39:06.580

Reputation: 2 417

Question was closed 2017-05-17T10:50:58.490

@ScottMilner In the post I specified you could use your own output method. – Neil – 2017-05-04T21:45:21.043

The output needs to be ["Square"], as in a singleton list of the string Square? Or the string ["Square"]? Even just the string Square seems needlessly specific. – xnor – 2017-05-04T21:45:24.227

Massively updated the post to accommodate all requests. Thanks for the input. – Neil – 2017-05-04T21:51:13.290

5

Possibly a dupe of Polygonal Numbers!, which asks to list all
k for a which a number is k-gonal. This restricts to k=3 and k=4.

– xnor – 2017-05-04T21:56:07.593

1Is it acceptable to output a 1 or 0 to indicate whether it's a square, and another 1 or 0 to indicate if it's a triangle? – Maria – 2017-05-04T22:38:11.360

4Is [True, False] an OK output format (first one for triangle, second for square)? – xnor – 2017-05-04T23:10:09.033

-1 You need to make it explicitly clear what the challenge actually is. I had no idea thinking it was something about finding the area of squares and triangles – Beta Decay – 2017-05-05T05:57:36.333

@xnor The restriction to 3 and 4 actually makes quite a difference for Retina, but I'm not sure about other languages. – Martin Ender – 2017-05-05T09:05:25.770

Answers

4

Jelly, 9 7 bytes

×8‘,µÆ²

Try it online!

Outputs [1,1] for both, [0,1] for square, [1,0] for triangle, [0,0] for neither.

Explanation

×8‘,µÆ² - main link, input a
   ,    - a list of the following two:
×8‘     - a×8+1 (which is square when a is triangle)
        - (implicit) a
    µÆ² - On the previous, check if each is a square

fireflame241

Posted 2017-05-04T21:39:06.580

Reputation: 7 021

5

Japt, 18 15 11 bytes

[U8*UÄ]®¬v1

Try it online!

Luke

Posted 2017-05-04T21:39:06.580

Reputation: 4 675

You can save a few bytes with shortcuts: [U8*UÄ]®¬u1 ¥0 Also, u1 ¥0 can be reduced to v1 to save a couple bytes :-) – ETHproductions – 2017-05-04T23:18:17.770

4

JavaScript (ES7), 40 32 bytes

Returns 1 for square, 2 for triangle, 3 for both or 0 for neither.

n=>!(n**.5%1)+2*!((8*n+1)**.5%1)

Try It

Displays "Square/Triangle/Both/Neither" for clarity

f=
n=>!(n**.5%1)+2*!((8*n+1)**.5%1)
i.addEventListener("input",_=>o.innerText=["Neither","Square","Triangle","Both"][f(+i.value)])
<input id=i type=number><pre id=o>

Shaggy

Posted 2017-05-04T21:39:06.580

Reputation: 24 623

1Nice one! I think you can remove both pairs of parentheses around exponentiations (that is, n=>(n**.5%1?0:1)+((8*n+1)**.5%1?0:2). You can save another couple bytes with !(n**.5%1) – ETHproductions – 2017-05-04T23:20:09.693

1In that case, 2*!((8*n+1)**.5%1) might save a byte too. – Neil – 2017-05-04T23:52:21.287

3

Haskell, 49 48 37 bytes

EDIT:

  • -1 byte: @xnor suggested parametrizing on k.
  • -11 bytes: And then turned it all inside out...

f takes an integer and returns a list: [3] for square, [2] for triangle, and [2,3] for both (or [] for neither.)

f n=[k|k<-[2,3],0<-scanl(-)n[1,k..n]]

Try it online!

This uses that triangular numbers are sums 1+2+3+4+...+i while square numbers are sums 1+3+5+7+...+i, thus by starting with n and using scanl(-) to subtract either the range [1,2..n] or the range [1,3..n] consecutively, each of those cases will eventually hit 0.

Ørjan Johansen

Posted 2017-05-04T21:39:06.580

Reputation: 6 914

1Nice idea with the scan. I think it would help to write the two options as [1,k..n] for k<-[2,3]. – xnor – 2017-05-04T23:30:50.297

1One weird possibility is f n=[k|k<-[2,3],0<-scanl(-)n[1,k..n]]. – xnor – 2017-05-04T23:40:17.287

@xnor That's starting to get pretty different, sure you don't want to post it yourself? – Ørjan Johansen – 2017-05-04T23:46:27.057

@xnor Someone should do it, so I'm taking silence for a no ;) – Ørjan Johansen – 2017-05-05T12:01:52.563

2

Pyth - 16 bytes (possibly 13)

+*2sI@Q2sI@h*8Q2

Prints 2 if square, 1 if triangle, 3 if both, 0 if neither

Try it

Also, 19 18 17

sI@Q2sI@h*8Q2

The first line is 1 if the number is square, 0 if not. The 2nd line is 1 if number is triangle, 0 if not.

Try it

Maria

Posted 2017-05-04T21:39:06.580

Reputation: 644

2

Ohm, 15 7 bytes

D8*≥«Æ²

Try it online!

EDIT: Saved 8 bytes thanks to this Jelly answer.

Outputs [true, true] if square and triangle, [true, false] for square, and [false, true] for triangle.

Explanation:

D8*≥«Æ²  Main wire, input integer a

D        Duplicate input
 8*≥     Multiply duplicate by 8, increment
    «    Pair
     Ʋ  Check if perfect square

Nick Clifford

Posted 2017-05-04T21:39:06.580

Reputation: 1 184

2

PHP, 67 bytes

Returns 2 for square, 1 for triangle, 3 for both and 0 for none

<?=(($q=sqrt($i=$argn))==($q^0))*2+(2*$i==($x=sqrt(2*$i)^0)*$x+$x);

Try it online!

Jörg Hülsermann

Posted 2017-05-04T21:39:06.580

Reputation: 13 026

1

TI-BASIC, 30 23 bytes

-7 for more flexible output requirements.

:Prompt X         //Get input
:{√(X),.5+√(2X+.5 //Compute the square root of X, and the inverse of the triangular number function: X(X-1)/2
:Ans=int(Ans      //Create a list of booleans for whether the values are whole or not, then print

Takes input as an iteger.

This returns a list of integers, either 0 or 1, first for being square, then for being triangular.

Scott Milner

Posted 2017-05-04T21:39:06.580

Reputation: 1 806

1

JavaScript (ES7), 52 bytes

Returns 1 for square, 2 for triangle, 3 for both (and 0 for none, although irrelevant).

f=(n,t=0,s=(n**.5|0)**2==n)=>t<n?f(n-++t,t,s):2*!n|s

Demo

f=(n,t=0,s=(n**.5|0)**2==n)=>t<n?f(n-++t,t,s):2*!n|s

console.log(f(7))
console.log(f(15))
console.log(f(25))
console.log(f(36))

Arnauld

Posted 2017-05-04T21:39:06.580

Reputation: 111 334

Scoring lower than you makes me feel I've missed something! – Shaggy – 2017-05-04T22:55:22.913

@Shaggy I don't think so. It seems like I didn't choose the right recipe, here. Well done. :-) – Arnauld – 2017-05-04T23:34:20.803

1

Python 3, 49 42 bytes

lambda i:(i**.5%1==0)+2*((1+8*i)**.5%1==0)

Returns:

  • 1 for Triangle
  • 2 for Square
  • 3 for Both

tpvasconcelos

Posted 2017-05-04T21:39:06.580

Reputation: 129

You don't need the isdigit check, input is guaranteed to be a number. – internet_user – 2017-05-04T22:43:58.800

Didnt notice the change in the rules. Thanks – tpvasconcelos – 2017-05-04T22:52:12.947

1

MATL, 11 10 bytes

t:UmGt:Ysm

Outputs two values 0 or 1 separated by newline. The first indicates if the input is square, and the second indicates if it is triangular.

Try it online!

Explanation

Consider input 4 as an example.

t     % Implicit input. Duplicate
      % STACK: 4, 4
:     % Range
      % STACK: 4, [1 2 3 4]
U     % Square, elementwise. This gives square numbers
      % STACK: 4, [1 4 9 16]
m     % Ismember
      % STACK: 1
Gt    % Push input again. Duplicate
      % STACK: 1, 4, 4
:     % Range
      % STACK: 1, 4, [1 2 3 4]
Ys    % Cumulative sum. This gives triangular numbers
      % STACK: 1, 4, [1 3 6 10]
m     % Ismember. Implicitly display
      % STACK 1, 0

Luis Mendo

Posted 2017-05-04T21:39:06.580

Reputation: 87 464

1

Python 2, 39 bytes

lambda n:[`x**.5%1==0`for x in 8*n+1,n]

Try it online!

Outputs like ["True", "False"] for triangle then square. Probably could be shorter if allowed output format is clarified.

xnor

Posted 2017-05-04T21:39:06.580

Reputation: 115 687

Bools don't seem to be covered by the output methods allowed. – Ørjan Johansen – 2017-05-04T23:05:31.527

@ØrjanJohansen I think it might be covered by string list? I'll ask. – xnor – 2017-05-04T23:09:40.680

I don't think this is one of the allowed outputs. – tpvasconcelos – 2017-05-04T23:34:10.120

1

Batch, 120 bytes

@set/ar=i=j=k=0
:g
@if %j%==%1 set/ar+=1
@if %k%==%1 set/ar+=2
@set/aj+=i+=1,k=i*i
@if %j% leq %1 goto g
@echo %r%

Outputs 1 for triangular numbers, 2 for squares, 3 for both, 0 for neither.

Neil

Posted 2017-05-04T21:39:06.580

Reputation: 95 035

1

Retina, 25 bytes

*M`(^1|1\1)+$
(^1|11\1)+$

Takes input in unary, outputs t and s on separate lines, where t and s are 0 or 1 indicating whether the shape is a triangle and/or square, respectively.

Try it online! (Contains an additional \ to put both outputs on the same line to make the test cases more easily distinguishable.)

Explanation

Triangular numbers are the sums of consecutive integers starting from one. Square numbers are the ums of consecutive odd integers starting from one. Both of those are fairly easy to match with forward references.

*M`(^1|1\1)+$

This prints 0 or 1 depending on whether the given regex matches, but it doesn't actually modify the string (the * indicates a dry run). The regex either matches the initial one with ^1 or it matches exactly one more 1 than in the previous iteration with 1\1 (the \1 refers to what (^1|1\1) matched last time).

(^1|11\1)+$

This is basically the same, except that we don't need a dry run and M is implicit. To go up by odd integers instead of all integers, we simply add two 1s on each iteration with 11\1.

Martin Ender

Posted 2017-05-04T21:39:06.580

Reputation: 184 808

1

C#, 61 bytes

s=n=>System.Math.Sqrt(n)%1==0;n=>(s(n)?1:0)+(s((8*n)+1)?2:0);

Could be a lot shorter if there was (or I knew) an alternative to System.Math.Sqrt.

Formatted version with test cases:

Func<int, bool> s = n => System.Math.Sqrt(n) % 1 == 0;

Func<int, int> f = n => (s(n) ? 1 : 0) + (s((8 * n) + 1) ? 2 : 0);

Console.WriteLine(f(36));
Console.WriteLine(f(15));
Console.WriteLine(f(4));
Console.WriteLine(f(2));

TheLethalCoder

Posted 2017-05-04T21:39:06.580

Reputation: 6 930

0

Python 3, 72 67 bytes

x=input()
k=int((x*2)**.5)
print((x==int(x**.5)**2)+2*(2*x==k*k+k))

A bit longer than wanted. This is a full program that takes input from STDIN and outputs to STDOUT. STDERR should be empty as long as there isn't an I/O Exception and the input isn't invalid.

HyperNeutrino

Posted 2017-05-04T21:39:06.580

Reputation: 26 575

Why len(input)? – Maria – 2017-05-04T22:24:58.500

You can change this to Python 2 and remove the len (which I think should be int). – internet_user – 2017-05-04T22:40:19.650

2@Svetlana The specs were changed after I answered. Thanks for notifying me. – HyperNeutrino – 2017-05-04T23:38:10.460

1@pycoder ^ Thanks as well – HyperNeutrino – 2017-05-04T23:38:23.937

Why is this getting downvotes? – HyperNeutrino – 2017-05-05T01:09:43.953

0

Octave, 38 bytes

@(x)~mod(x^.5,1)+2*any(x==cumsum(1:x))

Outputs 1 for square, 2 for triangular, 3 for both, 0 for neither.

Try it online!

Luis Mendo

Posted 2017-05-04T21:39:06.580

Reputation: 87 464