Koalas, ปูและ Commapillars


21

กำหนดจำนวนเต็มบวก X และ Y สองชุดให้เอาท์พุทการรวมกันของสัตว์ศิลปะ ASCII สามตัวดังต่อไปนี้ซึ่งเอาต์พุตจะมีเครื่องหมายจุลภาค X ( ,) และระยะเวลา Y แน่นอน ( .) หากเป็นไปได้

  1. Koala: 1 คอมม่า, 2 คาบ

    <.,.>
    
  2. Crab: 2 คอมม่า, 2 คาบ

    ,<..>,
    
  3. Commapillar: 3 หรือเครื่องหมายจุลภาคเพิ่มเติม 1 ระยะเวลา

    <,,,.>
    

    หรือ<,,,,.>หรือ<,,,,,.>หรือ<,,,,,,.>หรือ<,,,,,,,.>อื่น ๆ

หากไม่มีการรวมกันของสัตว์เหล่านี้สามารถสร้างเครื่องหมายจุลภาค X และ Y ได้อย่างแน่นอนให้ส่งออกจุลภาคเดี่ยวที่จะอำพรางความล้มเหลว:

~<.,,>~~

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

ตัวอย่างเช่นสำหรับ X = 7, Y = 5 สิ่งเหล่านี้จะเป็นผลลัพธ์ที่ถูกต้อง (คั่นด้วยบรรทัดว่าง):

<.,.> <.,.> <,,,,,.>

<.,.>
<,,,,,.>
<.,.>

,<..>, <.,.> <,,,,.>

<,,,,.>
,<..>,
<.,.>

,<..>, <,,,.> ,<..>,

[",<..>,", ",<..>,", "<,,,.>"] (list syntax depends on language)

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

สำหรับอินพุตเช่น X = 3, Y = 3 หรือ X = 1, Y = 5 โดยที่ไม่มีวิธีแก้ปัญหาเอาต์พุตจะเป็น

~<.,,>~~

อาจอยู่ในรายการองค์ประกอบเดียว

รหัสที่สั้นที่สุดในหน่วยไบต์ชนะ


6
หมีโคอาลาดูเหมือนว่า :-)
Luis Mendo

ฉันสร้าง programm ขนาดเล็กที่แสดงจำนวนชุดค่าผสมสำหรับแต่ละคู่ (X, Y) น่าเสียดายที่ฉันสามารถรันได้จนถึง (128, 128) เพราะนั่นเป็นเรื่องเกี่ยวกับจำนวนสูงสุด__int128และฉันก็ขี้เกียจเกินกว่าจะใช้ห้องสมุด bignum นี่คือการถ่ายโอนข้อมูล CSV: pastebin.com/ght5xkRuแถวและคอลัมน์แรกคือค่า X และ Y
Fytch

คำตอบ:


4

ทับทิม 139 ไบต์

ฟังก์ชัน Lambda รับค่า x และ y เป็นอาร์กิวเมนต์และส่งคืนสตริง

->x,y{c=y-2*n=y-(x>y ?1:0)>>1
x+=-c/2*s=[x-n,c*3].max
x<n||x>n*2?'~<.,,>~~':',<..>, '*(x-n)+'<.,.> '*(2*n-x)+"<%s.> "*c%[?,*s-=c/2*3,?,*3]}

หากมีวิธีการแก้ปัญหาก็สามารถทำได้กับ koalas + commapillars ทั้งหมดหรือ koalas + ปูทั้งหมด

หลักการคือการใช้อย่างน้อย commapillars หากจำนวนเป็นเลขคี่เราจะใช้ 1 เครื่องหมายคอมม่า แม้ว่าเราจะใช้ 0 จุลภาคยกเว้นว่ามีเครื่องหมายจุลภาคมากกว่าระยะเวลาในกรณีที่เราใช้ 2

จำนวนของระยะเวลาที่ใช้ในการ noncommapillars นี้ (ปู + โคอาล่า) เป็นจำเป็นต้องได้และจำนวน noncommapillars (number of periods)-(number of commapillars)เป็นครึ่งหนึ่ง หากมีโควต้าไม่เพียงพอสำหรับโคอาล่าทั้งหมดหรือมากเกินไปสำหรับปูทุกตัวจะไม่สามารถแก้ปัญหาได้ มิฉะนั้นเราจะส่งคืนโซลูชัน

แสดงความคิดเห็นในโปรแกรมทดสอบ

ใช้ "ล้มเหลว" แทนกิ้งก่าเพื่อความชัดเจน

f=->x,y{c=y-2*n=y-(x>y ?1:0)>>1
#n=noncommapillars=y>>1 as they have 2 periods. c=commapillars=y-2*n, 1 for odd y, 0 for even y.
#if x>y there are too many commas to have 0 commapillars for even y. noncommapillars= y-1 >> 1, so 2 commapillars

x+=-c/2*s=[x-n,c*3].max
# s=number of commas allocated to commapillars. x-n to allow all noncommapillars to be koalas, but at least 3 per commapillar.
#-c/2 == -1 if there are commapillars, 0 if not (Ruby truncates toward -inf). Subtract commas for commapillars from x if necessary

x<n||x>n*2?'fail':',<..>, '*(x-n)+'<.,.> '*(2*n-x)+"<%s.> "*c%[?,*s-=c/2*3,?,*3]}
#if x<n (insufficient commas for all koalas) or x>n*2 (too many for all crabs) return fail. Else...
#return string off crabs, koalas, and (using % operator like sprintf) c commapillars (0..2), the second with 3 commas (if present) and the first with the rest.  



10.times{|j|10.times{|i|puts "%-20s %s"%[?.*j+?,*i,f[i,j]]}}
#all x,y from 0..9

เอาท์พุต

,                    fail
,,                   fail
,,,                  fail
,,,,                 fail
,,,,,                fail
,,,,,,               fail
,,,,,,,              fail
,,,,,,,,             fail
,,,,,,,,,            fail
.                    fail
.,                   fail
.,,                  fail
.,,,                 <,,,.>
.,,,,                <,,,,.>
.,,,,,               <,,,,,.>
.,,,,,,              <,,,,,,.>
.,,,,,,,             <,,,,,,,.>
.,,,,,,,,            <,,,,,,,,.>
.,,,,,,,,,           <,,,,,,,,,.>
..                   fail
..,                  <.,.>
..,,                 ,<..>,
..,,,                fail
..,,,,               fail
..,,,,,              fail
..,,,,,,             <,,,.> <,,,.>
..,,,,,,,            <,,,,.> <,,,.>
..,,,,,,,,           <,,,,,.> <,,,.>
..,,,,,,,,,          <,,,,,,.> <,,,.>
...                  fail
...,                 fail
...,,                fail
...,,,               fail
...,,,,              <.,.> <,,,.>
...,,,,,             <.,.> <,,,,.>
...,,,,,,            <.,.> <,,,,,.>
...,,,,,,,           <.,.> <,,,,,,.>
...,,,,,,,,          <.,.> <,,,,,,,.>
...,,,,,,,,,         <.,.> <,,,,,,,,.>
....                 fail
....,                fail
....,,               <.,.> <.,.>
....,,,              ,<..>, <.,.>
....,,,,             ,<..>, ,<..>,
....,,,,,            fail
....,,,,,,           fail
....,,,,,,,          <.,.> <,,,.> <,,,.>
....,,,,,,,,         <.,.> <,,,,.> <,,,.>
....,,,,,,,,,        <.,.> <,,,,,.> <,,,.>
.....                fail
.....,               fail
.....,,              fail
.....,,,             fail
.....,,,,            fail
.....,,,,,           <.,.> <.,.> <,,,.>
.....,,,,,,          <.,.> <.,.> <,,,,.>
.....,,,,,,,         <.,.> <.,.> <,,,,,.>
.....,,,,,,,,        <.,.> <.,.> <,,,,,,.>
.....,,,,,,,,,       <.,.> <.,.> <,,,,,,,.>
......               fail
......,              fail
......,,             fail
......,,,            <.,.> <.,.> <.,.>
......,,,,           ,<..>, <.,.> <.,.>
......,,,,,          ,<..>, ,<..>, <.,.>
......,,,,,,         ,<..>, ,<..>, ,<..>,
......,,,,,,,        fail
......,,,,,,,,       <.,.> <.,.> <,,,.> <,,,.>
......,,,,,,,,,      <.,.> <.,.> <,,,,.> <,,,.>
.......              fail
.......,             fail
.......,,            fail
.......,,,           fail
.......,,,,          fail
.......,,,,,         fail
.......,,,,,,        <.,.> <.,.> <.,.> <,,,.>
.......,,,,,,,       <.,.> <.,.> <.,.> <,,,,.>
.......,,,,,,,,      <.,.> <.,.> <.,.> <,,,,,.>
.......,,,,,,,,,     <.,.> <.,.> <.,.> <,,,,,,.>
........             fail
........,            fail
........,,           fail
........,,,          fail
........,,,,         <.,.> <.,.> <.,.> <.,.>
........,,,,,        ,<..>, <.,.> <.,.> <.,.>
........,,,,,,       ,<..>, ,<..>, <.,.> <.,.>
........,,,,,,,      ,<..>, ,<..>, ,<..>, <.,.>
........,,,,,,,,     ,<..>, ,<..>, ,<..>, ,<..>,
........,,,,,,,,,    <.,.> <.,.> <.,.> <,,,.> <,,,.>
.........            fail
.........,           fail
.........,,          fail
.........,,,         fail
.........,,,,        fail
.........,,,,,       fail
.........,,,,,,      fail
.........,,,,,,,     <.,.> <.,.> <.,.> <.,.> <,,,.>
.........,,,,,,,,    <.,.> <.,.> <.,.> <.,.> <,,,,.>
.........,,,,,,,,,   <.,.> <.,.> <.,.> <.,.> <,,,,,.>

4

Befunge, 249 218 ไบต์

&::00p&::00g\`-2/:20p2*-3*:30p\20g-`:!00g20g-*\30g*+:30g-v>:#,_@
"~<.,,>~~"0_v#\g03+`g050`\0:-g02\p05:-\*2g02:-*/6+3g03p04<^
$"<">:#,_40p>:!#|_3-0" >.,,"40g3>3g#<\#-:#1_
0" ,>..<,">:#,_$>:!#|_1-
#@_1-0" >.,.<">:#,_$>:!

ลองออนไลน์!

ตอนนี้ขึ้นอยู่กับอัลกอริทึมในการตอบ RubyจากLevel River Stซึ่งให้ขอบเขตที่มากขึ้นสำหรับการเล่นกอล์ฟและการลดขนาดลงอย่างมากเมื่อเทียบกับโซลูชันดั้งเดิมของฉัน


2

C # 6, 321 303 bytes

using System.Linq;string F(int x,int y)=>S(x,y)??"~<.,,>~~";string S(int x,int y)=>x<0|y<0?null:y<1?x<1?"":null:y*3>x?S(x-1,y-2)!=null?S(x-1,y-2)+"<.,.> ":S(x-2,y-2)!=null?S(x-2,y-2)+",<..>, ":null:string.Concat(new int[y].Select((_,k)=>k<1?C(x-y*3+3):C(3)));string C(int x)=>$"<{new string(',',x)}.> ";

โทรF(). อีกสองฟังก์ชั่นเป็นผู้ช่วยเหลือ repl.it การสาธิต

// Coalesce failed combinations with commaleon
string F(int x,int y)=>S(x,y)??"~<.,,>~~";
// Get successful combination or null
string S(int x,int y)=>
    x<0|y<0
        // Fail: Out of range
        ?null
        :y<1
            ?x<1
                // Successful: All commas and periods accounted for
                ?""
                // Fail: Not enough periods for commas
                :null
            :y*3>x
                // Not all commapillars
                ?S(x-1,y-2)!=null
                    // Try koala
                    ?S(x-1,y-2)+"<.,.> "
                    // Try crab
                    :S(x-2,y-2)!=null
                        ?S(x-2,y-2)+",<..>, "
                        // Epic fail
                        :null
                // All commapillars
                :string.Concat(new int[y].Select((_,k)=>k<1
                    // This commapillar takes most of commas
                    ?C(x-y*3+3)
                    // The rest each takes 3
                    :C(3)));
// Generate single commapillar
string C(int x)=>$"<{new string(',',x)}.> ";
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.