ASCII sanat resmini döndürme


17

Tüm ASCII karakterlerinden bazılarının aynı temel karakterin rotasyonu olan gruplar oluşturduğunu söylemek kolaydır. Örneğin V > ^ <,. Bu, 90 derecenin katları ile döndürülebilen ve hala ASCII sanatı olarak kalabilen ASCII sanatının oluşturulmasına olanak tanır.

Meydan okuma

Amacınız ASCII sanatını ve STDIN'den döndürmek için derece sayısını kabul eden ve döndürülmüş ASCII sanatını STDOUT'a basan bir programı golf oynamaktır.

İlk girdi satırında, programınıza bir N numarası verilir. Bu sayı ASCII sanatının genişliğini ve yüksekliğini temsil eder.

Daha sonra, her biri tam olarak N karakterden oluşan N satır daha alırsınız (yeni satır bu sayıda sayılmaz). Sanatın boyutu her zaman bir kare olacaktır, ancak bir kare yapmak için boşluk şeklinde dolguya sahip olabilir.

Son satırda bir sayı daha alırsınız: 90, 180 veya 270. Bu, resmin saat yönünde kaç derece döndürülmesi gerektiğini gösterir.

Not: Girilen görüntü yalnızca doğru miktarda döndürülebilen karakterler içerecektir. Giriş bu gereksinimlerle tam olarak eşleşmezse, özel bir davranış gerekmez.

Çıktı olarak, programınız her satırdan sonra yeni satırlar olmak üzere tam olarak N karakter N satır yazdırmalıdır. Görüntü, orijinaldeki her karakterin yerine döndürülmüş bir sürüm uygulanacak ve görüntüdeki doğru yere taşınacak şekilde döndürülmelidir.

Örnekler (çok güzel olmayan ASCII sanatı)

Giriş

5
<- ||
|  |V
+->+ 
   |O
<--+ 
90

Çıktı

^ +-^
| | |
| V  
+-+--
 O <-

(Karakterler kareler olmadığı için 90 ve 270 döndürmeler çok iyi görünmeyecek)

Giriş

6
+ /\ +
| \ \|
(  \/|
 \   )
I \ / 
:) V $
180

Çıktı

$ ^ (:
 / \ I
(   \ 
|/\  )
|\ \ |
+ \/ +

Gerekli Desteklenen Karakterler

Tüm dönüşler için (90, 180 ve 270), program dönebilmelidir:

  • Spaces, +, @, Xve Ohangi asla değişmez
  • V > < ^
  • | -ve \ /(180 döndürülerek aynı kalırlar)

180 derece döndürme için bu ek karakterler desteklenmelidir

  • I N Z % : 0 = S ~ $ # hangisi aynı kalır
  • P d, ( ), [ ], { }, M W, Ve9 6

İlk örneğiniz, vdesteklenen bir karakter olmayan küçük harf içeriyor . Büyük harf olması gerektiğini düşünüyorum V. Ayrıca, içindeki son satır 5 karakter uzunluğunda değil.
Ilmari Karonen

@IlmariKaronen İyi yakaladım. Şimdi düzeltildi.
PhiNotPi

P d, ( ), [ ], { }, M W, and 9 690º veya 270º döndürülebilir mi?
ajax333221

Hayır, sanat yalnızca doğru miktarı döndürebilecek şekilde belirlenmiş karakterler içerecektir. Son iki madde işaretli karakter yalnızca 180º döndürülebilir. Programınızdan bunları başka bir miktarda döndürmesi istenmeyecektir.
PhiNotPi

Yanıtlar:


4

GolfScript, 79 75 73 67 karakter

n%(;)~90/{-1%zip{{.'V<^>P(d)[{]}M9W6/\/\|-|'4/\+{.}%n+.@?)=}%}%}*n*

Görünüşe göre benim ve Peter Taylor'ın çözümleri belli miktarda yakınsama yaşıyor. Her neyse, şu an için hala birkaç karakterim var gibi görünüyor. :-) Peter'a teşekkürler (ve +1) ve utanmadan çaldığım fikirler için kopyala .

Bu kod, gereksiz bilgi olduğu için ilk satırda verilen boyutu tamamen yok sayar. Kare olmayan boyutlara sahip girişleri bile işlemelidir, ancak büyük ölçüde aynı uzunlukta doldurulmuş tüm giriş hatlarına bağlıdır. Döndürmek için çalışıyorum karakterler P, d, (, ), [, ], {, }, M, W, 9, ya da 690 ya da 270 derece beklenmedik çıkış üretebilir; açıkça yeniden eşleştirilmeyen diğer tüm karakterler değişmeden kalır.

Ps. İşte orijinal 79 karakterlik çözümüm:

n%(;)~90/:z{-1%zip}*n*z'V<^>/|-\V>^<'{:c;{{.c?~.c=@if}%}*}:s~2z='P([{M96W}])d's

Yakınsama? : PI, (birçok) karakteri tekrarlamadan arama yapma hilenizi beğendi, ancak if'den kaçınmak için hilemle uyumlu görünmüyor.
Peter Taylor

5

C, 336 karakter

Eminim iyileştirme için yer vardır.

char*a="<^>V|-|-/\\/\\ppdd(())[[]]{{}}MMWW9966",*p,*q;
n,x,y,r;
z(c){
    return(q=strchr(a,c))?a[(q-a&-4)+(q-a+r&3)]:c;
}
#define A(r)(r&3^3?1-r%4:0)*
f(r){
    return A(r)x+A(~-r)y+(r&2)/2*~-n;
}
main(){
    scanf("%d\n",&n);
    p=q=malloc(n*n+1);
    for(y=n;y--;q+=n)gets(q);
    scanf("%d",&r);
    for(r/=90;++y<n;puts(""))for(x=0;x<n;x++)putchar(z(p[f(r)+n*f(r+1)],r));
}

4

javascript (181 karakter)

a=prompt(f="V<^>V|-|/\\/P(d)P([{]}[}M9W6M9").split(n="\n");c=a.pop()/90;for(
b=a[0];c--;a=d.split(n))for(e=d=n;e<b*b;++e%b||(d+=n))d+=f[f.indexOf(g=a[b-e
%b][e/b|0])+1||a]||g;alert(d)

Her satırın belirtilen uzunluğa kadar doldurulmasını gerektirir.


Bana tam olarak neyi sormam gerektiğini gösteren bir örnek verebilir misiniz? Satırları \nnormal kopyala yapıştırmayı ve boşlukları ilk / son satırlara dengelemeyi denedim ve çalışmasını sağlayamadım
ajax333221

@ ajax333221 Bir uyarı kutusuna birden fazla satır yapıştırmak yalnızca Chrome'da çalışır, ilk kez fark ettim. Ayrıca son satırsonu kopyalamadığınızdan emin olun.
kopyalayın

4

Golf Yazıları ( 80 79 78 77 76 karakter)

n%(;)~90/{zip{-1%{'V<^>V|-|/\/''Pd()[]{}MW96'{.4*}%4/128,+{.}%+.@?)=}%}%}*n*

Not: 90 derecelik dönüşü tanımlanmayan belirli karakterler için kullanılan yer tutucu karakterler (ASCII dışında) geçersiz giriş tarafından izin verilen "tanımlanmamış davranış" ın girilmesi, biraz merak uyandıran bir çıktı oluşturabilir. Örneğin, (ISO-8859-1 ve Unicode'da kırılmayan bir alan olan kod noktası 160 ile eşlenir.

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.