Koala, Kepiting, dan Commapillars


21

Diberikan dua bilangan bulat positif X dan Y, output setiap kombinasi dari tiga hewan seni ASCII berikut sedemikian rupa sehingga outputnya mengandung tepat X koma ( ,) dan periode Y ( .), jika memungkinkan.

  1. Koala: 1 koma, 2 periode

    <.,.>
    
  2. Kepiting: 2 koma, 2 periode

    ,<..>,
    
  3. Commapillar: 3 atau lebih koma, 1 periode

    <,,,.>
    

    atau <,,,,.>atau <,,,,,.>atau <,,,,,,.>atau <,,,,,,,.>dll

Jika tidak ada kombinasi dari hewan-hewan ini yang dapat menghasilkan koma X dan periode Y secara tepat, hasilkan satu commaleon yang akan menyamarkan kegagalan:

~<.,,>~~

Hewan yang dihasilkan dapat dalam jumlah dan urutan apa pun. Mereka mungkin berada dalam string, spasi atau baris baru yang terpisah, atau dalam daftar di mana setiap hewan adalah satu elemen.

Misalnya, untuk X = 7, Y = 5, ini semua akan menjadi output yang valid (dipisahkan oleh baris kosong):

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

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

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

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

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

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

Perhatikan bahwa (setidaknya dalam contoh ini) ada beberapa set hewan yang dapat bekerja. Tapi ingat Anda hanya perlu mengeluarkan satu solusi yang valid, jika ada. Jumlah hewan atau jumlah hewan yang berbeda tidak masalah.

Untuk input seperti X = 3, Y = 3 atau X = 1, Y = 5 di mana tidak ada solusi, output akan selalu

~<.,,>~~

mungkin dalam daftar elemen tunggal.

Kode terpendek dalam byte menang.


6
Koala terlihat seperti itu :-)
Luis Mendo

Saya membuat program kecil yang menampilkan jumlah kombinasi untuk setiap pasangan (X, Y). Sayangnya, saya hanya bisa menjalankannya sampai (128, 128) karena itu adalah maksimum untuk __int128dan saya terlalu malas untuk menggunakan perpustakaan bignum. Inilah dump CSV: pastebin.com/ght5xkRu baris dan kolom pertama adalah nilai X dan Y
Fytch

Jawaban:


4

Ruby, 139 byte

Fungsi Lambda, mengambil x dan y sebagai argumen dan mengembalikan sebuah string

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

Jika ada solusi, itu bisa dilakukan dengan semua koala + commapillars atau semua kepiting koala +.

Prinsipnya adalah menggunakan minimum commapillars. Jika angkanya ganjil, kami menggunakan 1 commapillar. bahkan jika kita menggunakan 0 commapillars, kecuali ada lebih banyak koma daripada periode, dalam hal ini kita menggunakan 2.

Jumlah periode yang digunakan dalam noncommapillars (kepiting + koala) harus genap, dan jumlah noncommapillars adalah setengah (number of periods)-(number of commapillars). Jika tidak ada koma yang cukup untuk semua koala, atau terlalu banyak untuk semua kepiting, tidak ada solusi yang mungkin. Kalau tidak, kami kembalikan solusi.

Berkomentar dalam program uji

menggunakan "gagal" bukan bunglon untuk kejelasan

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

Keluaran

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

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

Cobalah online!

Ini sekarang didasarkan pada algoritma dalam jawaban Ruby oleh Level River St , yang memberikan ruang lingkup yang lebih besar untuk bermain golf dan pengurangan ukuran yang signifikan dibandingkan dengan solusi asli saya.


2

C # 6, 321 303 byte

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

Panggil F(). Dua fungsi lainnya adalah pembantu. demo 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)}.> ";
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.