Koale, Kraby i Commapillars

21

Biorąc pod uwagę dwie dodatnie liczby całkowite X i Y, wyprowadzaj dowolną kombinację trzech następujących zwierząt ASCII, tak że wynik zawiera dokładnie X przecinków ( ,) i kropek Y ( .), jeśli jest to możliwe.

  1. Koala: 1 przecinek, 2 kropki

    <.,.>
    
  2. Krab: 2 przecinki, 2 kropki

    ,<..>,
    
  3. Commapillar: 3 lub więcej przecinków, 1 kropka

    <,,,.>
    

    lub <,,,,.>lub <,,,,,.>lub <,,,,,,.>lub <,,,,,,,.>itd.

Jeśli żadna kombinacja tych zwierząt nie wytworzy dokładnie przecinków X i okresów Y, wyślij jeden przecinek, który zakamufluje awarię:

~<.,,>~~

Zwierzęta wyjściowe mogą być w dowolnych ilościach i dowolnej kolejności. Mogą być oddzielone ciągiem, spacją lub znakiem nowej linii lub też na liście, gdzie każde zwierzę jest jednym elementem.

Na przykład dla X = 7, Y = 5, wszystkie byłyby prawidłowymi danymi wyjściowymi (oddzielone pustymi liniami):

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

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

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

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

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

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

Zauważ, że (przynajmniej w tym przykładzie) istnieje wiele zestawów zwierząt, które mogą pracować. Pamiętaj jednak, że musisz podać tylko jedno prawidłowe rozwiązanie, jeśli takie istnieje. Liczba zwierząt lub liczba różnych zwierząt nie ma znaczenia.

Dla danych wejściowych takich jak X = 3, Y = 3 lub X = 1, Y = 5, gdy nie ma rozwiązania, wyjście zawsze będzie

~<.,,>~~

być może na liście jednoelementowej.

Najkrótszy kod w bajtach wygrywa.

Hobby Calvina
źródło
6
Koala wygląda tak :-)
Luis Mendo
Stworzyłem mały program, który wyświetla liczbę kombinacji dla każdej pary (X, Y). Niestety mogłem go uruchomić tylko do (128, 128), ponieważ jest to około maksimum dla __int128i byłem zbyt leniwy, aby użyć biblioteki bignum. Oto zrzut CSV: pastebin.com/ght5xkRu pierwszy wiersz i kolumna to wartości X i Y
Fytch

Odpowiedzi:

4

Rubin, 139 bajtów

Funkcja lambda, przyjmuje x i y jako argumenty i zwraca ciąg znaków

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

Jeśli istnieje rozwiązanie, można to zrobić ze wszystkimi koalami + commapillars lub wszystkimi koalami + krabami.

Zasadą jest użycie minimum komapilar. Jeśli liczba jest nieparzysta, używamy 1 commapillar. jeśli nawet użyjemy 0 commapillars, chyba że jest więcej przecinków niż kropki, w takim przypadku używamy 2.

Liczba okresów używanych w niekapilarach (kraby + koale) jest koniecznie równa, a liczba niekapilarnych wynosi połowę (number of periods)-(number of commapillars). Jeśli nie ma wystarczającej liczby przecinków dla wszystkich koali lub zbyt wielu dla wszystkich krabów, żadne rozwiązanie nie jest możliwe. W przeciwnym razie zwracamy rozwiązanie.

Skomentowane w programie testowym

dla jasności używa słowa „fail” zamiast kameleona

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

Wydajność

,                    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
.........,,,,,,,     <.,.> <.,.> <.,.> <.,.> <,,,.>
.........,,,,,,,,    <.,.> <.,.> <.,.> <.,.> <,,,,.>
.........,,,,,,,,,   <.,.> <.,.> <.,.> <.,.> <,,,,,.>
Level River St
źródło
4

Befunge, 249 218 bajtów

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

Wypróbuj online!

Jest to teraz oparte na algorytmie z odpowiedzi Ruby autorstwa Level River St , który zapewnił większy zakres gry w golfa i znaczną redukcję wielkości w porównaniu do mojego oryginalnego rozwiązania.

James Holderness
źródło
2

C # 6, 321 303 bajtów

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

Zadzwoń F(). Pozostałe dwie funkcje są pomocnikami. 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)}.> ";
Link nr
źródło