Sayı Üçgenleri


11

Kredi

Rand Al'Thor'un bu kod golf mücadelesine ilham veren mektup temelli soruya teşekkür ederim .

Arka fon

Bu zorluğun doğası, Rand'ın "Üç Harfden Oluşan Üçgen" te belirtilen algoritmaya dayanmaktadır:

  • Her biri X, Y veya Z olan 10 harflik bir sıra ile başlayın.
  • Her satırın altında, sonraki satırı aşağıdaki gibi oluşturun. İki bitişik harf aynı ise, altlarına aynı harfi yazın; eğer farklılarsa, altlarındaki üçüncü harfi yazın.

Daha sonra onuncu satırınızda bir harf olana kadar önceki adımı tekrar edersiniz.

Meydan okuma

Yukarıdaki algoritmaya matematiksel bir dönüş yapacağız:

  • Her biri bir boşlukla ayrılmış ve her biri 1, 2 veya 3 olan 10 basamaklı bir diziyle başlayalım.
  • Her satırın altında, sonraki satırı aşağıdaki gibi oluşturun. İki bitişik basamak aynı ise, altlarına aynı basamağı yazın; eğer farklılarsa, altındaki üçüncü haneyi yazın.
  • Bir son numaranız olana kadar önceki adımı tekrarlayın.

Bu nedenle, bu algoritmayı izleyerek 1 2 3 3 1 3 1 3 1 2, örneğin satırla başlıyorsanız , aşağıdaki üçgen oluşturulur:

Input: 1 2 3 3 1 3 1 3 1 2

Output:

1 2 3 3 1 3 1 3 1 2
 3 1 3 2 2 2 2 2 3 
  2 2 1 2 2 2 2 1  
   2 3 3 2 2 2 3   
    1 3 1 2 2 1    
     2 2 3 2 3     
      2 1 1 1      
       3 1 1       
        2 1        
         3         

Ayrıca sayı üçgenindeki tüm rakamların toplamını bilmek de merak ediyorum, bu yüzden tüm bu rakamları ekleyin ve bu toplamı ilk satırdaki son basamağa doğru olarak haklı olarak onbirinci satıra koyun. Yani, sayı üçgenimiz aşağıdaki gibi görünecektir (örneğimdeki boşluklar, .biçimlendirmeyi gösteren karakterle aşağıda temsil edilir .)

Input: 1 2 3 3 1 3 1 3 1 2

Output:

1.2.3.3.1.3.1.3.1.2
.3.1.3.2.2.2.2.2.3.
..2.2.1.2.2.2.2.1..
...2.3.3.2.2.2.3...
....1.3.1.2.2.1....
.....2.2.3.2.3.....
......2.1.1.1......
.......3.1.1.......
........2.1........
.........3.........
................109

Sorun, girilen bir string / array / etc ile başlayabilen kod yazmaktır. örneğime göre on basamaktan oluşan bir sayı girin ve ardından sayı üçgenini oluşturacak on satırı ve ardından sağa yaslama ile tüm basamakların toplamını görüntüleyecek 11. satırı oluşturmak için algoritmayı uygulayın.

Test yapmak

Bu dizenin testi, seçtiğiniz on basamaktan oluşan rastgele oluşturulmuş bir dizeyle veya aşağıdaki snippet'ten oluşturulmuş bir dizeyle yapılabilir ...

c1=()=>('1331123221'+(Math.random()*(1<<24)|0).toString(4)).replace(/0/g, "").slice(-10).split("").join(" ");

$("#btn").click(function(){
  $("#str").val(c1());
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="text" id="str"><button id="btn">Get numbers</button>
<br>
Please use this snippet to generate a starting row for testing your code. Alternatively, you can also use a string of your choice, so long as it's ten digits (ranging from 1 to 3), separated by single spaces.

kurallar

  1. Kod-golf kuralları geçerlidir, bu yüzden en az sayıda bayt zorluğu kazanır. Aynı düşük puana sahip iki giriş olması durumunda, kazanan oy sayısı üzerinden ödüllendirilir.
  2. Temelde peşinde olduğumuz şey 11 satır, 19 karakter uzunluğunda ... Son çıktınızı nasıl oluşturduğunuz tamamen size bağlı: dizi, konsol, dosya çıktısı, STDOUT, vb. Lütfen istediğiniz çıktı yöntemini kullanın yararınıza çalışmak. Çıktıdaki tek kural, her satıra 19 karakterden oluşan 11 satıra sahip olmaktır.
  3. Kodunuza yardımcı olursa, basamaklar için herhangi bir ayırıcı kullanın ... Okunabilirliğin katkıda bulunan bir faktör olabileceğini unutmayın.
  4. Aptal boşluklar yok .
  5. Girişin sabit kodlamasına izin verilmiyor. Bu kodun amaçları, değişken girdilerle her seferinde farklı sonuçlar üretmek için kullanılabilecek şekildedir. 1 1 1 1 1 1 1 1 1 1Örneğin sabit kodlama , algoritmanın tüm noktasını tamamen ortadan kaldırır.

Hepinizin neler yapabileceğini görmek için sabırsızlanıyoruz!



1
Üçgilim merkeze hizalanmışsa (bu nedenle okunabilir) bir ayırıcıya ihtiyacım var mı?
JungHwan Min

1
Öyle görünüyor bu (cevabım 10 bayt alır alana sahip olur) boşluksuz.
JungHwan Min

2
İzin verildi
WallyWest

1
10 (veya 3 kuvvetinden büyük herhangi bir sayı 1) basamaklı bir dize için son basamağın, dizgideki ilk ve son basamaktan önemsiz bir şekilde hesaplandığını unutmayın; diğer rakamlar fark etmez.
Neil

Yanıtlar:


1

05AB1E , 32 26 bayt

DvÐOˆðýðN×.ø,ü+3%3^}\¯O19j

açıklama

D                 # duplicate input
v                 # for y,N in input,len(input): (10 times do)
 Ð                # triplicate current list
 Oˆ               # sum one copy and add it to global array
 ðý               # merge one copy on spaces
   ðN×.ø          # surround it with N spaces
        ,         # and print it
 ü+               # reduce one copy by addition
   3%             # modulus 3
     3^           # XOR 3
                  # this is the list sent to the next iteration
}                 # end loop
\                 # drop empty list left over from last iteration of loop
 ¯O               # sum the global array giving the triangles total sum
   19j            # join with spaces up to 19 chars

Çevrimiçi deneyin!


7

Mathematica, 104 97 90 94 bayt

{Grid[List@*Row/@#],#~Total~2}~Column~Right&[NestList[3-Mod[+##,3]&@@@Partition[#,2,1]&,#,9]]&

açıklama

Partition[#,2,1]

Girişi uzunluk 2'ye böler, 1 bölümü öteler.

3-Mod[+##,3]&@@@

Her bölümü alır ve karşılık gelen çıktıyı hesaplar.

Burada bir numara var. İki sayıyı topladım, mod 3 aldım ve bu sonucu 3'ten çıkardım. Bu istenen sayıyı verir. (örneğin 3 - ((2 + 1) mod 3) = 3)

NestList[ ... ,9]

Çıktı olarak tüm iterasyonları vererek yukarıdaki işlemi dokuz kez tekrarlar.

Grid[List@*Row/@#]

Her bir yinelemeyi satırlar halinde biçimlendirin ve üçgeni oluşturarak her şeyi tek bir sütuna (ortaya hizalanmış) koyun.

#~Total~2

Tüm sayıların toplamını alın.

{...}~Column~Right

Üçgeni ve toplamı birleştirin ve tüm şeyi sağa hizalayın (üçgen zaten hizalanır, böylece hizalaması etkilenmez).


1
Hem özdeş hem de farklı ebeveyn türlerini önemseyen tek bir işlevle ilham veren yaklaşım ... Sevdim!
WallyWest

3

JavaScript (ES6), 143 142 bayt

@Neil sayesinde 1 bayt kaydedildi

a=>a.map((_,i)=>(q=" ".repeat(i))+(a=a.map(c=>(x+=r=i&&p^(p=c)||c,r),p=i&&a.shift())).join` `+q,x=0).join`
`+`
`+(" ".repeat(18)+x).slice(-19)

Çeşitli parçaları birleştirmeyi denedim, ancak 5 bayt daha uzun sürdü:

a=>[...a.map((_,i)=>(a=a.map(c=>(x+=r=i&&p^(p=c)||c,r),p=i&&a.shift())).join` `+" ".repeat(i),x=0),x].map(q=>(" ".repeat(18)+q).slice(-19)).join`
`

Harika iş! JHM'nin hilesi 3-((x+y)%3)bu kodu azaltmada herhangi bir yardımcı olabilir mi?
WallyWest

2
Hayır! p^c||pzaten biraz daha kısa :-)
ETHproductions

Şimdi, bunu nasıl özledim? Elbette! XOR fonksiyonları burada iyi çalışıyor!
WallyWest

1
XOR ?! Bunu düşünemezdim. Ne yazık ki, XOR kullanarak kodumu daha uzun hale getiriyor: P
JungHwan Min

İçin i?p^(p=c)||p:ckullanabilir misin i&&p^(p=c)||c?
Neil

2

Yakut, 134101 bayt

JHM'nin modulo hilesini kullanarak.

->a{b=*a
(0..8).map{|i|[" "*i,a=a.each_cons(2).map{|x,y|b<<n=3-(x+y)%3
n}]*" "}<<"%19d"%b.reduce(:+)}

Eval.in'de bakınız: https://eval.in/649993


2

CJam ,  44  40 bayt

l~{S*\_S*\2ew{:+3%3^}%2$N@}A%_s:~:+sJSe[

Çevrimiçi deneyin!

açıklama

l~       e# Read and evaluate input.
{        e# Map this block over i in the range [0 1 ... 9].
  S*     e#   Get a string of i spaces (the indentation).
  \_     e#   Swap with the current line of trits and duplicate it.
  S*     e#   Join the trits with spaces.
  \2ew   e#   Swap with the other copy of the trits and get all consecutive pairs.
  {      e#   Map this block over the pairs...
    :+   e#     Sum the pair.
    3%   e#     Modulo 3.
    3^   e#     XOR 3.
         e#     This expression (x+y)%3 ^ 3 computes the required mapping.
  }%     e#   Now this is the next line.
  2$     e#   Copy the indentation (to pad the lines to equal length).
  N      e#   Push a linefeed.
  @      e#   Pull up the next line.
}A%      e# The result of this is a nested array whose string representation is
         e# the required triangle.
_s       e# Duplicate and flatten into a string.
:~       e# Eval each character which gives a list of all the trits.
:+       e# Sum that.
s        e# Turn the sum into a string.
JSe[     e# Left-pad it with spaces to width 19.

Her zaman olduğu gibi çok etkileyici! Şimdiye kadar öndesiniz!
WallyWest

1
@WallyWest Teşekkürler. :) Pyth, Jelly ve MATL'i bekleyin. ;)
Martin Ender

Aslında, GolfScript çözümünün nasıl görüneceğini merak ediyorum ...;)
WallyWest

Bir SQL çözümü göndermek isteyen var mı? ;)
WallyWest

1

Python 2, 164 bayt

Nispeten basit bir yinelemeli çözüm.

L=input()
s=0
for i in range(len(L)):
    print" "*-~i+" ".join(`L`[1::3]);s+=sum(L);N=L;L=[]
    for a,b in zip(N,N[1:]):L+=[list({1,2,3}-{a,b}),[a]][a==b]
print"%19s"%s

Çevrimiçi deneyin


1

PHP, 143 Bayt

<?for($t=$_GET[t];$i<181;$s+=$v,$i+=2)$t[$i+20]=($v=$t[$i])*($z=$t[$i+2])>0&$i!=18?($v+$z)%3^3:" ";echo chunk_split($t.str_pad($s,8," ",0),19);

0

JavaScript (ES6), 112 , 100 96 bayt

Bir diziyi girdi olarak alır ve özyineli olarak virgülle ayrılmış bir üçgen oluşturur.

f=(s,p=`
`,S=0)=>p+(s[0]?s+f(s.map((v,i)=>(S+=v,v^s[i-1]||v)).slice(1),p+' ',S):(p+S).slice(-9))

console.log(f([1,2,3,3,1,3,1,3,1,2])); // reference example
console.log(f([3,3,2,1,3,1,2,1,2,1])); // random example
console.log(f([1,1,1,1,1,1,1,1,1,1])); // all ones (test case for sum < 100)

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.