โปรแกรมระบุรูปร่าง


25

งานของคุณคือการสร้างโปรแกรมที่ระบุรูปร่างของอินพุต รูปร่างที่จะระบุสามารถเป็นอย่างใดอย่างหนึ่งต่อไปนี้:

สี่เหลี่ยม

ในการระบุว่าเป็นรูปสี่เหลี่ยมแหล่งที่มาจะต้องมีบรรทัดที่มีความยาวเท่ากันทั้งหมดและจำนวนบรรทัดเท่ากับอักขระต่อบรรทัด (ยกเว้นอักขระบรรทัดใหม่) ขึ้นบรรทัดใหม่ที่เป็นทางเลือกเป็นที่ยอมรับ

$_='
$_="
$_"'
;say

สี่เหลี่ยมผืนผ้า

ในการระบุว่าเป็นสี่เหลี่ยมผืนผ้าแหล่งที่มาจะต้องมีบรรทัดที่มีความยาวเท่ากันทั้งหมด แต่จำนวนบรรทัดไม่ตรงกับจำนวนอักขระต่อบรรทัด (ยกเว้นอักขระขึ้นบรรทัดใหม่) ขึ้นบรรทัดใหม่ที่เป็นทางเลือกเป็นที่ยอมรับ สิ่งนี้สามารถเป็นได้ทั้งแนวนอนหรือแนวตั้ง

$_=
"no
t a
squ
are
";#

$_="but it
is still a
consistent
shape!";##

สามเหลี่ยม

ในการระบุว่าเป็นรูปสามเหลี่ยมแหล่งที่มาต้องเริ่มต้นด้วยอักขระหนึ่งตัวและแต่ละบรรทัดถัดมาต้องมีอักขระเพิ่มเติมหนึ่งตัว (รวมถึงตัวสุดท้าย) หรือหลังบรรทัดแรกแต่ละบรรทัดถัดไปควรมีอักขระน้อยกว่าหนึ่งตัวสุดท้ายซึ่ง มีเพียงหนึ่งเดียว

$
_=
"So
this
"."".
shape;

$_="or
even,
this
way
!!
"

ความยุ่งเหยิง

สิ่งใดก็ตามที่ไม่เป็นไปตามรูปแบบที่สอดคล้องกันตามข้างต้นจะต้องระบุเป็นระเบียบ

กฎระเบียบ

  • คุณอาจส่งคืนค่าที่สอดคล้องกันสี่ค่าที่พิมพ์ได้เพื่อระบุรูปร่างแต่ละรูปร่าง
  • ซอร์สโค้ดของคุณต้องเป็นไปตามรูปร่างด้านบนอย่างใดอย่างหนึ่ง (ไม่ไม่เป็นระเบียบ)
  • ขึ้นบรรทัดใหม่ต่อท้ายในแหล่งที่มาของคุณเป็นที่ยอมรับ
  • คุณสามารถสมมติว่าการป้อนข้อมูลไม่มีบรรทัดว่างใด ๆ (รวมถึงการขึ้นบรรทัดใหม่) ไม่ว่างเปล่าและไม่ประกอบด้วยการขึ้นบรรทัดใหม่เท่านั้น
  • รูปร่างทั้งหมดต้องมีความสูงและความกว้างเป็น> = 2 มิฉะนั้นจะถูกกำหนดเป็นระเบียบ
  • ช่องโหว่มาตรฐานเป็นสิ่งต้องห้าม
  • ทางออกที่สั้นที่สุดในหน่วยไบต์ในแต่ละภาษาชนะ

"ซอร์สโค้ดของคุณต้องเป็นไปตามหนึ่งในรูปร่างด้านบนด้วย" หมายความว่าหนึ่งซับก็ใช้ได้ดีใช่ไหม
tsh

1
@ All shapes must have a height and width of >= 2.
tsh

1
อินพุตสามารถเป็นอาร์เรย์ได้หรือไม่ ตัวอย่างเช่นสี่เหลี่ยม['abc','cfd','fgh']?
Luis felipe De jesus Munoz

1
@ recursive อัปเดตขอขอบคุณ!
Dom Hastings

3
คุณกำลังบอกฉันว่าซอร์สโค้ดของฉันไม่เป็นระเบียบ? ทำไมไม่!
นิวแฮมป์เชียร์

คำตอบ:


9

เยลลี่ , 35 ไบต์

L€ṀR,Ṛ$ċƲȧ3
L€,;¥LE€S+Ç
ỴµZL«L>1ȧÇ 

ลองออนไลน์!

0= Mess
1= Rectangle
2= Square
3= Triangle


ช่องว่างในบรรทัดสุดท้ายของคุณใช้กับรหัสของคุณหรือไม่ หรือว่าเป็นเพียงการขยายเพื่อให้ตรงกับเกณฑ์ "สี่เหลี่ยมผืนผ้า"?
BradC

@BradC อย่างหลัง ฉันควรจะเพิ่มคำอธิบาย
Erik the Outgolfer

7

Brachylogขนาด 45 ไบต์

lᵐ{≥₁|≤₁}o{l>1&t>1&}↰₃
lg,?=∧1w|=∧2w|t⟦₁≡?∧3w

ลองออนไลน์!

รหัสเป็นรูปสี่เหลี่ยมผืนผ้า (แม้จะแสดงบนหน้าจอของฉันก็ตาม) เอาท์พุท: 1 สำหรับสแควร์, 2 สำหรับสี่เหลี่ยมผืนผ้า, 3 สำหรับสามเหลี่ยมและไม่มีอะไรยุ่ง


คำอธิบาย:

lᵐ{≥₁|≤₁}o{l>1&t>1&}↰₃
lg,?=∧1w|=∧2w|t⟦₁≡?∧3w

lᵐ                        Get the length of each string
  {     }                 Verify 
   ≥₁                     The list is non-increasing
     |                    or...
      ≤₁                  The list is non-decreasing
         o                Sort it to be non-decreasing
          {        }      Verify
           l>1            The number of lines is greater than 1
              &           and...
               t>1&       The longest line is longer than 1 character
                    ↰₃    Call the following

lg,?                      Join the number of lines with the line lengths
    =∧1w                  If they are all equal, print 1 (Square)
         |=∧2w            Or if just the line lengths are equal, print 2 (Rectangle)
              |t⟦₁         Or if the range [1, 2, ... <longest line length>]
                  ≡?       Is the list of lengths
                    ∧3w    Print 3 (triangle)
                           Otherwise print nothing (mess)

7

Java 10, 231 221 219 217 213 211 207 ไบต์

s->{var a=s.split("\n");int r=a.length,l=a[0].length(),R=0,i=1,L,D;if(r>1){for(L=a[1].length(),D=L-l;++
i<r;R=L-a[i-1].length()!=D?1:R)L=a[i].length();R=R<1?D==0?r==l?1:2:D>-2&D<2&(l<2|L<2)?3:0:0;}return R;}

ฟังก์ชั่นเป็นรูปสี่เหลี่ยมผืนผ้าตัวเอง
1= กำลังสอง 2= สี่เหลี่ยม 3= สามเหลี่ยม 0= ระเบียบ

-14 ไบต์ขอบคุณที่@ OlivierGrégoire

คำอธิบาย:

ลองออนไลน์

s->{                        // Method with String parameter and integer return-type
  var a=s.split("\n");      //  Input split by new-lines
  int r=a.length,           //  Amount of lines
      l=a[0].length(),      //  Length of the first line
      R=0,                  //  Result-integer, initially 0
      i=1,                  //  Index integer, starting at 1
      L,D;                  //  Temp integers
  if(r>1){                  //  If there are at least two lines:
    for(L=a[1].length(),    //   Set `L` to the length of the second line
        D=L-l;              //   And set `D` to the difference between the first two lines
        ++i<r;              //   Loop over the array
        ;                   //     After every iteration:
         R=L-a[i-1].length()//     If the difference between this and the previous line
          !=D?              //     is not equal to the difference of the first two lines:
           1                //      Set `R` to 1
          :                 //     Else:
           R)               //      Leave `R` the same
      L=a[i].length();      //    Set `L` to the length of the current line
  R=R<1?                    //   If `R` is still 0:
     D==0?                  //    And if `D` is also 0:
      r==l?                 //     And the amount of lines and length of each line is equal
       1                    //      It's a square, so set `R` to 1
      :                     //     Else:
       2                    //      It's a rectangle, so set `R` to 2
     :D>-2&D<2&             //    Else-if `D` is either 1 or -1,
      (l<2|L<2)?            //    and either `l` or `L` is 1:
       3                    //     It's a triangle, so set `R` to 3
    :0:0;}                  //   In all other cases it's a mess, so set `R` to 0
  return R;}                //  Return the result `R`

1
คงที่ 221 ไบต์: s->{var a=s.split("\n");int S=a.length,l=a[0].length(),L,D,b=0,i=1;if(S<2)return 0;for(L=a[1].length(),D=L-l; b<1&++i<S;)if((L=a[i].length())-a[i-1].length()!=D)b=1;return b<1?D==0?S==l?1:2:D==-1|D==1?l==1|L==1?3:0:0:0;}(พื้นที่คู่หลังจากvarแบ่งเส้นหลังD=L-l;.
โอลิเวียGrégoire

@ OlivierGrégoireขอบคุณ และผมแข็งแรงเล่นกอล์ฟอีกสองไบต์โดยการเปลี่ยนไปD==-1|D==1 D>-2|D<2สิ่งนั้นและสิ่งl==1|L==1นั้นอาจจะสามารถเล่นกอล์ฟได้มากกว่าด้วยการดำเนินการระดับบิต แต่นั่นไม่ใช่ความเชี่ยวชาญของฉัน
Kevin Cruijssen

1
207 ไบต์: s->{var a=s.split("\n");int r=a.length,l=a[0].length(),L,D,b=0,i=1;if(r>1){for(L=a[1].length(),D=L-l;++ i<r;b=L-a[i-1].length()!=D?1:b)L=a[i].length();b=b<1?D==0?r==l?1:2:D>-2&D<2&(l<2|L<2)?3:0:0;}return b;}(แตกหลังจากD=L-l;++) ยังคงสามารถเล่นกอล์ฟได้โดยการรวมลูปและคำสั่งเข้าด้วยกันในภายหลัง แต่ฉันไม่เห็นว่าตอนนี้
Olivier Grégoire

6

Python 2 , 129 114 109 107 113 ไบต์

l=map(len,input().split('\n'));m=len(
l);r=range(1,m+1);print[[1],0,r,r[::-
1],[m]*m,0,[max(l)]*m,l].index(l)%7/2

ลองออนไลน์!


พิมพ์

  • 0 = Mess
  • 1 = Triangle
  • 2 = Square
  • 3 = Rectangle

@KevinCruijssen ขอบคุณควรได้รับการแก้ไขแล้วตอนนี้
TFeld

6

เยลลี่ , 32 27 ไบต์

,U⁼€JẸ,E;SƲ$
ZL«L’aL€Ç$æAƝ

ลองออนไลน์!

ขณะนี้การป้อนข้อมูลที่รายการของเส้นและเปลี่ยน>1×กับ’aและการใช้SƲหลังแทนL€ FLƲƊสิ่งเหล่านี้ทำให้ฉันควบแน่นเป็นสองบรรทัดและฉันบันทึกได้ 5 ไบต์ทั้งหมด ค่าต่อไปนี้เป็นค่าเดิม

[0.0, 0.0]= Mess
[0.0, 1.5707963267948966]= Rectangle
[0.0, 0.7853981633974483]= Square
[1.5707963267948966, 0.0]= Triangle


ZL«Lรับขั้นต่ำของความสูงและความกว้างและลบ 1 จากมัน Çเรียกว่าการเชื่อมโยงที่สองและในตอนท้ายถ้าใส่เป็นเส้นเดียวผลมาจากการÇได้รับตรรกะ ANDed [0.0, 0.0]กับจำนวนก่อนหน้าหากมีเพียงเส้นเดียวที่ส่งออกจะได้รับ

ในลิงค์ที่สอง: ,Uให้รายการของความยาวบรรทัดที่จับคู่กับมันย้อนกลับ Jเป็นrange(number of lines)และตรวจสอบว่าแต่ละของพวกเขาจะเท่ากับผลมาจากการ⁼€ (มี) ให้ผลตอบแทน 1 ถ้าอินพุตเป็นรูปสามเหลี่ยมJ

E ตรวจสอบว่าความยาวของสายทั้งหมดเท่ากัน (สี่เหลี่ยมผืนผ้า / สี่เหลี่ยมจัตุรัส)

SƲด้วยการที่$จะจัดกลุ่มพวกเขาให้เป็น monad เดียวตรวจสอบว่าจำนวนตัวอักษรทั้งหมดเป็นจำนวนตาราง

ดังนั้นในตอนท้ายของลิงค์ที่สองเรามี[[a,b],c]ที่แต่ละหมายเลขเป็น0หรือ1ระบุว่าการป้อนข้อมูลเป็นรูปสามเหลี่ยมสี่เหลี่ยมและมีจำนวนตัวอักษรสแควร์ตามลำดับ

อย่างไรก็ตามองค์ประกอบที่เป็นสี่เหลี่ยมจัตุรัสไม่ได้หมายความว่าสัญญาณเข้านั้นเป็นรูปสี่เหลี่ยมเนื่องจากสัญญาณที่ยุ่งเหยิงเช่นนี้

a3.
4

มีองค์ประกอบจำนวนหนึ่ง แต่ไม่ได้เป็นรูปสี่เหลี่ยม

ซึ่งเป็นที่ที่æA(arctan2) มาใน. 0æA0== ==0æA1 0กล่าวอีกนัยหนึ่งถ้าอินพุตมีจำนวนองค์ประกอบเป็นสี่เหลี่ยมจัตุรัส แต่ไม่ใช่รูปสี่เหลี่ยมผืนผ้าก็ไม่ใช่รูปสี่เหลี่ยม มีวิธีที่ชัดเจนมากขึ้นในการทำเช่นนี้ แต่สิ่งที่สำคัญเมื่อเรามีจำนวนไบต์ให้คิดและเราได้รับอนุญาตให้ส่งออกโดยพลการอย่างสม่ำเสมอ

หมายเหตุก่อนหน้านี้ฉันเคยใช้æA/แทนที่จะเป็นæAƝ(และ,แทนที่จะเป็น;ลิงก์ที่สอง) แต่วิธีการก่อนหน้านี้แยกความแตกต่างระหว่างรูปสามเหลี่ยมที่มีจำนวนองค์ประกอบเป็นรูปสี่เหลี่ยมจัตุรัส


ผมกำลังมองไปที่การคิดตัวเลขพวกเขาดูเหมือนคุ้น ...
Dom เฮสติ้งส์

@DomHastings ฮ่าฮ่า ฉันมีปัญหาในการแยกสแควร์สจากความยุ่งเหยิงจำนวนองค์ประกอบและarctan2เป็นสิ่งที่ฉันต้องการ
dylnan

1
ตลกที่ฉันไม่คิดว่ามันจะสั้นกว่านี้หากไม่มีการ จำกัด แหล่งที่มา
dylnan

... คุณแน่ใจหรือว่ามันถูกต้อง? เนื่องจากบรรทัดใหม่ในเยลลี่คือ 0x7F ไม่ใช่ 0x0A
user202729

@DomHastings ถูกต้องหรือไม่ (ดูเหตุผลด้านบน)
user202729

4

Java 10, 274 323 298 229 ไบต์

การส่งสามเหลี่ยมครั้งแรก

s
->
{  
var 
a=s. 
split 
("\n");
int i,l=
a.length,
c,f=a[0]. 
length(),r=
l<2||f<2&a[1
].length()<2?
0:f==l?7:5;var
b=f==1;for(i=1;
i<l;){c=a[i++]. 
length();r&=c!=f?
4:7;r&=(b&c!=f+1)|
(!b&c!=f-1)?3:7;f=c
;}return r;}        

0 ความยุ่งเหยิง

1 สี่เหลี่ยมผืนผ้า

3 สี่เหลี่ยม

4 สามเหลี่ยม

ลองออนไลน์ได้ที่นี่

แก้ไขหลาย ๆ ครั้งเพื่อเล่นกอล์ฟเพิ่มอีกนิด

แน่นอนฉันสามารถบันทึกไบต์จำนวนมากได้โดยแปลงเป็นสี่เหลี่ยมด้วย ( 281 267 259 200 ไบต์ดูที่นี่ )

ผลลัพธ์ของการระบุจะถูกจัดการโดยใช้ bitwise AND ทำให้ bitmask เป็นดังนี้:

1        1      1
triangle square rectangle

เวอร์ชันที่ไม่ถูกปรับแต่ง:

s -> {
    var lines = s.split("\n"); // split input into individual lines
    int i, // counter for the for loop
    numLines = lines.length, // number of lines
    current, // length of the current line
    previous = lines[0].length(), // length of the previous line
    result = numLines < 2 // result of the identification process; if there are less than two lines
    || previous < 2 & lines[1].length() < 2 // or the first two lines are both shorter than 2
    ? 0 : previous == numLines ? 7 : 5; // it's a mess, otherwise it might be a square if the length of the first line matches the number of lines
    var ascending = previous == 1; // determines whether a triangle is in ascending or descending order
    for(i = 1; i < numLines; ) { // iterate over all lines
         current = lines[i++].length(); // store the current line's length
        result &= current != previous ? 4 : 7; // check if it's not a rectangle or a square
        result &= (ascending & current != previous+1)|(!ascending & current != previous-1) ? 3 : 7; // if the current line is not one longer (ascending) or shorter (descending) than the previous line, it's not a triangle
        previous = current; // move to the next line
    }
    return result; // return the result
}

1
ยินดีต้อนรับสู่ PPCG!
Steadybox

ไชโยสำหรับสามเหลี่ยม! ขอบคุณ!
Dom Hastings

สวัสดียินดีต้อนรับสู่ PPCG! คำตอบแรกที่ดี ฉันพยายามทำให้สามเหลี่ยมเป็นคำตอบก่อนหน้านี้เช่นกัน แต่มันมีค่าใช้จ่ายมากเกินไปเมื่อเทียบกับสี่เหลี่ยมผืนผ้าและคำสำคัญบางคำก็ยาวเกินไปในคำตอบเริ่มต้นของฉันเช่นกัน :) คำตอบที่ดี +1 จากฉัน และฉันใช้เสรีภาพในการแก้ไขโพสต์ของคุณเพื่อเพิ่มการเน้นไปที่โพสต์ทั้งหมดดังนั้นความคิดเห็นในเวอร์ชันที่คุณไม่ได้อ่านก็ง่ายต่อการอ่าน เพลิดเพลินไปกับการพักผ่อนของคุณ!
Kevin Cruijssen

@KevinCruijssen ขอบคุณสำหรับ upvote และแก้ไขตอนนี้มันดูดีขึ้นมาก คำตอบของฉันอาจสั้นลงโดยเปลี่ยนเป็นสี่เหลี่ยมเช่นกัน 281 ไบต์ แต่ความสนุกในนั้นอยู่ที่ไหน
OOBalance

3

Javascript ขนาด 125 ไบต์

_=>(g=(l=_.split('\n').map(a=>a.length)).
length)<3?0:(r=l.reduce((a,b)=>a==b?a:0))
?r==g?2:1:l.reduce((a,b)=>++a==b?a:0)?3:0

0 = Mess
1 = Rectangle
2 = Square
3 = Triangle

fa=_=>(g=(l=_.split('\n').map(a=>a.length)).length)<3?0:(r=l.reduce((a,b)=>a==b?a:0))?r==g?2:1:l.reduce((a,b)=>++a==b?a:0)?3:0

var square = `asd
asd
asd`

var rectangle = `asd
asd
asd
asd
asd
asd`

var triangle = `asd
asdf
asdfg
asdfgh`

var mess = `asd
dasdasd
sd
dasasd`

console.log(fa(square), fa(rectangle), fa(triangle), fa(mess))


3
จำนวนไบต์คือ 125 (รวมถึงการขึ้นบรรทัดใหม่)
เฮอร์แมน L

สามเหลี่ยมควรไปที่ 1 หรือไม่? ไม่ใช่ 3456
l4m2

@ l4m2 คุณหมายถึงอะไร
Luis felipe De jesus Munoz

2
สามเหลี่ยมควรเริ่มต้นที่ 1 เสมอ
Luis felipe De jesus Munoz

3
ฉันคิดว่าสิ่งที่ @ l4m2 ชี้ให้เห็นคือรูปสามเหลี่ยมต้องมีอักขระเพียงตัวเดียวในบรรทัดแรกหรือบรรทัดสุดท้ายมิฉะนั้นจะเป็น "ระเบียบ"
Shaggy


3

PHP, 195 205 ไบต์

<?$a=$argv[1];$r=substr($a,-2,1)=="\n"?strrev($a):$a;foreach(explode("\n",$r)as$l){$s=strlen($l);$x[$s
]=++$i;$m=$i==$s?T:M;}$z=count($x);echo$i*$z>2?$z==1&&key($x)==$i?S:($z==1&&$i>2?R:($i==$z?$m:M)):M;?>

สามเหลี่ยมคว่ำนั้นเพิ่ม 56 ไบต์ราคาแพงลงไป!

ผลลัพธ์คือ S, R, T, M

บันทึกไม่กี่ไบต์ด้วย Dom Hastings

ลองออนไลน์!

แก้ไขปัญหาบางอย่างในขณะนี้ ...

$_="
$_="
$_""
;say

RESULT:S
=============
$_=
"no
t a
squ
are
";#

RESULT:R
=============
$
_=
"So
this
"."".
shape;

RESULT:T
=============
$_="or
even,
this
way
!!
"

RESULT:T
=============
as
smiley
asd
A

RESULT:M
=============
X

RESULT:M
=============
XX

RESULT:M
=============
cccc
a
aa
cccc

RESULT:M
=============

Omit ?>น่าจะดี
tsh

นี้ดูเหมือนว่าจะกลับมาTสำหรับcccc\na\naa\ncccc ลองมันออนไลน์!
Dom Hastings

3

Perl 6 , 81 ไบต์

{.lines>>.chars.&{($_==.[0],3)[2*(2>.max
)+($_ Z- .skip).&{.[0].abs+.Set*2+^2}]}}

ลองออนไลน์!

ผลตอบแทนTrueสำหรับสแควร์Falseสำหรับสี่เหลี่ยมผืนผ้า3สำหรับสามเหลี่ยมNilสำหรับความยุ่งเหยิง


ดีมากคุณจะเปิดกล่องออกมาโดยเฉพาะ$_ Z- .skipไหม?
Phil H

3

Stax , 39 ไบต์

L{%m~;:-c:u{hJchC; 
|mb1=-C;%a\sI^^P}M0

เรียกใช้และแก้ไขข้อบกพร่องออนไลน์!

คำตอบเดียวของ ASCII ที่สั้นที่สุด

0 - ระเบียบ
1 - สี่เหลี่ยมผืนผ้า
2 - สี่เหลี่ยมจัตุรัส
3 - สามเหลี่ยม

คำอธิบาย

โซลูชันใช้ประโยชน์จากข้อเท็จจริงต่อไปนี้: หากมีการพิมพ์บางอย่างในการทำงานของโปรแกรมจะไม่มีการสร้างเอาต์พุตโดยนัย มิฉะนั้นส่วนบนสุดของสแต็กที่ตอนท้ายของการดำเนินการจะถูกส่งออกโดยปริยาย

L{%m~;:-c:u{hJchC;|mb1=-C;%a\sI^^P}M0
L                                        Collect all lines in an array
 {%m                                     Convert each line to its length
    ~;                                   Make a copy of the length array, put it on the input stack for later use
      :-                                 Difference between consecutive elements.
                                         If the original array has only one line, this will be an empty array
        c:u                              Are all elements in the array the same?
                                         Empty array returns false
           {                      }M0    If last test result is true, execute block
                                         If the block is not executed, or is cancelled in the middle, implicitly output 0
            hJ                           The first element of the difference array squared (*)
              chC                        Cancel if it is not 0 or 1
                 ;|m1=                   Shortest line length (**) is 1
                      -                  Test whether this is the same as (*)
                                         Includes two cases:
                                             a. (*) is 1, and (**) is 1, in which case it is a triangle
                                             b. (*) is 0, and (**) is not 1, in which case it is a square or a rectangle
                        C                Cancel if last test fails
                         ;%              Number of lines
                           a\            [Nr. of lines, (*)]
                             I           Get the 0-based index of (**) in the array
                                         0-> Square, 1->Triangle -1(not found) -> Rectangle
                              ^^P        Add 2 and print

3

Haskell , 113 107 103 101 ไบต์

((#)=<<k).map k.lines;k=length;1#x=0;l#x|x==[1..l]
  ||x==[l,l-1..1]=3;l#x=k[1|z<-[l,x!!0],all(==z)x]

ลองออนไลน์!

ส่งคืนค่า 0, 1, 2 และ 3 สำหรับความยุ่งเหยิงสี่เหลี่ยมผืนผ้าสี่เหลี่ยมและสามเหลี่ยมตามลำดับ

แก้ไข: -2 ไบต์ขอขอบคุณLynn !


3

05AB1E , 35 29 27 ไบต์

บันทึกแล้ว 8 ไบต์ขอบคุณMagic Octopus Urn

DgV€g©ZU¥ÄP®Y
QP®ËJCXY‚1›P*

ลองออนไลน์!

0= Mess
4= Triangle
1= Rectangle
3= Square


ดูเหมือนว่าจะล้มเหลวในบางรหัสยุ่ง: ลองออนไลน์!
Dom Hastings

@ DomHastings: ขอบคุณสำหรับการจับที่ ฉันคิดว่าการเล่นกอล์ฟนั้นค่อนข้างแย่ น่าจะโอเคแล้ว
Emigna

ลองออนไลน์! - 19 ไบต์ - 1 (สี่เหลี่ยมผืนผ้า), 2 (สามเหลี่ยม), 5 (สี่เหลี่ยม) และ 0 (ยุ่ง) [ใช้เลขฐานสอง] อาจจะไม่เป็นที่ยอมรับฮ่า ๆ gs€g©QP®¥ ÄP®1å&®ËJCสามารถเพิ่มถ่านอวกาศและCสำหรับ 21 แม้ว่า
Magic Octopus Urn

@MagicOctopusUrn: มันยังคงต้องตรวจสอบความยาว / ความสูง> = 2 แต่ก็ควรบันทึกเป็นไบต์ เคล็ดลับที่ชาญฉลาดในการสร้างตัวเลขเอาต์พุตจากไบนารี!
Emigna

1
@ MagicOctopusUrn: ฉันใช้เทคนิคเดลต้าและไบนารีของคุณเพื่อบันทึกไบต์ในเวอร์ชันเริ่มต้นของฉัน อาจจะประหยัดอีกไม่กี่เขียนใหม่อีกเล็กน้อย
Emigna

2

R , 101 ไบต์

"if"(var(z<-nchar(y<-scan(,"",,,"
","")))==0,"if"(length(y)==z,1,2
),"if"(all(abs(diff(z))==1),3,4))

1 = สแควร์
2 = สี่เหลี่ยมผืนผ้า
3 = สามเหลี่ยม
4 = สุ่ม

รหัสไม่สามารถจัดการกับ 'NEGATIVE ACKNOWLEDGE' (U + 0015) หรือช่องสี่เหลี่ยมในรหัสด้านบน ไบต์นี้สามารถสลับไปยังสิ่งที่แตกต่างกันได้หากอินพุตต้องการมีไบต์นี้

ลองออนไลน์!


บางทีคุณอาจจะใช้readLines()แทนscan()?
จูเซปเป้

@Giuseppe ไม่สามารถ / ไม่สามารถหา readLines เพื่อทำงานได้
Vlo

อืมดูเหมือนว่าคุณจะต้องระบุfile("stdin")ให้มันอ่านจากคอนโซล (แทนที่จะเป็นโค้ดบรรทัดถัดไป) นั่นหมายความว่ามันอาจจะกอล์ฟน้อย อ่าดี
Giuseppe

2

หอยทาก 29 ไบต์

ada7A
.2,lr
?!(t.
rw~)z
.+~o~

คีย์เอาต์พุต:

  • 0 - ระเบียบ
  • 3 - สามเหลี่ยม
  • 6 - สี่เหลี่ยมผืนผ้า
  • 7 - สี่เหลี่ยม

มันจะเป็น 23 ไบต์โดยไม่มีโครงร่างของแหล่งที่มา:

zA
.2,dun!(t.rf~)z.+~o~

ฉันกระตือรือร้นที่จะเล่นกับภาษานี้มาตลอดตั้งแต่อ่านคำถามที่เกิดขึ้นมา!
Dom Hastings

1

ภาษา Wolfram (Mathematica) , 119 ไบต์

(x=StringLength/@#~StringSplit~"\n")/.{{1}->3,s~(t=Table)~{
s=Tr[1^x]}:>0,x[[1]]~t~s:>1,(r=Range@s)|Reverse@r:>2,_->3}&

การใช้Replace /.และการจับคู่รูปแบบกับจำนวนตัวอักษรทีละบรรทัด Replaceจะเริ่มต้นกฎ RHS แรกของกฎที่จับคู่ดังนั้นการสั่งซื้อคือการทดสอบอินพุต 1 ตัวอักษรจากนั้นสี่เหลี่ยมสี่เหลี่ยมสามเหลี่ยมสามเหลี่ยมและการตกหล่นเพื่อความยุ่งเหยิง

ตาราง = 0 สี่เหลี่ยมผืนผ้า = 1 สามเหลี่ยม = 2 ระเบียบ = 3

ลองออนไลน์!


@ DomHastings มันได้รับการแก้ไข
Kelly Lowder

1

สีแดง 209 ไบต์

func[s][c: copy[]foreach a split s"^/"[append c length? a]d: unique c
r: 0 if 1 < l: length? c[if 1 = length? d[r: 2 if(do d)= l[r: 1]]n: 0
v: copy[]loop l[append v n: n + 1]if(v = c)or(v = reverse c)[r: 3]]r]

ลองออนไลน์!

0 ความยุ่งเหยิง

1 สี่เหลี่ยม

2 สี่เหลี่ยมผืนผ้า

3 สามเหลี่ยม



1

Ruby , 115 111 ไบต์

->s{m=s.split(?\n).map &:size;r=*1..s=m.size;s<2?4:(m|[
]).size<2?m[0]<2?4:s==m[0]?1:2:r==m.reverse||r==m ?3:4}

ลองออนไลน์!

แลมบ์ดานิรนาม ขาออก:

  1. สี่เหลี่ยม
  2. สี่เหลี่ยมผืนผ้า
  3. สามเหลี่ยม
  4. ความยุ่งเหยิง

ดูเหมือนว่าจะล้มเหลวในบางรายการที่ควรถูกตั้งค่าสถานะเป็นระเบียบ: ลองออนไลน์!
Dom Hastings

โอ้ฉันเดาว่าสิ่งนี้จะต้องได้รับการแก้ไขอย่างรวดเร็ว อาจจะต้องลองเล่นกอล์ฟอีกสักหน่อย ...
คิริลล์แอล

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.