ICS Deniz Bayrağı alfabesi


14

Uluslararası Sinyal Kodları bayrak alfabesi , gemiler tarafından iletişim için, özellikle statik sinyaller için kullanılır.

Zorluğunuz STDIN'den veya bağımsız değişken olarak bir dize alacak bir program veya işlev yazmak ve karşılık gelen metni ICS bayrağı alfabesinde görüntülemek. Diliniz ekranda görüntülenmiyorsa, bir dosyaya kaydetmek kabul edilebilir.

Programınız veya işleviniz, büyük ve küçük harf AZ ile Boşluk ve Yeni Satır harflerini destekleyecektir . Diğer karakterlerle davranış tanımsız.

Gösterge, yatay olarak en az 8, dikey olarak 6 bayrak gösterebilecek kadar büyük olmalıdır . Yeni satıra gelmeden önce sağ kenara ulaşılırsa veya mesaj ekrana dikey olarak sığmayacak kadar uzunsa, davranış tanımsızdır.

Bayrak alfabesi aşağıda gösterildiği gibidir (Roma harfleri sadece referans içindir, çıktıda gerekli değildir.)

resim açıklamasını buraya girin

boyutlar

Bu bayrakların boyutları için evrensel olarak kabul edilmiş bir standart yoktur, bu nedenle bu meydan okuma için aşağıdakiler geçerli olacaktır:

Bayraklar, yatay ve dikey olarak aralarında 30 piksel boşluk olacak şekilde 60x60 piksel olmalıdır.

A ve B'de kesilmiş kırlangıç ​​kuyruğu 15 piksel derinliğinde olacaktır.

Diğer tüm çizgiler yatay, dikey veya 45 derecede olmalıdır.

Özellikler, bayrağın 3,4,5 veya 6 karelik bir hayali NxN ızgarasına bölünmesi ile konumlandırılacaktır. Daha fazla açıklama için yukarıdaki resme bakın:

A, E, H, K, L ve U 2x2 ızgaraya dayanır: her renk bölgesinin genişliği 30 piksel olacaktır. Ayrıca F'deki elmasın noktaları bayrağın her iki tarafı boyunca yarıya kadar olmalıdır.

J ve T 3x3 ızgaraya dayanır: her bant 20 piksel olmalıdır.

P, N ve S 4x4 ızgaraya dayanmaktadır. Ayrıca Y'nin diyagonal çizgileri bayrağın kenarlarını 4'e böler.

C, D, R ve X, 5x5'lik bir ızgaraya dayanacaktır. Haç bantları ve kolları 12 piksel genişliğinde olacaktır.

G, W, M, V, 6x6 bir ızgaraya dayanmaktadır. G bantları ve W kenarlıkları 10 piksel genişliğinde olacaktır. M ve V üzerindeki haç kolları, bayrağın her bir kenarının ilk ve son 10 pikselini kaplayacak ve uzun kenar boyunca 40 piksel boyutunda üçgen bölgeler bırakacaktır.

I dairesi bayrağın ortasında olacak ve çapı 30 piksel olacaktır.

Yukarıdaki metinden +/- 1 piksel hataya izin verilir. Diliniz yalnızca ölçeklenebilir grafikleri destekliyorsa, "pikselleri" "birimler" olarak yorumlayabilirsiniz.

Renkler

Renkler, dilinize veya belgelerine göre kırmızı, beyaz, mavi, sarı ve siyah olmalıdır. Diliniz renkleri tanımlamazsa, aşağıdakileri kullanabilirsiniz: Kırmızı FF0000, Beyaz FFFFFF, Mavi 0000FF, Sarı FFFF00, Siyah 0000000.

Arka plan gri olmalıdır (r, g ve b kanalları% 25 ila% 75 yoğunluk arasında eşittir.)

Puanlama / Loopholes

Bu kodgolf. Bayt cinsinden en kısa kod kazanır.

Standart boşluklara izin verilmez.

Bayrakları görüntülemek için yerleşik veya kütüphane işlevi kullanılamaz. Çıktı metinsiz olacaktır (ve özellikle bayrak şeklini oluşturmak için unicode karakterler kullanılmayacaktır.)

Misal

JFK got
my VHS
PC
and XLR
web quiz

aşağıdakileri üretmelidir

resim açıklamasını buraya girin


" Ekran yatay olarak en az 8 bayrak ve dikey olarak 6 bayrak görüntüleyecek kadar büyük olmalıdır " ile özellikle ne anlama geldiğinden emin değilim . Sadece cevapların bu boyutlara kadar olan mesajları ele alması ve daha büyük olanları ele alması gerekmiyor mu yoksa tüm satırların en az 8 karaktere ve tüm mesajların en az 6 satıra doldurulmasını mı istiyorsunuz?
Peter Taylor

1
@PeterTaylor Programınız veya diliniz, görüntüyü çıktıya göre yeniden boyutlandıracak kadar akıllıysa, çıktı daha küçükse ekranı 8x6 değerine kaydırmaya gerek yoktur. Çıktı gri bir arka plana sahip olmalı ve dikdörtgen olmalıdır (tüm çizgiler en az en uzun çizginin uzunluğuna kadar dolgulu olmalıdır.)
Level River St

Yanıtlar:


15

CJam, 464 bayt

CJam'in görüntü işleme işlevleri olmadığını düşündünüz mü? Doğru düşündün! Ama bunun beni durdurmasına izin vermeyecektim.

"P3
690 690 4
"3a3*a690_@*a*qeuN/{0:U;{_'C<.5*:N;i[{XY+Z<[E8][9C]?XY<=}WWWW{XH<9F?}C{YC/[9FCF]=}{YC/3&9E?}{YH<9F?}{X29.5:R-zYR-z+H>FC?}{XA/1&9E?}{XH<FC?}{XR-_*YR-_*+F_*>E8?}{YK/(9F?}{XH<E9?}{XH<YH<^8E?}{XY+Z-A/XY-A/e&9F?}{XF/YF/^1&F9?}{XY<EC?}{XH-F/YH-F/|9F?}E{XHm6/YHm6/e&CE?}{XH-F/YH-F/|F9?}{XK/[CF9]=}{XH<YH<^FC?}{XY+Z-A/XY-A/e&FC?}{XR-zYR-ze>iA/[CF9]=}{XHm6/YHm6/e&F9?}{XY+F/1&CE?}]=:P~!!{60:Z{Z30:HYH-z-N*-{YV+_2$=XU+P2b1>4f*tt}fX}fY}*U90+:U;}/V90+:V;}/`"[]"-

Bu program, görüntüyü en iyi şekilde CJam'in çıktısını verir: PPM dosyası olarak kaydedildiğinde görüntüyü temsil eden metin olarak . Bu arada çevrimiçi yorumlayıcıyla çalıştırmayı bile denemeyin; yığını havaya uçuracaksın. Java yorumlayıcısıyla çalıştırın ve çıktıyı benzer bir komutla bir dosyaya ekleyin java -jar cjam-0.6.4.jar flags.cjam > flags.ppm. Girişinizi verdikten sonra, Unix'te ctrl + D veya Windows'ta ctrl + Z ile bir EOF (yeni satırdan hemen sonra olması gerekebilir) gönderin.

Örneklem

Gerçekten istenirse, orijinal ~ 3MB görüntü kaynağını bir yere yapıştırmayı deneyebilirim. Ancak işte GIMP'de açılan ve bir PNG'ye dönüştürülen sonuç:

ABCDEFG
hijklmn
OPQRSTU
vwxyz z

flags_alphabet.png

açıklama

Kaynakta kolayca tanımlanabilen görüntü başlığı, sihirli sayı, genişlik, yükseklik ve maksimum kanal değerinden oluşur. Böylece çıktı, her R, G ve B değeri 0 ila 4 arasında değişen 690 * 690 görüntüdür (aralarında 30 piksel aralıklı 8 * 8 60 piksel bayrak için yeterlidir).

Görüntü verileri, 3'lerle dolu 690 * 690 * 3 dizisi olarak başlatılır ve tüm görüntü açık gri olur. Daha sonra giriş okunur, büyük harfe dönüştürülür ve satırlara bölünür. Çizgiler bir döngüde işlenir, bayrak Y koordinatını her yinelemede 90 arttırır ve her satırda her karakter bir döngüde işlenir, X işaretini her yinelemede 90 arttırır. Şimdi sihir başlıyor.

Her karakter, çağrıldığında bayrağın üzerindeki konumdaki (X, Y) pikselin rengini döndüren bir bayrağın piksel işleviyle eşlenir. Zor işlerin çoğu burada gerçekleşti: kısaca 26 görüntüyü matematiksel fonksiyonlar olarak tanımlamak. Bu işlevlerin her biri 8-15 arasında bir renk değeri döndürür. Bu aralık, taban 2'ye dönüştürüldüğünde ortaya çıkan bit dizisinin [1, R, G, B] olarak yorumlanabilmesinden yararlanır. İlk eleman çıkarılabilir ve kalanlar, olası tüm bayrak renklerini (yeşil, camgöbeği ve macenta) kapsayan istenen formatta kolayca bir piksel değeri vermek için 4 ile çarpılır. Ayrıca 10-15 olarak başlatılan tek karakterli değişkenler olduğu ve değişkenlerin bunları sözdizimsel olarak ayırmak için bir alana ihtiyaç duymadığı için iyi çalışıyor,

İşlev alındıktan sonra, her adımda işlevi çağırmak ve sonucu görüntü veri dizisine geri yazmak, 0-60 arasındaki X ve Y'nin her ikisini de yinelemek meselesidir. Zeki bir gözlemci, her bayrak işlevi tarafından döndürülen renk değerlerinin griye izin vermediğini fark edebilir. Yani boşlukları atlamak için ekstra bir mantık var. Ama hala 'A' ve 'B' üzerinde kırlangıç ​​kuyruğu kesimleri var. Yani orada da fazladan bir mantık var. Karakter değeri 'C'den küçükse, X döngüsünün üst sınırı Y'ye göre doğru değişecek ve kesme alanları asla çizilmeyecek şekilde bir değer ayarlanır.

Genel olarak, bunun nasıl ortaya çıktığı konusunda oldukça mutluyum. Çok iş aldı, ama eğlenceliydi. Bazı bayraklar referans görüntüsüyle mükemmel bir şekilde eşleşmiyor, ancak sanırım tüm şekiller hedefin 1 pikseli içinde (varsa bundan daha fazla kapalıysa, bana bildirin ve bunları düzelteceğim). Ve 26 bayrak işlevi arasında oldukça fazla yedeklilik olduğu için kesinlikle optimizasyon potansiyeli var.


İlk denemeyi, 559 bayt

Bunu hiç bitirmememe rağmen, ben de yayınlayacağım, çünkü oldukça ilginç. Her bayrağı (X, Y) → renk işleviyle modellemek yerine, bayraklar basit şekillerin bir bileşimi olarak çizilir. Ancak her farklı şekil için önemli miktarda oluşturma kodu yazmam gerektiğinden endişeliydim. Çok fazla düşünmeden sonra, hepsini akıllıca üst üste bindirerek ve geri çekerek, sadece bir sahte şekil ile gerçekleştirebileceğimi fark ettim: "mesafe" tanımının değişken olduğu belirli bir noktadaki belirli bir mesafe içindeki tüm noktalar. Satranç tahtası mesafesi bir kare, Manhattan mesafesi bir elmas ve Öklid mesafesi bir daire verir. Bu, her şeklin aynı beş parametreye sahip olduğu anlamına gelir (renk, mesafe modu, x, y,

"P3
690 690 4
"3a3*a690_@*a*qeuN/{0:U;{_'C<.5*:N;i[[8EX30:Q0Q9X60:ZQQCXQZQ]LLLL[F9TTQQ]Ca[9FTQ42QCTQ54QFTQ66Q9TQ78Q][E9TIQI9T42QI][9FTQZQ][FCXQQQ][E9T40QQET50QQ9TZQQET70QQ9T80QQ][FCTZQQ][E8YQQF][9FTQAQ9TQ9~Q][E9TZQQ][8ETTTQETZZQ][F9XQTK9XZQK9XQZK9XTQK][F4{4{JW^1&6*9+TJ)F*W)F*F}fJ}fW][CEX0ZZ][9FTQQF]Ea[E[TZ]_m*{CT@~24}/][F9TQQF][9FTAQQCT9~QQ][FCTTTQCTZZQ]C9$1>9a/Fa*+[9FTQQKCTQQA]9 6$1>Ca/Fa*+[C7{7\-_1&2*C+X@TT@F*}/]]=_!!{([TQQQ]+\+}*5/{~:R;.5-:H;.5-:G;:M;2b1>4f*:O;Z{ZQWQ-z-N*-{JG-{zM_!+#}:P~WH-PM{+}{e>}?RP<{WV+_2$=JU+Ott}*}fJ}fW}/U90+:U;}/V90+:V;}/`"[]"-

1
Mükemmel, aradığım yaratıcı cevap bu. Daha sonra çalıştırmayı deneyeceğim.
Level River St

1
Bu muhtemelen şimdiye kadar gördüğüm en uzun CJam kodu. Güzel iş olsa da +1.
Alex

CJam yine günü kurtarıyor gibi görünüyor.
ASCIIThenANSI

9
Ne yazık ki, CJam kodunu 200 bayttan daha uzun süre göndermek federal bir suçtur. Seni gözaltına almam gerekecek.
Deusovi

2

PHP, 811 bayt

function f($s){echo"<body bgcolor=#ccc>";$z=split("\n",gzinflate(base64_decode("vVfNasMwDL7vKQK7xlT+iaHQ9LDTLnuIQus6ENhgxS19+kmO0yRrkhbqGIxtyV8sWbIkZ/Prjtm52p9suYbMHqqjPdHMVYfzx/elhBzyNbXtZoXQ7dvm+Q9+dieb7csvZFkJToNlEq6Zqeq6fAcw2arDqCKXUPMCEYQicIc1xmNfUkBDzXgQkpMQ3W0PEGF7fz49dT7IuSCQ1APJ5h9IKAIhdGn1jIHH6oUzvCpZzhtGjoDiePzuzAPJEkG1JPk1uw29G5rC7pxAvAFxuHqd+nQxpCP65S4gR6wzAkphE4rPHfbYaAueky59BrmrZ4wU0Ss8SES/pCNugMduiBSYs25oJTeBSYNMbHO6+bUg22PPhA8E5LCWhT3SFBjEwxaWiOMYD1+FtZSZxateEAZ7pvsEL7w1aQxD3HxLcmayfNA9ZeXzcdteJLm0H5ZITzAwolDkXeGwVAvlSzUOSDDkMRqRxDkuLquVecbKMRKFaESLSYOMg4b6qVHQMnkMns5jyZLBAnksRehirQWrwClEqakDNrqKpjqKpZ8K5rVYTFE56ZmCyT68KinJX+n/puFpyHXg4RRLwg1oW6YipqfimfJTt6/c6XIv6Tnc/HxNXIj+a9nORdwN5Qa3qzvGHw==")));while($c=ord(ucfirst($s))){$s=substr($s,1);echo$c<32?'<br>':($c^32?$z[$c-64]:$z[0]);}}

Sıkıştırılmış damla, 26 bayrağın her biri için SVG kodu içerir. Daha sonra basit bir döngü, girişin her karakterine karşılık gelen SVG görüntüsünü çıkarır ve çıkarır.

"Bu \nbir testtir" için örnek çıktı :

<body bgcolor=#ccc><svg width=90 height=90 viewBox=0,0,90,90><path d=M0,0h20v60h-20z fill=#f00 /><path d=M20,0h20v60h-20z fill=#fff /><path d=M40,0h20v60h-20z fill=#00f /></svg><svg width=90 height=90 viewBox=0,0,90,90><path d=M0,0h30v60h-30z fill=#fff /><path d=M30,0h30v60h-30z fill=#f00 /></svg><svg width=90 height=90 viewBox=0,0,90,90><path d=M0,0h60v60h-60z fill=#ff0 /><path d=M15,30a15,15,0,0,1,30,0a15,15,0,0,1-30,0z fill=#000 /></svg><svg width=90 height=90 viewBox=0,0,90,90><path d=M0,0h60v60h-60z fill=#fff /><path d=M15,15h30v30h-30z fill=#00f /></svg><svg width=90 height=90 viewBox=0,0,90,90></svg><svg width=90 height=90 viewBox=0,0,90,90><path d=M0,0h60v60h-60z fill=#ff0 /><path d=M15,30a15,15,0,0,1,30,0a15,15,0,0,1-30,0z fill=#000 /></svg><svg width=90 height=90 viewBox=0,0,90,90><path d=M0,0h60v60h-60z fill=#fff /><path d=M15,15h30v30h-30z fill=#00f /></svg><br><svg width=90 height=90 viewBox=0,0,90,90><path d=M0,0h30v60h-30z fill=#00f /><path d=M45,30l15-30h-30v60h30z fill=#fff /></svg><svg width=90 height=90 viewBox=0,0,90,90></svg><svg width=90 height=90 viewBox=0,0,90,90><path d=M0,0h20v60h-20z fill=#f00 /><path d=M20,0h20v60h-20z fill=#fff /><path d=M40,0h20v60h-20z fill=#00f /></svg><svg width=90 height=90 viewBox=0,0,90,90><path d=M0,0h60v30h-60z fill=#00f /><path d=M0,30h60v30h-60z fill=#fff /></svg><svg width=90 height=90 viewBox=0,0,90,90><path d=M0,0h60v60h-60z fill=#fff /><path d=M15,15h30v30h-30z fill=#00f /></svg><svg width=90 height=90 viewBox=0,0,90,90><path d=M0,0h20v60h-20z fill=#f00 /><path d=M20,0h20v60h-20z fill=#fff /><path d=M40,0h20v60h-20z fill=#00f /></svg>

( Sayfayı sizin için görüntülemese de ideone'de deneyebilirsiniz .)

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.