Pure Sourcery - 0 ile 9 arasındaki rakamları veren programları biçimlendirme


21

İşte 0'dan 9'a kadar olan rakamlar için 5 x 7 puntolu:

.███.
█...█
█...█
█...█
█...█
█...█
.███.

..█..
███..
..█..
..█..
..█..
..█..
█████

.███.
█...█
....█
...█.
..█..
.█...
█████

.███.
█...█
....█
..██.
....█
█...█
.███.

█..█.
█..█.
█..█.
█████
...█.
...█.
...█.

█████
█....
█....
.███.
....█
█...█
.███.

.███.
█...█
█....
████.
█...█
█...█
.███.

█████
....█
....█
...█.
...█.
..█..
..█..

.███.
█...█
█...█
.███.
█...█
█...█
.███.

.███.
█...█
█...█
.████
....█
█...█
.███.

(Bu yazı ve size tarayıcılar konsolunda veya önek URL çubuğunda bu JavaScript kodu çalıştırırsanız bu sayfa muhtemelen daha iyi görünecektir javascript:: $('#question pre,.answer pre').css('line-height',1).)

Biri .yukarıdaki fonttaki boş boşlukları ( ) temsil etmek için diğeri de doldurulmuş boşlukları ( ) temsil etmek için iki eşit boyutlu dikdörtgen blok metni yazın .

Bu iki metin bloğu yukarıdaki rakamlardan biri ile aynı 5 × 7 desene göre düzenlendiğinde, ortaya çıkan büyük metin bloğu o basamağı stdout'a basan bir program olmalıdır. Bu, 10 hane için çalışmalıdır.

Örneğin, .metin bloğunuz

---
'''

ve metin bloğunuz

ABC
123

sonra program

---ABCABCABC---
'''123123123'''
ABC---------ABC
123'''''''''123
ABC---------ABC
123'''''''''123
ABC---------ABC
123'''''''''123
ABC---------ABC
123'''''''''123
ABC---------ABC
123'''''''''123
---ABCABCABC---
'''123123123'''

çıkmalı 0. Benzer şekilde, program

------ABC------
''''''123''''''
ABCABCABC------
123123123''''''
------ABC------
''''''123''''''
------ABC------
''''''123''''''
------ABC------
''''''123''''''
------ABC------
''''''123''''''
ABCABCABCABCABC
123123123123123

çıktı 1için program vb. kadar olmalıdır 9.

Rakam şeklindeki programları yapmak için bu yığın pasajını kullanabilirsiniz:

<style>textarea{font-family:monospace;}</style><script>function go(){var t=parseInt(document.getElementById("digit").value[0]);if(isNaN(t))return void alert("Invalid digit.");for(var e=document.getElementById("empty").value.split("\n"),n=document.getElementById("filled").value.split("\n"),l=[],o=0;o<7*e.length;o++){l[o]="";for(var d=0;5>d;d++)l[o]+=font[t][Math.floor(o/e.length)][d]?n[o%n.length]:e[o%e.length]}document.getElementById("output").value=l.join("\n")}font=[[[0,1,1,1,0],[1,0,0,0,1],[1,0,0,0,1],[1,0,0,0,1],[1,0,0,0,1],[1,0,0,0,1],[0,1,1,1,0]],[[0,0,1,0,0],[1,1,1,0,0],[0,0,1,0,0],[0,0,1,0,0],[0,0,1,0,0],[0,0,1,0,0],[1,1,1,1,1]],[[0,1,1,1,0],[1,0,0,0,1],[0,0,0,0,1],[0,0,0,1,0],[0,0,1,0,0],[0,1,0,0,0],[1,1,1,1,1]],[[0,1,1,1,0],[1,0,0,0,1],[0,0,0,0,1],[0,0,1,1,0],[0,0,0,0,1],[1,0,0,0,1],[0,1,1,1,0]],[[1,0,0,1,0],[1,0,0,1,0],[1,0,0,1,0],[1,1,1,1,1],[0,0,0,1,0],[0,0,0,1,0],[0,0,0,1,0]],[[1,1,1,1,1],[1,0,0,0,0],[1,0,0,0,0],[0,1,1,1,0],[0,0,0,0,1],[1,0,0,0,1],[0,1,1,1,0]],[[0,1,1,1,0],[1,0,0,0,1],[1,0,0,0,0],[1,1,1,1,0],[1,0,0,0,1],[1,0,0,0,1],[0,1,1,1,0]],[[1,1,1,1,1],[0,0,0,0,1],[0,0,0,0,1],[0,0,0,1,0],[0,0,0,1,0],[0,0,1,0,0],[0,0,1,0,0]],[[0,1,1,1,0],[1,0,0,0,1],[1,0,0,0,1],[0,1,1,1,0],[1,0,0,0,1],[1,0,0,0,1],[0,1,1,1,0]],[[0,1,1,1,0],[1,0,0,0,1],[1,0,0,0,1],[0,1,1,1,1],[0,0,0,0,1],[1,0,0,0,1],[0,1,1,1,0]]]</script><textarea id='empty' rows='8' cols='32' placeholder='empty space text block...'></textarea><textarea id='filled' rows='8' cols='32' placeholder='filled space text block...'></textarea><br>Digit <input id='digit' type='text' value='0'> <button type='button' onclick='go()'>Generate</button><br><br><textarea id='output' rows='16' cols='64' placeholder='output...' style='background-color: #eee;' readonly></textarea>

ayrıntılar

  • 10 büyük metin bloğu programından hiçbiri giriş gerektirmemelidir. Sadece tek rakamın yanı sıra isteğe bağlı son satırın çıktısını alın. Stdout'a veya benzer bir alternatife çıktı.
  • Programların hiçbiri kendi kaynak kodunu okuyamıyor veya erişemiyor. Sıkı gibi bu tedavi quine meydan.
  • Metin blokları aynı olmayabilir ve sıfır olmayan boyutlara sahip olmalıdır.
  • Metin blokları, satır sonlandırıcılar dışında herhangi bir karakter içerebilir .
  • 10 program aynı dilde yazılmış tam teşekküllü programlar olmalıdır, bunlar REPL kodları değildir . İsteğe bağlı olarak, hepsine veya hiçbirine izleyen bir yeni satır ekleyebilirsiniz.

puanlama

Puanınız, metin bloklarınızdan birinin alanıdır (genişlik zaman yüksekliği). (Aynı boyuttadırlar, bu yüzden her iki bloğu da saymanın bir anlamı yoktur.) Örneğin alanı 6'ya göre 3'e 2'dir.

En düşük puan kazanır. Bağlanma durumunda, en yüksek oyu alan cevap kazanır.


Kodunuzda, onu çok geliştirebilirsiniz. aynı fakat daha kısa olan var t=parseInt(document.getElementById("digit").value[0]);if(isNaN(t))return void alert("Invalid digit.");gibi yazılabilir var t=document.getElementById("digit").value[0]/1;if(t!=t)return void alert("Invalid digit.");. Geliştirebileceğin birkaç şey var, ama harika gözüküyor!
Ismael Miguel

4
@IsmaelMiguel TBH Ben bir satırda almak için bir JS minifier koymak. Asla golf oynamak istemedi.
Calvin'in Hobileri

Ah, dostum ... Bu biraz tembel ... Golf sorusunda golf yapmayan bir kod yazıyorsunuz ... Ama hey, anladım ve şunu söylüyorum. Söylediklerimi takip etmek zorunda değilsin. Ama yapılacak iyi bir şey.
Ismael Miguel

6
@IsmaelMiguel Ben mümkün olduğunca okunaklı olması gerektiğini ungolfed programı kodu, bu yüzden böcekleri tespit etmek daha kolay. Ancak, gerçekten, çalıştığı sürece, yığın pasajının kod boyutu, kelimenin tam anlamıyla mücadelenin sonucuna dayanmaktadır.
Calvin'in Hobileri

3
text blocks may not be identicalGerçekten mi? Birinin bu kuralı ihlal ettiğini görmek istiyorum, her biri tamamen aynı kod olduğunda sihirli bir şekilde farklı rakamlar döndüren iki aynı kod bloğu vererek ^ ^
Falco

Yanıtlar:


13

CJam, 20 18 14 13 12 * 1 = 12

Çevrimiçi deneyin: 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9

Boş blok

];BG*K+ :BD%

Katı kütle

];B9+33%:B4/

açıklama

Sp3000'in çözümüne benzer bir strateji kullandım , öyle ki her blok bir çarpma, toplama ve (muhtemelen) bir değişken üzerinde bir modulo işlemi gerçekleştiriyor ve değeri geri kazanıyor . En uygun çözümü bulmak için eski kaba kuvvet kullandım. Mümkün olan tüm başlangıç ​​değerlerinin (CJam değişkenlerinin başlangıç ​​değerleri) ve milyonlarca olası dönüşüm çiftinin alanını araştıran bir program yazdım, öyle ki her rakam formunun çıktısı benzersizdir. Sonra, sonuçları 8 olan boş bir blokta biten basamak formları için nihai sonucun başka bir çarpma, ekleme ve modülo formülü ile doğru sonuçla eşleştirilebileceği sonuçları filtreledim.

Birkaç günlük CPU arama süresinden sonra, şu ana kadarki en iyi sonuç 12'ye kadar! Bu çözüm 11, boş blok dönüşüm fonksiyonu, x * 16 + 20boş blok sonuç fonksiyonu, x % 13katı blok dönüşüm fonksiyonu (x + 9) % 33ve katı blok sonuç fonksiyonu değeri ile başlar x / 4.


23

> <> (Balık) , 5 * 10 = 50

Boş blok

   \   !9 
4n;    n/ 
1n;\      
       \  
0n;n7\\\  

Katı kütle

   \; n8/ 
     /!/!v
     \  ;6
3n;\ ! /nn
2n;n5<  8;

Bu kod hiçbir mantık içermez veya aritmetik sadece> <> 'nin 2D komut göstergesinin (IP)' aynalar '( /ve \) ve iki' ok '( <ve v) ile statik yönlendirmelerini kullanır . Diğer tek akış kontrolörü, bir !sonraki karaktere atlayan 'trambolin' ( ) ' dir.

IP, Doğu üstündeki sol üst köşeden başlar. Bazı yönlendirmelerden sonra istifin üzerine bastırılır ve yazdırılır nve program ile sonlanır ;.

Program akışı

Bir blok, IP'nin hangi noktaya geldiği ve duruma bağlı olarak, hangi göstergeyi (hangi bloğun gerçekleştirileceğini) göstereceği ve hangi pozisyonda olduğu konusunda karar vermesi gerektiğine karar vermesi nedeniyle programın mevcut durumunu 'tanır' işaretçi bırakmalı (yeni durum bu olacak). Elbette bloklar mantıklı değil, bütün bu davranış yönlendiricilerden geliyor.


Böyle bir cevap bekliyordum. Saf sihir.
EagleV_Attnam

11

CJam, 23 22 19 * 1 = 19

Boş blok:

];G)B%:G"73860594"=

Katı kütle:

];GW*B+3*D%:G    7-

Çevrimiçi deneyin .

Matematiksel tesadüfler ve başarısızlıktan şanslı olmaya çalışıyorum, işte Martin'in çözümünden benzersizlik eşlemesine biraz farklı bir yaklaşım.

16 ile başlayın. Boş bloklar 1 eklenir ve modulo 11 alır. Katı bloklar -1 ile çarpılır, 11 eklenir, 3 ile çarpılır ve sonra modulo 13 alınır. Bu, sihirli bir şekilde 03456789(boş bir blokta biten rakamlar) 41753026indekslemesini kullanır. haklı olmak için. 12Düzgünce haritalandırarak 897'yi çıkararak çözebiliriz.


7

CJam, 28 27 x 1 = 27

İşte bir başlangıç.

Boş blok

U):U;                       

Katı kütle

];U):UW+:WF%"1302986_7_54"=

Burada test et. Size kodla birlikte kalıcı bir bağlantı veremem, çünkü kod çok uzun, bu yüzden meydan okumadaki kod parçasından manuel olarak kopyalamanız gerekecek.

Fikir şekli aşağıdaki gibi toplamaktır:

  • Her "piksel" için bir sayacı arttırın U.
  • Her siyah "piksel" Uiçin W( toplamda başlayan -1) çalışan bir toplam ekleyin . Sonunda, 15bir arama dizgisine endekslemek için kullanılan benzersiz sonuçlar veren bu modülo alıyoruz .
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.