Kendini Onaylayan Üçgen Dama Tahtası Programı


10

Dama tahtası programı, satır sonlandırıcı (herhangi bir standart satır sonu olabilir) hariç, her bir karakterin sıra değerinin çiftten teke değiştiği bir programdır.

Üçgen program, her satırın önceki satırdan bir ek karaktere sahip olduğu ve ilk satırın bir karaktere sahip olduğu bir programdır. Boş girişi işlemenize gerek yoktur.

Göreviniz, verilen girdinin bu ölçütlere uyduğunu ve programın ölçütleri karşılaması durumunda doğruluk yapan bir şey veya çıktılar / tersine döndüren bir program oluşturmaktır.

Programınızın da bu kriterleri karşılaması gerekir.

Geçerli program örnekleri

G
`e
@u^
5r{B

^
cB
+$C
VA01

kurallar

  • Karakterlerin paritesi değiştiği sürece programınız tek veya çift bayt ile başlayabilir.
  • Programınız tek veya çift karakterle başlayan programları doğrulamalıdır.
  • Unicode karakterler için, temel alınan bayt değerlerinin alternatif paritesi olmalıdır.
  • Girişin yalnızca yazdırılabilir karakterler içerdiğini varsayabilirsiniz. Programınız yazdırılamazsa, yine de kendini doğrulayabilmelidir.
  • Programınız bir son satır içerebilir, doğrulamadan önce bunun kaldırıldığını varsayabileceğiniz için doğrulama işleminize izin verilmesine gerek yoktur.
  • Standart boşluklar yasaktır.
  • Her dilde bayt cinsinden en kısa kod kazanır.

@MartinEnder Girişiniz için teşekkür ederiz! Umarım bu şimdi açıktır. Bununla ilgili olarak, bunu daha uzun süre kum havuzunda mı bırakmalıyım?
Dom Hastings

1
/ tek sıra hem yatay hem de dikey midir? "Dama tahtası" dan evet varsayıyorum, ama nerede dediğini görmüyorum.
Ton Hospel

@DomHastings Bir hafta iyi görünüyor. Birkaç gün sonra herhangi bir geri bildirim almazsanız , sohbette başka yorum olup olmadığını sorabilirsiniz .
Martin Ender

1
@TonHospel Benim orijinal örnekler bu, ama o kadar bu uygulama için, hayır, olması gerektiği, benim bilgi ile çelişiyordu: E\nOE\nOEO. Umarım yardımcı olur!
Dom Hastings

2
Benim düşüncem: cevaplar girdinin bir satırsonu ile başlamamasını veya bitmemesini varsayalım.
Lynn

Yanıtlar:


3

Stax , 26 bayt

L
Y$
i:-
 {2%
*OFyF
%vi =*

Test senaryolarını çevrimiçi çalıştırın

3 önemsiz karakter tanıtmak zorunda kaldım. i, tüm döngü yapılarının dışındayken bir işlemdir. her zaman hayır. Oyığının üst kısmına 1 koyar, ancak değer programda kullanılmaz.

LY      move input lines into a list and store in Y register
$       flatten
i       no-op
:-      get pairwise differences
{2%*OF  foreach delta, mod by 2, and multiply, then tuck a 1 under the top of stack
yF      foreach line in original input do...
  %v    subtract 1 from length of line
  i=    is equal to iteration index?
  *     multiply

Bunu çalıştır


Hey, umarım bu kodunuzla çok fazla uğraşmaz, ancak önde gelen yeni satır doğrulamasını bırakabilirsiniz.
Dom Hastings

8

C (gcc), 189 bayt

j
;l
;b;
d;f␉
(char
␉*␉t) 
{b=*␉t%
2;for␉(␉
j=d=0;j=j
+ 1,␉l=j+ 
1,␉*␉t; ) {
for␉(;l=l- 1
 ;t=t+ 1 )b= 
!b␉,␉d=d+ !(␉*
␉t␉*␉(␉*␉t- 10)
*␉(␉*␉t%2-b) ) ;
d␉|=*␉t- 10;t=t+ 
1 ; }b= !d; } ␉ ␉ 

Çevrimiçi deneyin!

sekme karakterini temsil eder (üzgünüm). Birkaç sondaki boşluklar / sekmeler olduğunu unutmayın (daha üzgünüm). Sekmeleri bozulmamış orijinal en iyi vim'de:set tabstop=1 (kelimeler ne kadar üzgün olduğumu ifade edemez).

fBir dizeyi argüman olarak alan ve ya 0da döndüren bir işlevdir (denir , ona bakmaktan hemen anlaşılmaz) 1.

Ben could en az bir ve muhtemelen iki veya daha fazla çizgi, ama bana kötü bir insan gibi hissediyorum çoğunlukla yapıyordu (hatta PPCG standartlarına göre) bu tür korkunç kod yazarken, çünkü sonuna doğru giderek dağınık ve düşük çaba alır o notta bu azaltmak ve en kısa zamanda durdurmak istedim.

Burada temel fikir mutlaka (formatını kırmak olduğunu yapılar kaçınmaktır ++, +=, returnvb.) Mucizevi bir şekilde, ve gibi anahtar kelimeler for, eşlik eden parite kuralına uyuyor. Daha sonra boşlukları (hatta parite) ve sekmeleri (tek parite) dolgu olarak kurallara uydurmak için kullandım.charwhile


1
C'de bir çözüm görmeyi beklemiyordum!
Dom Hastings

TIO'daki programın çözüm kısmını "Başlık" ve "Altbilgi" bölümlerine başka şeyler koyarak yalıtırsanız, insanların bayt sayısını doğrulaması daha kolaydır.
Jakob

4

Haskell , 1080 1033 bayt

;
f=
 g 
ij=f
a =hi
hi = g
hij= ij
g ' ' =0
g '"' =0;
 g '$' =0;
 g '&' =0-0
g '(' =0-0-0
g '*' =0-0-0;
 g ',' =0-0-0;
 g '.' =0-0-0-0
g '0' =0-0-0-0-0
g '2' =0-0-0-0-0;
 g '4' =0-0-0-0-0;
 g '6' =0; g '8' =0
g ':' =0; g '<' =0-0
g '>' =0; g '@' =0-0;
 g 'B' =0; g 'D' =0-0;
 g 'F' =0; g 'H' =0-0-0
g 'J' =0; g 'L' =0-0-0-0
g 'N' =0; g 'P' =0-0-0-0;
 g 'R' =0; g 'T' =0-0-0-0;
 g 'V' =0; g 'X' =0-0-0-0-0
g 'Z' =0; g '^' =0; g '`' =0
g 'b' =0; g 'd' =0; g 'f' =0;
 g 'h' =0; g 'j' =0; g 'l' =0;
 g 'n' =0; g 'p' =0; g 'r' =0-0
g 't' =0; g 'v' =0; g 'x' =0-0-0
g 'z' =0; g '\92' =0-0; g '|' =0;
 g '~' =0; g y = 1 ;z=0; i(-0)z=z;
 i m('\10':y ) ="y"; ; ; ; ; ; ; ; 
i m(mnmnmnmnm:y ) = i(m - 1 ) y ; ; 
i k m ="y"; ; k i [ ] =01<1010101010;
 k m('\10':y ) = k(m + 1 )(i m y ) ; ;
 k m y =01>10; m o = k 1$'\10':o ; ; ; 
o i('\10':y ) = o i y ; ; ; ; ; ; ; ; ; 
o i(k:y )|g k<i = o(1 - i ) y ; ; ; ; ; ;
 o i(k:y )|g k>i = o(1 - i ) y ; ; ; ; ; ;
 o i [ ] =01<10; o i y =01>10;v=01>10101010
s y|o 1 y = m y|o(-0) y = m y ; s y =v; ; ; 

Çevrimiçi deneyin!

açıklama

Haskell için bu oldukça ilginç bir görevdi.

parite

Başlamak için, bir karakterin çift veya tek bir kod noktasına sahip olup olmadığını belirlemenin bir yoluna ihtiyacımız var. Bunu yapabilmenin normal yolu, kod noktasını almak ve 2 ile modifiye etmektir. Ancak, farkında olabileceği gibi, bir karakterin kod noktasının elde edilmesi bir içe aktarma gerektirir, bu da kaynak kısıtlaması nedeniyle Kullanılmış. Daha deneyimli bir Haskeller özyineleme kullanmayı düşünür. Char's Enumtypeclass'ın bir parçası olduğu için seleflerini ve haleflerini alabiliriz. Ancak predve succbunlar alternatif bayt paritesine yok çünkü aynı zamanda hem kullanışsız bulunmaktadır.

Bu bizi oldukça sıkıştırarak karakterlerle herhangi bir manipülasyon yapamayız. Bunun çözümü her şeyi kodlamaktır. Karakterleri bile en çok değişmez olarak gösterebiliriz, sorun yaşadığımız ihtimaller 'gariptir , çünkü karakterin yanında olamaz, değişmez karakterlerin çoğunu ifade etmeyi imkansız hale getirir. Böylece, tüm çift baytları kodlar ve sonunda tek baytlar için bir yakalama ekleriz.

Sorun Bayt

Değişmez değerlerin tek tırnak içine sarılarak yapılamadığı bazı çift baytlar olduğunu fark edebilirsiniz. Bunlar yazdırılamaz, yeni satırlardır ve \. Yazdırılamayanlar hakkında endişelenmemize gerek yok çünkü hiçbirini kullanmadığımız sürece doğrulamamız gerekmiyor. Aslında hala sekme gibi tuhaf yazdırılamazlar kullanabiliriz, sadece buna ihtiyacım yok. Newline büyük ölçüde göz ardı edilebilir, çünkü yine de programdan kesilecektir. (Newline ekleyebiliriz, çünkü kod noktası oldukça uygundur, ancak buna gerek yoktur). Bu yapraklar \, şimdi \tek bir sayı ve ardından çift sayı olan kod noktası 92'ye sahiptir, bu yüzden mükemmel şekilde geçerlidir. Daha sonra newline'ı temsil etmemiz gerektiğinde neyse ki aynı mülke sahip olduğunu fark edeceğiz .\92 kanıtlar ve oranlar arasında değişmektedir.'\92''\10'

Aralık sorunları

Şimdi gerçek kodu yazmaya başlamak için tek bir satıra çok sayıda karakter koymamız gerekiyor. Bunu yapmak için kapağı yazdım:

;
f=
 g 
ij=f
a =hi
hi = g
hij= ij

Kapak geçerli Haskell olmak dışında hiçbir şey yapmaz. Başlangıçta kodda bize yardımcı olacak tanımlar yapmayı umuyordum, ama olmadı. Ayrıca, beyaz boşluk ve noktalı virgül gibi kapak yapmak için daha kolay yollar vardır, ancak baytları bu şekilde kaydetmezler, bu yüzden değiştirmek için uğraşmadım.

Hardcoder

Artık bir satırda yeterli alana sahip olduğum için kodlama değerlerine başlıyorum. Bu çoğunlukla oldukça sıkıcı, ancak birkaç ilgi çekici şey var. Bir kere çizgiler daha da uzamaya başladığında ;, bir satıra birden fazla bildirim koymak için kullanabiliriz , bu da bize bir ton bayt kazandırır.

İkincisi, her zaman bir çizgiyle her zaman başlayamadığımızdan g, çizgileri biraz girintilemek zorundayız. Şimdi Haskell gerçekten girintiyi önemsiyor, bu yüzden şikayet edecek. Ancak girintili çizgiden önceki son satır noktalı virgülle bitiyorsa buna izin verir. Neden? Ben en ince değilim, ama işe yarıyor. Bu yüzden noktalı virgülleri satırların sonuna koymayı unutmamalıyız.

Fonksiyon Yapı Taşları

Hardcoder tamamlandıktan sonra programın sonuna kadar düzgün bir şekilde seyreder. Birkaç basit fonksiyon geliştirmemiz gerekiyor. Önce dropdenilen bir sürümünü inşa ediyorum i. ifarklıdır dropbiz dize sadece döner sonunun damla denerseniz ki "y". iyeni bir satır bırakmaya çalışırsa geri dönülmesinden farklıdır "y", bunlar yararlı olacaktır çünkü daha sonra programın bir üçgen olduğunu doğruladığımızda False, son satır tamamlanmadığında veya bir çizgi erken biter.

kknssTruenkn+1False .

Sonra için bir takma ad yapmak k, m. msadece kile1 ilk argüman ve yeni satır ikinci argüman başına ilave.

Sonra var o. obir sayı ve bir dize alır. Dize baytlarının (satırsonlarını yoksayarak) ggirdi numarasıyla başlayarak parite içinde (bizim kullanarak) değişip değişmeyeceğini belirler .

Son olarak , her ikisiyle de sçalışan hangisi var ve eğer başarılı olursa yeniliyor . Her ikisi de başarısız olursa, sadece geri döner . Bu istediğimiz işlev. Girdinin üçgen ve dönüşümlü olduğunu belirler.o10mFalse


1
Üçgen bir dize, boş bir satırla değil, 1 karakterli bir satırla başlar.
Jakob

@ Jakob Bence bu aptalca ama yeterince kolay bir düzeltmeydi.
Ad Hoc Garf Hunter

3

05AB1E , 34 26 bayt

¶
¡D
©€g
´ā´Q
´sJÇÈ
¥Ä{´нP

Çevrimiçi deneyin!

Girişi çok satırlı bir dize olarak alır ( "" " arasında girdi ) Daha sonra gelecek açıklamalar.


1
Kuralları yanlış anlamadığım sürece, programın yeni satırdan başlayarak girdiyi doğrulayabilmesi gerekir.
Emigna

@Emigna Bence programınız baştaki bir yeni satırı sadece baştaki bir yeni satırla başlıyorsa doğrulayabilmelidir.
Ton Hospel

Bunun doğru olup olmadığı hakkında hiçbir fikrim yok (spesifikasyonları okurken çok kötüyüm): Çevrimiçi deneyin!
Sihirli Ahtapot Urn

@MagicOctopusUrn Cevabınız bana iyi görünüyor, ancak girdiyi merak ediyorum: dizi olarak almamıza izin var mı? Bağlantınızda, ilk girdiniz boş satır, satırsonu karakteri değil.
Mart'ta Kaldo

1
Hey, umarım bu kodunuzla çok fazla uğraşmaz, ancak önde gelen yeni satır doğrulamasını bırakabilirsiniz.
Dom Hastings

1

Java 10, 209 bayt

Bir yinelenebilir veya dizi alan bir boş lambda byte . Normal döndürerek true değerini, çalışma zamanı istisnasını atarak false değerini gösterir. Program son satırın uygun şekilde sonlandırılmasını bekler, yani yeni satır karakteri ile biter. Programın son satırı da benzer şekilde sonlandırılır.

Her şey UTF-8 altında, "karakter" in Unicode kod noktalarını ifade ettiği yorumuyla yapılır.

Sekmeler bu görünümde boşluklarla değiştirilir.

d
->
{  
long
f= 1,
 h=0 ,
c = - 1
,e ;for 
( byte a:
 d) {var b
=(e = a^10)
<1&e>- 1 ;f=
b?( h ^ f)> 0
?0/0 : f+ 1: f
;h=b?0 :a>-65 ?
h+ 1: h; c =b? c
:c>=0 & ( (c^a )&
1 )<1 ?0/0 :a ; } 
/*1010101010101*/ }

Çevrimiçi Deneyin

Onaltılık dökümü

İle geri dön xxd -p -rUnix'te alın.

640a2d3e0a7b20090a6c6f6e670a663d20312c0a09683d30092c0a63203d
202d20310a2c65203b666f72090a28096279746520613a0a096429207b76
617209620a3d2865203d20615e3130290a3c3126653e2d2031203b663d0a
623f280968095e0966293e09300a3f302f30093a09662b20313a09660a3b
683d623f30093a613e2d3635203f0a682b20313a09683b2063203d623f20
630a3a633e3d30092609280928635e612029260a3120293c31203f302f30
093a61203b207d200a2f2a313031303130313031303130312a2f207d0a

Ungolfed

d -> {
    long f = 1, h = 0, c = ~h, e;
    for (byte a : d) {
        var b = (e = a^10) < 1 & e > -1;
        f = b ?
            (h^f) > 0 ? 0/0 : f + 1
            : f
        ;
        h = b ? 0 :
            a > -65 ? h + 1 : h
        ;
        c = b ? c :
            c >= 0 & ((c^a) & 1) < 1 ? 0/0 : a
        ;
    }
}

fgeçerli satırda beklenen karakter sayısı, geçerli satırda hşimdiye kadar görülen karakter sayısı, görülen cson bayt ve yeni satır bolup olmadığıdır a.

Koşul , bir karakterdeki ilk bayt a > -65olup olmadığını test aeder. Bu, tek bit (ASCII) karakterlerin 8 bit ikinin tamamlayıcısında negatif 11xxxxxxolmaması , daha uzun karakterlerin ilk baytının ikili biçimde (ikinin tamamlayıcısında en az -64) olması ve bu karakterlerin başında gelmeyen baytların form 10xxxxxx, ikisinin tamamlayıcısında en fazla -65. ( Kaynak )

Bir karakter, üçgen veya dama tahtası desenini ihlal ettiğinde (yani, yeni satır erken veya geç görünür veya yanlış eşlikin baytı görünür), karşılık gelen üçlünün sol dalı ( fveya atanırken c) etkinleştirilir ve yöntem aritmetik bir istisna atar.


0

Python 3 (3.4?), 350 bayt

Python 3 gibi boşluk hakkında özel bir dil için zor bir meydan okuma. Gönderme 0veya 1bazı girdiler için standart çıktı ve çöküyor. Program son satırın uygun şekilde sonlandırılmasını bekler, yani yeni satır karakteri ile biter. Programın son satırı da benzer şekilde sonlandırılır. UTF-8 bayt paritesini kontrol etmek için kullanılır.

Sekmeler bu görünümde boşluklarla değiştirilir.

0
i\
= 1
t=(#
 '0'*
 0) ;(
g,) =(#
 open (1
, "w"),) 
k = eval (
'p' + 'rin'
 + 't' ) #01
for  a in (#0
open ( 0) ):#0
#01010101010101
 a = a [:- 1 ] #
 if ( len (a )<i\
or len (a )>i ):[\
k('0' ),1 /0] #0101
 i, t= -~i, t+ a #01
(k( 2-len ({(c^i )&1\
 for  i,c in  eval (#0
 "enu"+"m"+"erate")(#01
 eval ( " byte"+"s")( t#
,' u8' ) ) } ) ) ) #01010

Python 3.4.2 ile çalışır; TIO üzerinde herhangi bir Python 3 üzerinde çalışmaz. Bana TIO'nun çevirmenlerinde bir hata gibi görünüyor.

Onaltılık Döküm

xxd -p -rUnix'te geri alın.

300a695c0a3d20310a743d28230a202730272a0a093029203b280a672c29
203d28230a206f70656e0928310a2c09227722292c29200a6b203d206576
616c09280a277027202b202772696e270a202b202774272029202330310a
666f7209206120696e092823300a6f70656e092809302920293a23300a23
30313031303130313031303130310a2061203d2061205b3a2d2031205d20
230a2069660928096c656e09286120293c695c0a6f72096c656e09286120
293e6920293a5b5c0a6b2827302720292c31202f305d2023303130310a20
692c09743d202d7e692c09742b2061202330310a286b2809322d6c656e09
287b28635e69202926315c0a09666f720920692c6320696e09206576616c
092823300a0922656e75222b226d222b2265726174652229282330310a20
6576616c092809220962797465222b22732229280974230a2c2720753827
20292029207d202920292029202330313031300a
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.