Uykuya Koyunları Saymak


11

Çoğu insan uykuya dalmak için koyun sayma konusuna aşinadır. Bazıları bir çitin üzerinden atlayan bir koyun sürüsü var ve siz atlarken koyunları sayıyorsunuz. Sözde, bu zihninizi sakinleştirmeye yardımcı olur ve sizi uykuya dalmanız için uyku benzeri bir duruma sokar.

Sayılmayı bekleyen sağa bakan bir ASCII koyun:

'00^>
 ||

İşte bir çitin üzerinden atlayan bir ASCII koyun:

'00^>
 /\
 ++

İşte sola bakan, daha önce sayılmış olan:

<^00'
  ||

Meydan okuma

İki giriş tamsayılar göz önüne alındığında, nve mile, n > 2kaç koyun toplam açıklayan ve m > 0önceden sayılmış kaç koyun diyerek çıkış sayma koyun bir ASCII sanatı gösterimi uykuya dalmak.

Şimdi bükülme için:

  • Koyunların içerdiği kalemlerin büyüklüğü nedeniyle, üst sıra yalnızca maksimum 10 her zaman en üst sırada olması gereken atlayan koyunları saymaz, koyun .
  • Sonraki satırlar kendi kalemlerinin dışında koyunlara sahip olamazlar (ikinci sırada solda, ilk sırada olduğundan daha fazla ve sağda aynı şekilde daha fazla koyun olamaz).
  • Varsa 11veya daha fazla toplam koyun, üst satır olmalıdır10 artı o atlama koyun.
  • Önde / arkadaki boşluk ve koyunlar arasındaki boşluk, şu sürece önemli değildir:
    1. Koyunlar arasında en az bir boşluk karakteri vardır
    2. Tüm karakterler uygun şekilde sıralanır.

Bu kurallara uyulduğu sürece, koyunların gerçek düzenlemesi sizin uygulamanıza bağlıdır.

Örnekler

Örneğin, işte n=3ve m=1en basit durum.

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

İşte n=11ve m=6, bir yatay çizgiye sığabilecek en koyun.

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

İşte bunun ile farklı bir örnek, n=11vem=1

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

n=30Ve ile daha büyük bir örnekm=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'
                                                        ||    || 

İşte n=17ve ile bir örnekm=2

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

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

İşte n=19ve ile bir örnekm=3

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

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

'00^>
 ||  

Bunların hepsinin örnek olduğunu unutmayın . Sonuncusu için, sağ tarafta dikey bir koyun dizisi oluşturabilir, bu da sol tarafın iki satıra sığmasını sağlar. Ya da belki de sağ taraftaki 2x2 karelik bir koyun, sol taraftaki koyunları da iki sıraya sığdıracaktır. Vb.

G / Ç ve Kurallar

  • Giriş herhangi bir makul biçimde ve herhangi bir uygun yöntemle alınabilir .
  • Karakterlerin uygun şekilde hizalanması şartıyla, öndeki / sondaki yeni satırlar veya diğer boşluklar isteğe bağlıdır.
  • Tam bir program veya bir işlev kabul edilebilir. Bir işlev varsa, çıktıyı yazdırmak yerine döndürebilirsiniz.
  • Çıktı konsola olabilir, bir dize listesi olarak döndürülebilir, tek bir dize olarak döndürülebilir, vb.
  • Standart boşluklar yasaktır.
  • Bu bu nedenle tüm olağan golf kuralları geçerlidir ve en kısa kod (bayt cinsinden) kazanır.

2
@ Çubuk Daha büyük bir örnek ekledim, ancak bunun sadece bir örnek olduğunu ve çıktınızın farklı olabileceğini unutmayın .
AdmBorkBork


Önerilen test örneği: n=11vem=9
Adám

@ Adam Orada 10 test durumları olabilir n=11, öyle ki 0<m<=10. Bu, tüm koyunların üst sırada olmasını ve çitin solunda ( n-1-m) ve sağında ( m) dinamik sayıda koyun olmasını sağlar ve sabit kalem boyutlarını kullanamaz.
MT0

@ MT0 Doğru, ancak bir veya iki test durumu bir çözümün işe yaradığını göstermek için yeterli olmalıdır.
Adam

Yanıtlar:


9

APL (Dyalog Unicode) , 118 bayt SBCS

Anonim infix lambda. Alır nsol argüman olarak ve msağ argüman olarak. Yuvalanmış bir dizi sonucu döndürür, ancak bu yuvalanmış dizinin varsayılan görüntüsü spesifikasyonları izler. Sayılan koyunlar için dokuz sütun ve bekleyen koyunlar için kalan sütunlar kullanır.

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

Çevrimiçi deneyin!

{} Anonim lambda; sol argüman, sağ argüman

Bu işlevin üç ayrı bölümü vardır: Bekleme , Zıplama ve Sayma . Her biri parantez içine alınır ve sonucun üç elemanlı bir liste olmasına neden olur.

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

''()' ||' Aynalı sayılan koyunların üç çizgisi, ortadaki:

b←'''00^<' vücut ve atandı b

 dize listesini bir karakter matrisine karıştır (boşluklu dolgu)

 aynala

S← atamak S(büyük S heep)

 onu bir birim olarak ele alabilmemiz için içine alın

⍵⍴ sayılan koyun sayısını döngüsel olarak yeniden şekillendirmek için kullanın.

(… Bundan )↑ aşağıdaki sayıda öğeyi al (prototip öğelerle doldurma, yani aynı dizi, ancak tüm karakterlerin boşluklarla değiştirilmesi)

⍵÷9 sayılan koyun sayısının dokuzda biri

 hesabı yuvarlamak

9,⍨ buna 9 ekle

r← atamak r(yapacaklarımıza r eshape ile; satır ve sütun)

×/ Bu listenin ürünü (dolgular dahil olmak üzere kaç öğeye ihtiyacımız var)

r⍴ bunu boyut uzunluklarına sahip bir diziye yeniden şekillendir r

Atlama (↑(s←'>',⍨¯1↓b)' /\' ' ++')

()' /\' ' ++' Zıplayan koyunların üç çizgisi, ilki:

¯1↓b son karakteri bırak b

'>',⍨ sağa bakan bir kafa ekleyin

s← saklayın s(küçük s Heep)

 dize listesini bir karakter matrisine karıştır (boşluklu dolgu)

Bekleme (r⍴(×/r←d,⍨⌈w÷d←10-⍵⌊⊢/r)↑w⍴(w←⍺-⍵+1)⍴⊂s@2⌽S)

⌽S ayna S

s@2 koymak s de (orada güncel verileri değiştirme) bu hat 2

 onu bir birim olarak ele alabilmemiz için içine alın

()⍴ Bunu aşağıdaki boyutta döngüsel olarak yeniden şekillendirin:

⍵+1 sayılan koyun sayısı artı bir

⍺- toplamdan çıkart

w← atamak w( ağırlık aiting)

(… Bundan )↑ aşağıdaki sayıda öğe al (prototip öğelerle doldurma)

⊢/r en sağdaki öğe r(sayılan koyunlar için kullanılan sütun sayısı)

⍵⌊ toplamın minimum ve bu

10- onu ondan çıkart

d← atamak d( d ifference; eksik sütun)

 bölmek wBununla

 yuvarla (gerekli satır sayısını verir)

d,⍨ ekleme d

r← atamak r(yapacaklarımıza r eshape ile; satır ve sütun)

×/ Bu listenin ürünü (dolgular dahil olmak üzere kaç öğeye ihtiyacımız var)

r⍴ bunu boyut uzunluklarına sahip bir diziye yeniden şekillendir r


1
@ WeijunZhou Haklısın, düzeltir.
Adám

1
Bu zorluğa nasıl cevap vereceğimi merak ediyordum. Sanırım şu şekilde: p
J. Sallé

1
@ WeijunZhou Düzeltildi.
Adám

"Bekleyen koyunlar için her zaman dokuz sütun ve sayılan koyunlar için tek bir sütun ayırır." Bu işe yarıyor mu n=11,m=9ve "üst sıra 10 artı atlama koyusu olmalı" kuralı mı?
MT0

3

Javascript, 281 , 293 , 288 Bayt

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

Aşağıdaki snippet'i kullanırken dikkatli olun, ani uyarılmış narkolepsi riski vardır.

  <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
Bu n = 50, m = 3 için 4 sayılan koyun gösterir ve ayrıca n = 20, m = 3 için yanlış hizalanmış koyun vardır. Ayrıca n = 20, m = 1 sayılan 2 koyun gösterir.
ale10ander

2
Bu hatalar düzeltildi. Ayrıca bazı koyunların yuvarlama hataları nedeniyle kaçtığını tespit etti.
Jhal

Bir m = nhata alırsanız.
aimorris

Bu görmezden gelilebileceğini düşündüğüm bir senaryodur. Sorunun yazılma şekli şöyledir: m = Sağ taraftaki koyun sayısı n = Toplam koyun sayısı Ve çiti de atlayan bir koyun var. Bu nedenle n, m'ye eşit olamaz, bu nedenle bunu açıklamamıştım.
Jhal

2

C, 392 bayt

@Jonathan Frech'e bir bayt tasarrufu için teşekkürler!

#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++);}

Çevrimiçi deneyin!

unrolled:

#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+!tolabilir y-=~!t.
Jonathan Frech

@JonathanFrech Evet, teşekkürler!
Steadybox

1

Piton 2 , 222 277 bayt

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

Çevrimiçi deneyin!


Başarısız n=11vem=2 .
48

Bunu koştuğumda ilk sırada 11 koyun almıyorum.
Robert Benson

1
@RobertBenson Teşekkürler, düzeltildi
TFeld

0

AWK , 293 bayt

{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" "}}

Çevrimiçi deneyin!

Bazı döngüler önlemek için dize ikameleri kullanarak denedim, ama çok daha fazla kod aldı.

açıklama

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

Koyun sanatının oldukça sevimli olduğunu söylemeliyim. :)


0

Kömür , 98 bayt

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

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı versiyonudur. Açıklama:

Nθ

Daha önce sayılmış olan koyun sayısını girin.

≔⁻⊖Nθη

Toplam koyun sayısını girin ve hala kaçının sayılması gerektiğini hesaplayın.

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

İki diziden oluşan bir dizi oluşturun. Her dizi aşağıdaki öğelere sahiptir:

  • Atlayan koyunların yarısını içeren bir dize
  • Çitin o tarafındaki koyun sayısı
  • Çitin o tarafında bir sıradaki koyun sayısı, ya
    • 5'ten azsa, çitin o tarafındaki koyun sayısı veya
    • 10 - çitin diğer tarafındaki koyun sayısı, 5'ten az ise veya
    • 5, her iki tarafta en az 5 koyun varsa
J⁰¦⁰‖T§ι⁰↗

Tuvali yansıtın ve yarım atlama koyun yazdırın.

F§ι¹«

O taraftaki koyunların arasından geçin.

<^00'¶  || ↗

Bir koyun yazdırın.

¿¬﹪⊕κ§ι²”|I4O

Bu satırın sonu ise, sonraki koyunların başlangıcına ulaşmak için bazı satırlar ve boşluklar yazdırın.

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.