Basit Baskı Okları


23

Golf antrenmanı için kız arkadaşımın Intro to Python sınıfında görevler yapıyorum. Bu görev için karakter sayımında çok yaklaşan çok sayıda strateji olduğunu buldum ve buradaki insanların daha iyi yollar bulabileceğinden eminim. Her ne kadar Python'da bunu yapmanın yolları ile ilgilensem de, bu programın alabileceği en çok golf oynadığını bilmek isterim, bu nedenle bu kod golf ve en kısa cevap kazanıyor.

Kurallar:

Atama aşağıda özetlenmiştir. Kullanıcılardan iki kez giriş yapmaları istenir, ancak istemlerin hiçbir şey söylemesi gerekmez ve farklı bir sırayla olabilir.

Standart boşluklar uygulanır.


Ödev 3: Oklar

Kullanıcıdan birkaç sütun isteyecek bir program yazın ve deseni aşağıda görüldüğü gibi yazdırır. Kullanıcının pozitif sayılar sağlayacağını varsayabilirsiniz. Programınız hem sol hem de sağ ok tuşlarını kullanmalıdır. İşte birkaç örnek çalışma:

How many columns? 3
Direction? (l)eft or (r)ight: r
*
 *
  *
 *
*
How many columns? 5
Direction? (l)eft or (r)ight: l
    *
   *
  *
 *
*
 *
  *
   *
    *

23
Bu ev kadını gibi görünüyor ... ah, boşver.
TessellatingHeckler

Her satırdaki arka boşluklara izin veriliyor mu?
lirtosiast

@ThomasKwa evet.
aks.

Bu sorudaki gibi imleci hareket ettirmek için kontrol karakterlerini kullanabilir miyiz ?
lirtosiast

@ThomasKwa Tabii ki ... dürüst olmak gerekirse, bunun ne anlama geldiğinden emin değilim ve eylemde görmekle ilgileniyorum.
aks.

Yanıtlar:


8

Pyth, 23 bayt

Bu yorumun cevabına dayanarak geçerli olabilir veya olmayabilir . Ne olursa olsun, bunu temiz buldum ve eğer geçersizse, diğer Pyth cevapları da geçersiz. ;) Evet, geçerli , çünkü bariz bir şekilde bariz olanı kaçırdım. : /

EDIT: KAZANDI !!!! YESSS !!!! İlk defa! : D

j+_J_Wqz\r.e+*dkb*\*QtJ

Canlı demo.


1
m+*\ d\*Qbunun yerine numaralandırılmış şey. 2 bayt kaydeder.
Jakube

7

Pyth, 27

j<tQ_Wqz\l++Jm+*\ d\*Q_PJtJ

Çevrimiçi deneyin

Buradaki temel fikir, 5 için, şöyle görünen bir dize oluşturmaktır:

*
 *
  *
   *
    *
   *
  *
 *
*
 *
  *
   *
    *

Sonra da lgirdilerimizi alırsak ters çevir . Sonra input-1bu dizginin son satırları hariç hepsini alırız ve yazdırırız.


7

Python 2, 81 79 bayt

c=input()
r=1
l=0
exec"print' '*(%sabs(c-r))+'*';r+=1;"%("c+~"*input())*(2*c-1)

Hala golf oynayabilirsin ama göreceğiz :)


2
Girdilerin olması ile ilgili iyi bir fikir değişkenler lve r. Girişin evalkodla aynı ortamda bulunduğunu farketmemiştim.
xnor

4

Pyth, 30 28 27 bayt

VtyQ+*+*tQJqz\r_WJ.a-hNQd\*

Çevrimiçi deneyin.

Görünüşe göre şu anda bağlıyım tamamen farklı bir yaklaşımla FryAmTheEggman ile bağlıyım . (Bunun ustaca olduğunu düşünüyorum.)

Örnek

$ python pyth.py spa.p
r
3
*
 *
  *
 *
*

$ python pyth.py spa.p
l
5
    *
   *
  *
 *
*
 *
  *
   *
    *

açıklama

 tyQ                              (columns * 2) - 1
V                               loop N through range(the above)
        tQ                                columns - 1 (maximum number of spaces)
       *                                multiplied by
           qz\r                           1 if direction == "r" else 0
          J                               also save that 1 or 0 to J
      +                               plus
                  .a-hNQ                    abs(N - columns + 1)
               _WJ                      negate that if direction == "r"
     *                  d           that many spaces
    +                    \*       add the star and print

@ Pietu1998 Hala ne yaptığınızı basit bir açıklama ile ilgileniyorum. Görüyorum ki sadece 1 döngü var ve harita veya lambda yok ...
aks.

@aks. Bir açıklama ekledim.
PurkkaKoodari 6:15

4

PowerShell, 91 85 102 Bayt

$c=(Read-Host)-1;if(!$c){"*";exit}(@(0..$c+($c-1)..0),@($c..0+1..$c))[(Read-Host)-eq'l']|%{" "*$_+"*"}
  • Sütunları alır, içine yerleştirir $c. Birini *çıkartıyoruz , çünkü her sütunda bir de var ve biz sadece kaç tane boşluk gerektiğiyle ilgileniyoruz.
  • Girilen değer a ise 1, yazdır *ve çık - betiğin geri kalanı fark yaratmaz. +
  • Bir sonraki bölüm ilk önce yönlendirmeyi alır ve geçerli olup olmadığını test -eqeder l, ardından değerine göre dinamik olarak oluşturulan bir dizi dizisine endekslemeye dayalı bir dizi oluşturur $c. Sihirli. Temel olarak, bu, hat başına kaç alana ihtiyaç duyduğumuzdur.
  • Örneğin, 5 rbu koleksiyon için geçerli olurdu (0,1,2,3,4,3,2,1,0).
  • Diziyi alır ve onu bir Foreach-Object %döngüsüne alır, burada bir X sayısı boşluğu çıktıktan sonra*

Örnek kullanım:

PS C:\Tools\Scripts\golfing> .\simple-printing-arrows.ps1
6
r
*
 *
  *
   *
    *
     *
    *
   *
  *
 *
*

Düzen - $edoğrudan koleksiyona pipo yaparak değişken kaldırıldı
Edit2 - 1 sütunu doğru hesaplar, şimdi

+ 1 sütunlu oklar için yön girişi yapmak hala zorunluysa (öyle olmadığını iddia ediyorum), konumunu değiştirebilir Read-Hostve $ddeğişkeni yeniden tanıtarak birkaç bayt daha kaybedebiliriz , 106 için :

$c=(Read-Host)-1;$d=Read-Host;if(!$c){"*";exit}(@(0..$c+($c-1)..0),@($c..0+1..$c))[$d-eq'l']|%{" "*$_+"*"}

1 sütun koymayı deneyin ve sola dönün - 2 sütun sağ ok. 1 sütun ve sağa yerleştirmeyi deneyin - 'Geçerli değerler aralığı dışında belirtilen bir argüman' hatası alıyorsunuz. İki katına çıkma oranlarından kaçınarak 85'inizi yenmenin mümkün olacağını düşündüm. Ama yaklaşamıyorum bile. 1 sütunluk bir ok için hesap, şu anda 112 karakter. > _ <
TessellatingHeckler

1
@TessellatingHeckler Teşekkürler - düzeltildi.
AdmBorkBork

1
Bu seninkini 102'ye çıkardı ve benimki 102'ye düştü. Buna daha fazla bakmam için yalvarmıyorum, ama silebileceğim bir tane daha olmalı ...: D
TessellatingHeckler

4

TI-BASIC, 75 65 57 54 50 47 Bayt

Doğru bayt hesaplama ve 10 bayt golf için @ThomasKwa sayesinde .

TI-84 + Silver Edition’da test edildi .

İlk TI-BASIC teslimi, golf önerileri kabul edilir (henüz pek fazla numara bilmiyorum). Ad, gösterilen bellekte bir faktör oynarsa, bu, 1 yerine 3 karakterdi (hesap makinemdeki bayt sayısına baktım). Bu program, outputfonksiyonun kısıtlamaları ile sınırlıdır (bence uzunluğu 4 olan oklarla), fakat texteğer çok uzunsa, grafiksel olarak görüntülenen muhtemelen geçiş yapabilirim .

Prompt L,Str1
Str1="R
For(I,1,2L-1
Output(I,(1-2Ans)abs(I-L)+AnsL+1,"*
End

Bunun ekranı temizlememediğini veya duraklatmadığını unutmayın.

Gerçekten kullandığım denklemin daha çok golf oynayabileceğini hissediyorum. Ayrıca biten tırnak işaretini dışlamak çok yanlış geliyor.


@ThomasKwa Teşekkürler! Bunu şimdi yapacağım.
cole

2
İkincisi: Ansücretsizdir, çünkü giriş için kullanmazsınız ve Output(değiştirmezsiniz Ans. Kullan ve değişkenden kurtul A. Kullanarak atayabilirsiniz -2(Str1="R; şartlı gerek yok.
lirtosiast

1
@ThomasKwa ipuçları için teşekkürler, TI-BASIC'e girme yollarım var gibi görünüyor.
cole,

3
Üçüncüsü: Değeri çarpmaya gerek yok -2. Sadece Str1="Rikinci satır için yapın. Bu, dördüncü satır yapar ve bu da Output(I,(1-2Ans)abs(I-L)+AL+1,"*sizi 4 bayta daha ağlar. Ama bekleyin, bir var deyim için (1-2Ans)-Saat cos(πAns)bir bayt kaydeder, ayrıca ücretsiz olarak açık parantez olsun daha çünkü biri!
lirtosiast

1
Herhangi bir dilde golf konusunda uzman olmak sadece pratik gerektirir; Oraya gideceksin.
lirtosiast

2

Python 2, 89 bayt

c=input()-1
d=raw_input()>'l'
for j in range(2*c+1):print' '*(d*c-(2*d-1)*abs(c-j))+'*'

Pyth cevabımla neredeyse aynı şekilde çalışır, sadece anında doğru sayıdaki alanı hesaplar.


2

PowerShell, 104 102 97 bayt

# 97 version:
$o=@(($c=(read-host)-1))[(read-host)-eq'l'];($j=2*$c)..0|%{' '*[Math]::Abs($o++%($j+!$j)-$c)+'*'}

3
r
*
 *
  *
 *
*

# Previous 102 version:
$o=@(($c=(read-host)-1))[(read-host)-eq'l'];(2*$c)..0|%{
' '*[Math]::Abs($o++%(2*($c+(!$c+0)))-$c)+'*'}

NB. tekrar çalıştırmak istiyorsanız, yeni bir PowerShell açın veya rv odeğişken durumunu sıfırlayın.

Diğerlerinin ne kadar özlü olduğuna kıyasla, bu acı veriyor. [97'de, 122'de olduğundan daha az acıtır]. İki parça, ikisi de şaşırtıcı değil; Birkaç sütunu okur, ofset elde etmek için bir dizi-dizin-üçlü-işleç-yerine kullanır ve ofsetten başlayan bir dalga işlevini kullanır (ve bir ince ayar yapmazmod 0 ).

(Ve ah, bu yanlışlık fonksiyonunu anlayamadığım ve LISP değil, dürüst parens yazarak, bu dalga fonksiyonu için yaşlarımı harcadım).


2
Bu çok kanlı.
AdmBorkBork

2

Python 2, 98 89 bayt

f=[' '*n+'*'for n in range(input())]
if'l'==input():f=f[::-1]
print'\n'.join(f+f[-2::-1])

Biraz daha uzun.


kullanım

$ python2 test.py
3
"l"
  *
 *
*
 *
  *

Ayrıca görünüşe göre bozuk. NameError: name 'l' is not defined, NameError: name 'd' is not defined.
TessellatingHeckler

Kullanımını kontrol et. @TessellatingHeckler
Zach Gates,

Ahh, zekice. Ancak 1 sütunlu oklarınızın iki ok başı vardır. (Ben depolayarak değil daha da golf bunu yapabileceğini düşünüyorum ive dsadece kullanılarak, hiç range(P())ve if P()=='l'...)
TessellatingHeckler

Önerileriniz için teşekkürler! Ayrıca çift ok başlarını da tamir ettim. @TessellatingHeckler
Zach Gates,

f=[...][::2*('r'>input())-1]
Atm'i

2

Perl, 85 bayt

($-,$_)=<>;$,=$/;@}=map$"x$_.'*',0..--$-;@}=reverse@}if/l/;print@},map$}[$--$_],1..$-

Kullanımı:

perl 59874.pl <<< '6
r'

4
Senaryolarını daha sonra tanıyacağın bir şeyi
isimlendirmeyi seviyorum

@ mbomb007 haha! Biliyor musun, aslında senaryolarımı isimlendirmiyorum, ama kullanım talimatları için basit bir şeyi adlandırmanın en iyisi olduğunu düşündüm ... simplearrows2.pliyi görünmüyor! : P
Dom Hastings

2

PHP, 156 Bayt

<?for($c=1+fgets(STDIN);--$c;$s[-$c]=$t[]=sprintf("%{$c}s","*"));arsort($s);$a=fgetc(STDIN)==r?$s+$t:$t+$s;array_splice($a,count($a)/2,1)?><?=join("
",$a);

Bunun gibi iki dizi oluşturur:

$t = [
    0 => "  *"
    1 => " *"
    2 => "*"
]
$s = [
    -1 => "*"
    -2 => " *"
    -3 => "  *"
]

daha sonra dizi birliğini $s+$tveya $t+$sbunları birleştirmek ve array_spliceöğeyi ortada kaldırmak için kullanır . Sonunda kullanarak çıktı<?=join()


STDIN yerine CLI argümanları ile kodum 8 bayt daha kısa olacaktır;)
Fabian Schmengler

2

Python 2, 111 109 104 bayt

Oldukça basit bir çözüm. Eminim daha çok golf oynayabilir. Bilmeyenler ~x+niçin, aynı n-1-x.

n=input()
r=range(n)
r+=r[-2::-1]
for i in[r,[~x+n for x in r]]['r'>raw_input()]:print"*".rjust(i+1," ")

Çevrimiçi deneyin

Düzenleme : Bu son satırda golf oldu:

if'r'>d:r=[~x+n for x in r]
for i in r:print"*".rjust(i+1," ")

2

Matlab, 109 105 96 bayt

Bana 9 byte kaydettiğin için teşekkürler .

x=eye(input(''));if(input('','s')<114),x=fliplr(x);end
x=x*10+32;disp(char([x;x(end-1:-1:1,:)]))

Birlikte ASCII kodları ekleyerek iki satırı değiştirin eğer 9 bayt kaydedebilirsinizx=x*10+32;
beher

@beaker Çok zekice, teşekkürler!
Luis Mendo

1

Ruby, 118 bayt

2.times{l,d=gets.split;l=l.to_i;a=(d=="r"?(0..l-1):(l-1).downto(0)).to_a;(a+a[0..-2].reverse).each{|x| puts "#{' '*x}*"}}

2.times{ - iki kere, elbette ...

l,d=gets.split; - girişi al

l=l.to_i; - bir tamsayı için uzunluk değiştirme

a=(d=="r"?(0..l-1):(l-1).downto(0)).to_a; - 0 ile uzunluk arasında bir dizi oluştur

(a+a[0..-2].reverse).each{|x| puts "#{' '*x}*"} - yineleyin, okları yapmak için dizeleri çevirin

Tam olarak gelmiş geçmiş en iyi golf değil, ama, hey.


1

PowerShell, 98 94 Bayt

$c=(Read-Host)-1;$d=Read-Host;if($c){$c..0+1..$c|%{if($d-eq'r'){$_=$c-$_}' '*$_+'*'}}else{'*'}

Okuma-Ana Bilgisayarını foreach-nesne döngüsünün içine yönlendirmek için bir yol bulabilirsem, ancak bir kez isteyince birkaç bayt kaydedebilirim.

Düzenleme: 94 bayt. Sola doğru sınamak yerine sağa doğru sınayın (döngüyü basitleştirir).

Orijinal 98 bayt:

$c=(Read-Host)-1;$d=Read-Host;if($c){0..$c+($c-1)..0|%{if($d-eq'l'){$_=$c-$_}' '*$_+'*'}}else{'*'}

$_Değişken sıfırlama - hileci Hobbit. Çok zekice ve bugün bir şey öğrendim.
AdmBorkBork

@TimmyD Çok hileci. Ve sonra daha da fazla tasarruf için if ifadesini değiştirin.
Jonathan Leech-Pepin

0

> <> , 60 bayt

i"1l"i=&-:&*&:?!\:1-:}c0.
~/?:<-$?&::&;!?l<oao"*"
1/  \o" "-

Alt satırda 2 boşa bayt, ne kadar tahriş edici!

Girişin <>> nasıl çalıştığından dolayı, giriş için 'beklemek' mümkün değildir - ikomut STDIN'de bir giriş karakterinin olup olmadığını kontrol eder. Varsa, o karakterin ASCII değerini iter ve eğer değilse -1'e basar.

Bu, bu programı kullanmak için, sayı ve yönün STDIN'de hazır olması gerektiği, örneğin 3rsağa dönük 3 büyüklüğünde bir ok olması gerektiği anlamına gelir . Bu girişi diskalifiye edeceğinden emin değilim, düşüncelerinizi bildirin: o)

Birisi isterse ayrıca bir açıklama yazacağım.


Bir anlamda bir kabuk içinde çalıştırmayı denerseniz giriş için bekler, bu yüzden bence sorun değil. Bunun, girişin tek bir rakam olmasını beklediği gerçeğiyle daha fazla ilgileniyorum ( :10 için giriş yapmak
istemiyorsam

Mükemmel bir nokta, 9'dan fazla girişi düşünmemiştim.
Sok

1
Sadece bir açıklama için ana soru üzerine bir yorum bıraktım, tam olarak
Sp3000

0

PHP, 154 bayt

Gerçekten tekrarlayıcı görünüyor, ancak istenen şeyi yapıyor:

$c=$argv[1];$b=l==$argv[2]?1:0;$a=$b?$c:-1;function a($a){echo strrev(str_pad('*',$a))."\n";}while($b?--$a:++$a<$c)a($a+1);while($b?++$a<=$c:1<$a--)a($a);

Komut satırından şöyle çalışır:

php arrow.php 5 l
php arrow.php 5 r

-1

Python, 88 Bayt

Düzenlenen

n=input()-1
x=raw_input()>'l'
for i in range(2*n+1):print" "*(n*x+(-1)**x*abs(n-i))+"*"
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.