การนับแกะเพื่อผล็อยหลับไป


11

คนส่วนใหญ่มีความคุ้นเคยกับเรื่องเกี่ยวกับการนับแกะเพื่อหลับ มีฝูงแกะบางตัวกระโดดข้ามรั้วและคุณนับจำนวนแกะเมื่อกระโดด คาดคะเนสิ่งนี้จะช่วยให้จิตใจของคุณสงบลงและทำให้คุณเข้าสู่สภาวะการนอนหลับเพื่อที่คุณจะหลับไป

นี่คือแกะ ASCII ที่หันไปทางขวากำลังรอการนับ:

'00^>
 ||

นี่คือแกะ ASCII ที่กระโดดข้ามรั้ว:

'00^>
 /\
 ++

นี่คือสิ่งที่หันไปทางซ้ายโดยนับมาแล้ว:

<^00'
  ||

ความท้าทาย

ได้รับการป้อนข้อมูลจำนวนเต็มสองnและmมีn > 2การอธิบายทั้งหมดแกะหลายวิธีและm > 0บอกวิธีการแกะจำนวนมากได้รับนับแล้วส่งออกเป็นตัวแทนศิลปะ ASCII แกะนับจะผล็อยหลับไป

ตอนนี้สำหรับการบิด:

  • เนื่องจากขนาดของปากกาที่แกะอยู่แถวบนสุดสามารถเก็บ10แกะได้สูงสุดไม่นับแกะที่กำลังกระโดดซึ่งต้องอยู่ในแถวด้านบนเสมอ
  • แถวที่ตามมาไม่สามารถมีแกะอยู่ด้านนอกปากกาของพวกเขา (คุณไม่มีแกะทางซ้ายในแถวที่สองมากกว่าที่คุณทำในแถวแรกและเหมือนกันสำหรับด้านขวา)
  • หากมี11แกะรวมกันหรือมากกว่าแถวบนสุดจะต้องมี10บวกกับแกะกระโดดในนั้น
  • ช่องว่างนำหน้า / ต่อท้ายและช่องว่างระหว่างแกะไม่สำคัญตราบใดที่:
    1. มีอักขระช่องว่างอย่างน้อยหนึ่งตัวระหว่างแกะ
    2. ตัวละครทั้งหมดเข้าแถวกันอย่างเหมาะสม

ตราบใดที่กฎเหล่านี้บรรลุผลการจัดเตรียมที่แท้จริงของแกะก็ขึ้นอยู่กับการใช้งานของคุณ

ตัวอย่าง

ตัวอย่างเช่นนี่คือn=3และm=1กรณีที่ง่ายที่สุด

         '00^>
'00^>     /\      <^00'
 ||       ++        ||

นี่คือn=11และm=6แกะส่วนใหญ่ที่สามารถพอดีกับเส้นแนวนอนหนึ่งเส้น

                        '00^>
'00^> '00^> '00^> '00^>  /\   <^00' <^00' <^00' <^00' <^00' <^00'
 ||    ||    ||    ||    ++     ||    ||    ||    ||    ||    ||

นี่คือตัวอย่างที่แตกต่างของที่มีn=11และm=1

                                                      '00^>
'00^> '00^> '00^> '00^> '00^> '00^> '00^> '00^> '00^>  /\   <^00'
 ||    ||    ||    ||    ||    ||    ||    ||    ||    ++     || 

ตัวอย่างที่ใหญ่กว่าด้วยn=30และm=12

                                                '00^>
'00^> '00^> '00^> '00^> '00^> '00^> '00^> '00^>  /\   <^00' <^00'
 ||    ||    ||    ||    ||    ||    ||    ||    ++     ||    || 

'00^> '00^> '00^> '00^> '00^> '00^> '00^> '00^>       <^00' <^00'
 ||    ||    ||    ||    ||    ||    ||    ||           ||    || 

'00^>                                                 <^00' <^00'
 ||                                                     ||    || 

                                                      <^00' <^00'
                                                        ||    || 

                                                      <^00' <^00'
                                                        ||    || 

                                                      <^00' <^00'
                                                        ||    || 

นี่คือตัวอย่างของn=17และm=2

                                                '00^>
'00^> '00^> '00^> '00^> '00^> '00^> '00^> '00^>  /\   <^00' <^00'
 ||    ||    ||    ||    ||    ||    ||    ||    ++     ||    ||

'00^> '00^> '00^> '00^> '00^> '00^>
 ||    ||    ||    ||    ||    ||  

นี่คือตัวอย่างของn=19และm=3

                                          '00^>
'00^> '00^> '00^> '00^> '00^> '00^> '00^>  /\   <^00' <^00' <^00'
 ||    ||    ||    ||    ||    ||    ||    ++     ||    ||    || 

'00^> '00^> '00^> '00^> '00^> '00^> '00^>
 ||    ||    ||    ||    ||    ||    ||  

'00^>
 ||  

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

I / O และกฎ

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

2
@Rod ฉันเพิ่มตัวอย่างที่ใหญ่กว่า แต่โปรดทราบว่ามันเป็นเพียงตัวอย่างและผลลัพธ์ของคุณอาจแตกต่างกัน
AdmBorkBork


แนะนำกรณีทดสอบ: n=11และm=9
อดัม

@ Adámมี 10 กรณีทดสอบสำหรับn=11สิ่ง0<m<=10นั้น นี่เป็นการบังคับให้คุณมีแกะทั้งหมดที่อยู่แถวบนสุดและจำนวนแกะแบบไดนามิกที่ด้านซ้าย ( n-1-m) และขวา ( m) ของรั้วและไม่สามารถใช้ขนาดปากกาคงที่ได้
MT0

@ MT0 จริง แต่กรณีทดสอบหนึ่งหรือสองกรณีควรจะเพียงพอที่จะแสดงให้เห็นว่าวิธีแก้ปัญหาใช้งานได้
อดัม

คำตอบ:


9

APL (Dyalog Unicode) , 118 ไบต์SBCS

แลมบ์ดานิรนาม ใช้nอาร์กิวเมนต์ซ้ายและmอาร์กิวเมนต์ขวา ส่งคืนผลลัพธ์อาร์เรย์ที่ซ้อนกัน แต่การแสดงเริ่มต้นของอาร์เรย์ที่ซ้อนกันนี้จะเป็นไปตามข้อกำหนด ใช้สูงสุดเก้าเสาสำหรับแกะนับและคอลัมน์ที่เหลือสำหรับรอแกะ

{(r⍴(×/rd,⍨⌈w÷d10-⍵⌊⊢/r)↑w⍴(w←⍺-⍵+1)⍴⊂s@2S)(↑(s'>',⍨¯1b)' /\' ' ++')(r⍴(×/r←9,⍨⌈⍵÷9)↑⍵⍴⊂S←⌽↑''(b←'''00^<')' ||')}

ลองออนไลน์!

{} แลมบ์ดานิรนาม เป็นอาร์กิวเมนต์ที่เหลือเป็นอาร์กิวเมนต์ที่ถูกต้อง

ฟังก์ชั่นนี้มีสามส่วนที่แตกต่าง: Waiting , กระโดดและนับ แต่ละรายการอยู่ในวงเล็บทำให้เกิดผลลัพธ์เป็นรายการองค์ประกอบสามส่วน

นับ (r⍴(×/r←9,⍨∘⌈⍵÷9)↑⍵⍴⊂S←⌽↑''(b←'''00^<')' ||')

''()' ||' แกะสามเส้นที่นับไว้ในกระจกเงาเส้นกลางอยู่:

b←'''00^<' ร่างกายและได้รับมอบหมายให้ b

 ผสมรายการของสตริงลงในเมทริกซ์อักขระ (การเติมช่องว่าง)

 กระจกที่

S← มอบหมายให้S( h Sใหญ่)

 ล้อมรอบมันเพื่อให้เราสามารถจัดการกับมันเป็นหน่วย

⍵⍴ ใช้จำนวนแกะที่นับเพื่อปรับรูปร่างใหม่โดยใช้วงจร

()↑ รับจำนวนองค์ประกอบต่อไปนี้จากนั้น (การเติมด้วยรายการต้นแบบคืออาร์เรย์เดียวกัน แต่มีอักขระทั้งหมดแทนที่ด้วยช่องว่าง)

⍵÷9 หนึ่งในเก้าของจำนวนแกะที่นับได้

 ปัดขึ้น

9,⍨ ผนวก 9 เข้ากับนั้น

r← กำหนดให้r(สิ่งที่เราจะR eshape กับ; แถวและคอลัมน์)

×/ ผลิตภัณฑ์ของรายการนั้น (นี่คือจำนวนองค์ประกอบที่เราต้องการรวมถึงการเติม)

r⍴ ก่อร่างใหม่อีกครั้งเพื่ออาร์เรย์ที่มีความยาวมิติ r

ที่กระโดด (↑(s←'>',⍨¯1↓b)' /\' ' ++')

(... )' /\' ' ++' กระโดดแกะสามบรรทัดสิ่งแรกคือ:

¯1↓b วางอักขระตัวสุดท้ายจาก b

'>',⍨ ผนวกหัวที่หันไปทางขวา

s← เก็บในs( heep sเล็ก)

 ผสมรายการของสตริงลงในเมทริกซ์อักขระ (การเติมช่องว่าง)

ที่รอคอย (r⍴(×/r←d,⍨⌈w÷d←10-⍵⌊⊢/r)↑w⍴(w←⍺-⍵+1)⍴⊂s@2⌽S)

⌽S กระจกเงา S

s@2 ใส่s ที่บรรทัดที่ 2 ของที่ (แทนที่ข้อมูลปัจจุบันที่นั่น)

 ล้อมรอบมันเพื่อให้เราสามารถจัดการกับมันเป็นหน่วย

()⍴ ปรับรูปแบบใหม่ตามขนาดดังต่อไปนี้:

⍵+1 จำนวนแกะที่นับรวมหนึ่งตัว

⍺- ลบออกจากยอดรวม

w← กำหนดให้w( W aiting)

()↑ รับจำนวนองค์ประกอบต่อไปนี้จากนั้น (การเติมด้วยรายการต้นแบบ)

⊢/r องค์ประกอบที่อยู่ทางขวาสุดของr(เช่นจำนวนคอลัมน์ที่ใช้สำหรับแกะนับ)

⍵⌊ จำนวนรวมขั้นต่ำและ

10- ลบออกจากสิบ

d← กำหนดให้กับd( d ifference; ไม่มีคอลัมน์)

 หารwด้วย

 ปัดเศษ (ให้จำนวนแถวที่ต้องการ)

d,⍨ ผนวก d

r← กำหนดให้r(สิ่งที่เราจะR eshape กับ; แถวและคอลัมน์)

×/ ผลิตภัณฑ์ของรายการนั้น (นี่คือจำนวนองค์ประกอบที่เราต้องการรวมถึงการเติม)

r⍴ ก่อร่างใหม่อีกครั้งเพื่ออาร์เรย์ที่มีความยาวมิติ r


1
@ WeijunZhou คุณถูกต้องจะแก้ไข
อดัม

1
ฉันสงสัยว่า heck ฉันจะตอบความท้าทายนี้ได้อย่างไร ฉันเดาว่าเป็นวิธี: p
J. Sallé

1
@ WeijunZhou แก้ไขแล้ว
Adám

"สงวนไว้เก้าคอลัมน์เสมอสำหรับการรอแกะและคอลัมน์เดียวสำหรับการนับแกะ" วิธีนี้ใช้งานได้n=11,m=9และกฎ "แถวบนสุดต้องมี 10 ตัวรวมกับแกะกระโดดในนั้น"
MT0

3

Javascript, 281 , 293 , 288 Bytes

a="      ";c=((n,m)=>{b="";for(i=0;i<(q=m>(o=(l=(t=n-m-1)?t:0)/9)?m:o);++i){for(j=0;j<3;++j){b+=[a,"'00^> "," ||   "][j].repeat(r=l>i*9?(z=o-i)>1?9:Math.ceil(z*9):0)+a.repeat((l>9?9:l)-r)+(i?"     ":["'00^>"," /\\  "," ++  "][j])+[a," <^00'","   || "][j].repeat(m>i?1:0)+"\n"}}return b});

ระวังเมื่อใช้ตัวอย่างข้อมูลด้านล่างมีความเสี่ยงอย่างมากต่อการเกิดเฉียบเฉียบ

  <form id="form">
    <input type="text" name="n" placeholder="n (sheep total)">
    <input type="text" name="m" placeholder="m (sheep in right hand field)">
    <button type="submit">Let's Go!</button>    
  </form>

  <pre id="output">
  </pre>

  <script>
    a="      ";c=((n,m)=>{b="";for(i=0;i<(q=m>(o=(l=(t=n-m-1)?t:0)/9)?m:o);++i){for(j=0;j<3;++j){b+=[a,"'00^> "," ||   "][j].repeat(r=l>i*9?(z=o-i)>1?9:Math.ceil(z*9):0)+a.repeat((l>9?9:l)-r)+(i?"     ":["'00^>"," /\\  "," ++  "][j])+[a," <^00'","   || "][j].repeat(m>i?1:0)+"\n"}}return b});
      form.addEventListener("submit", function(e){
        e.preventDefault();
  
        var n = parseInt(form.n.value);
        var m = parseInt(form.m.value);
  
        if(n != NaN && m != NaN){
          if(m > n){
            output.innerText = "C'mon man, how can you have more sheep in the right hand field than there are sheep in general?";
          }
          else{
            output.innerText = c(n, m);
          }
        }
        else{
          output.innerText = "Numbers only please.";
        }
      });
    </script>


2
สิ่งนี้แสดงให้เห็นว่ามีแกะนับ 4 ตัวสำหรับ n = 50, m = 3 และยังมีแกะที่ไม่ถูกต้องสำหรับ n = 20, m = 3 นอกจากนี้ n = 20, m = 1 แสดงแกะนับ 2 ตัว
ale10ander

2
แก้ไขข้อผิดพลาดเหล่านั้น นอกจากนี้ยังพบว่าแกะบางตัวกำลังหลบหนีเนื่องจากข้อผิดพลาดในการปัดเศษ
Jhal

หากm = nคุณได้รับข้อผิดพลาด
aimorris

นี่เป็นสถานการณ์ที่ฉันสันนิษฐานว่าอาจถูกละเว้น วิธีเขียนคำถามระบุไว้ว่า: m = จำนวนแกะทางด้านขวามือ n = จำนวนแกะทั้งหมดและมีแกะก็กระโดดรั้ว ดังนั้น n ไม่สามารถเท่ากับ m ได้ดังนั้นฉันจึงไม่ได้คำนึงถึงมัน
Jhal

2

C, 392 ไบต์

ขอบคุณ @Jonathan Frech สำหรับการบันทึกไบต์!

#define F;for(
x,y,k;p(L,a,b,t)char L[][78];{F k=5;k--;)L[x=a*4+(t<2)][y=b*6+k]=t?"'00^>"[k]:"<^00'"[k];L[++x][y-=~!t]=47;L[x][++y]=92;L[x][--y]=L[x+=(t>1)][y]=t<2?'|':43;}i,l;f(n,m){char L[i=n*4][78]F;i--;){F L[i][l=77]=0;l--;)L[i][l]=32;}F l=n+~m;++i<l&&i<9+!m;)p(L,0,i,1);l-=i;p(L,0,i++,2)F;i<11&&m--;)p(L,0,i++,0)F i=0;l--;)p(L,++i,0,1)F i=1;m-->0;)p(L,i++,10,0)F l=0;l<i*4;)puts(L+l++);}

ลองออนไลน์!

คลี่:

#define F;for(

x, y, k;
p(L, a, b, t) char L[][78];
{
    F k=5; k--;)
        L[x=a*4+(t<2)][y=b*6+k] = t ? "'00^>"[k] : "<^00'"[k];

    L[++x][y-=~!t] = 47;
    L[x][++y] = 92;
    L[x][--y] = L[x+=(t>1)][y] = t<2 ? '|' : 43;
}

i, l;
f(n, m)
{
    char L[i=n*4][78]
    F; i--;)
    {
        F L[i][l=77]=0; l--;)
            L[i][l] = 32;
    }

    F l=n+~m; ++i<l&&i<9+!m;)
        p(L,0,i,1);

    l-=i;
    p(L,0,i++,2)

    F; i<11&&m--;)
        p(L,0,i++,0)

    F i=0; l--;)
        p(L,++i,0,1)

    F i=1; m-->0;)
        p(L,i++,10,0)

    F l=0; l<i*4;)
        puts(L+l++);
}

y+=1+!ty-=~!tสามารถ
Jonathan Frech

@ JonathanFrech อ๋อขอบคุณมาก!
Steadybox

1

Python 2 , 222 277 ไบต์

n,m=input();n-=m+1
s=" '00^>"
j=1;L='  ||  '
a,b=[[[5,5],[10-m,m]][m<9],[n,10-n]][n<9]
print' '*6*a+s
while n>0 or 0<m:N,M=min(n,a),min(m,b);n-=a;m-=b;print '%-*s'%(6*a,N*s),'%5s'%('/\  '*j)+'%*s'%(6*b,M*" <^00'")+'\n'+'%*s'%(-6*a,N*L),'%5s'%('++  '*j),'%*s'%(6*b,M*L)+'\n';j=0

ลองออนไลน์!


ล้มเหลวบนและn=11 m=2
Adám

ฉันไม่ได้แกะ 11 ตัวในแถวแรกเมื่อฉันวิ่งนี่
Robert Benson

1
@RobertBenson ขอบคุณคง
TFeld

0

AWK , 293 ไบต์

{f=" '00^>"
l="  ||  " 
L="  /\\   "
p="  ++   "
Y=$2
X=$1-Y-1
E="      "
x=$1>11?Y<5?10-Y:X>5?5:X:X
y=$1>11?X<5?10-X:5:Y
printf"%"6*(x+1)"s\n",f
for(;X>0||Y>0;A=B=""){for(i=0;i++<x;B=B (X>=0?l:E))A=A (--X>=0?f:E)
A=A L
B=B p
for(i=0;i++<y&&--Y>=0;B=B l)A=A"<^00' "
print A"\n"B"\n"
L=p=E" "}}

ลองออนไลน์!

ฉันพยายามใช้การแทนที่สตริงเพื่อหลีกเลี่ยงการวนซ้ำบางส่วน แต่ใช้รหัสมากขึ้น

คำอธิบาย

{f=" '00^>"    Let's assign
l="  ||  "     some variables
L="  /\\   "   for the ASCII
p="  ++   "    pieces
Y=$2        The number of sheep that have already jumped
X=$1-Y-1    Sheep patiently waiting to jump
E="      "  A string to keep things spaced properly
x=$1>11?Y<5?10-Y:X>5?5:X:X  If there's enough sheep, let's use 5 per column
y=$1>11?X<5?10-X:5:Y        Otherwise, use enough to get 11 sheep in first row
printf"%"6*(x+1)"s\n",f     Print the top part of the jumping sheep
for(;X>0||Y>0;A=B=""){      Loop until we've printed all the sheep
  for(i=0;i++<x;              Loop over waiting sheep in this row
    B=B (X>=0?l:E))             Build the "legs" string
      A=A (--X>=0?f:E)            Build the "bodies" string
  A=A L                       Add the legs and post 
  B=B p                       for the jumping sheep
  for(i=0;i++<y&&--Y>=0;   Loop over the jumped sheep in this row
    B=B l) A=A"<^00' "     Add to the "legs" and "bodies" string 
  print A"\n"B"\n"         Print what we've got so far
  L=p=E" "                 Prevent the jumping sheep's parts from printing lots of times
}}

ฉันต้องบอกว่างานแกะนั้นค่อนข้างน่ารัก :)


0

ถ่านขนาด 98 ไบต์

Nθ≔⁻⊖NθηF⟦⟦00¶/\¶++ θ⌊⟦⌈⟦⁵⁻χη⟧θ⟧⟧⟦0^>¶\¶+  η⌊⟦⌈⟦⁵⁻χθ⟧η⟧⟧⟧«J⁰¦⁰‖T§ι⁰↗F§ι¹«<^00'¶  || ↗¿¬﹪⊕κ§ι²”|I4O

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด คำอธิบาย:

Nθ

ป้อนจำนวนแกะที่ได้นับไปแล้ว

≔⁻⊖Nθη

ป้อนจำนวนแกะทั้งหมดและคำนวณจำนวนที่ยังต้องนับ

F⟦⟦00¶/\¶++ θ⌊⟦⌈⟦⁵⁻χη⟧θ⟧⟧⟦0^>¶\¶+  η⌊⟦⌈⟦⁵⁻χθ⟧η⟧⟧⟧«

สร้างอาร์เรย์ของสองอาร์เรย์ แต่ละอาร์เรย์มีองค์ประกอบดังต่อไปนี้:

  • สตริงที่มีครึ่งหนึ่งของแกะกระโดด
  • จำนวนแกะที่ด้านข้างของรั้ว
  • จำนวนแกะในหนึ่งแถวที่ด้านข้างของรั้วซึ่งก็คือ
    • จำนวนแกะที่อยู่ด้านข้างของรั้วถ้าน้อยกว่า 5 หรือ
    • 10 - จำนวนแกะที่อยู่อีกด้านของรั้วถ้าน้อยกว่า 5 หรือ
    • 5 ถ้าทั้งสองข้างมีแกะอย่างน้อย 5 ตัว
J⁰¦⁰‖T§ι⁰↗

สะท้อนผืนผ้าใบและพิมพ์แกะกระโดดครึ่งตัว

F§ι¹«

วนรอบแกะด้านนั้น

<^00'¶  || ↗

พิมพ์แกะ

¿¬﹪⊕κ§ι²”|I4O

หากนี่คือจุดสิ้นสุดของแถวให้พิมพ์บรรทัดใหม่และช่องว่างเพื่อเริ่มต้นการแกะตัวถัดไป

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