Koalas, Yengeç ve Commapillar


21

İki pozitif tamsayı X ve Y verildiğinde, aşağıdaki üç ASCII-art hayvanının herhangi bir kombinasyonunu, çıkışın mümkünse tam olarak X virgülleri ( ,) ve Y periyotları ( .) içerecek şekilde verin.

  1. Koala: 1 virgül, 2 dönem

    <.,.>
    
  2. Yengeç: 2 virgül, 2 dönem

    ,<..>,
    
  3. Virgül: 3 veya daha fazla virgül, 1 dönem

    <,,,.>
    

    ya da <,,,,.>ya da <,,,,,.>ya da <,,,,,,.>ya da <,,,,,,,.>vs.

Bu hayvanların hiçbir kombinasyonu tam olarak X virgülleri ve Y periyotları üretemezse, başarısızlığı kamufle edecek tek bir virgül çıkar.

~<.,,>~~

Çıkış hayvanları herhangi bir miktarda ve herhangi bir sırada olabilir. Bunlar ayrılmış bir ipte, uzayda veya yeni satırda veya her bir hayvanın bir element olduğu bir listede olabilir.

Örneğin, X = 7, Y = 5 için bunların tümü geçerli çıktılar olur (boş satırlarla ayrılır):

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

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

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

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

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

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

(En azından bu örnekte) çalışabileceklerinden çok sayıda hayvan grubunun bulunduğunu unutmayın. Ancak, varsa, yalnızca herhangi bir geçerli çözüm çıkarmanız gerektiğini unutmayın . Hayvan sayısı veya farklı hayvan sayısı önemli değildir.

X = 3, Y = 3 veya X = 1, Y = 5 gibi girdiler için, çözüm yok, çıktı daima

~<.,,>~~

belki de tek elemanlı bir listede.

Bayt cinsinden en kısa kod kazanır.


6
Koala da öyle gözüküyor :-)
Luis Mendo

Her bir çift için kombinasyon sayısını (X, Y) veren küçük bir program oluşturdum. Ne yazık ki, (128, 128) 'e kadar çalıştırabilirim çünkü bu maksimum __int128değerdi ve bignum kütüphanesi kullanamayacak kadar tembeldim. İşte CSV dökümü: pastebin.com/ght5xkRu ilk satır ve sütun X ve Y değerleridir
Fytch

Yanıtlar:


4

Ruby, 139 bayt

Lambda işlevi, x ve y'yi argüman olarak alır ve bir dize döndürür

->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]}

Bir çözüm varsa, tüm koalas + commapillar veya tüm koalas + yengeçlerle yapılabilir.

İlke, asgari miktarda virgül kullanmaktır. Sayı tuhafsa 1 virgül kullanırız. 0 virgül kullanıyor olsak bile, dönemlerden daha fazla virgül olmadıkça, bu durumda 2 kullanırız.

Ticari olmayanlarda (yengeçler + koalalar) kullanılan periyodların sayısı mutlaka aynıdır ve ticari olmayanların sayısı yarıdır (number of periods)-(number of commapillars). Tüm koalas için yeterli virgül veya tüm yengeçler için çok fazla virgül varsa, çözüm mümkün değildir. Aksi takdirde, bir çözüm iade ederiz.

Test programında yorum yaptı

netlik için bukalemun yerine "başarısız" kullanır

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

Çıktı

,                    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 bayt

&::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" >.,.<">:#,_$>:!

Çevrimiçi deneyin!

Bu şimdi de algoritmasına dayanır Ruby cevap tarafından Seviye Nehri St golf ve benim orijinal çözüme kıyasla boyutunda önemli bir azalma artmasına yol sağladı.


2

C # 6, 321 303 bayt

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)}.> ";

Çağrı F(). Diğer iki fonksiyon yardımcıdır. repl.it demo

// 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)}.> ";
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.