Farklı yazıcılar kullanarak 1'den 15'e kadar baskı alın


22

Çok yönlü bir tamsayı yazıcı yapmak her şey güzel, ama çok sayıda farklı sayıyı basan tek bir kod yazmak zahmetlidir. Sayı çıkaran bir komut dosyası hazırlamak daha kolay olmaz mıydı, ama bir sonraki sayıyı almanız için size yeni bir komut dosyası veriyor mu?

Meydan okuma:

Tek bir tamsayı Nve çalıştırılabilir bir kod veren bir kod yazın . Bir sonraki kodun çıktısını alması gereken N+1bir kod verilmelidir N+2. Ulaşana kadar bu yola devam edin N = 15. (Son basılan numara 15 olmalıdır).

Kurallar:

  • Giriş yok (girişin boş olduğunu varsayalım).
  • Tam program veya işlev veya diğer uygun biçimlerde izin verilir.
  • İlk kod çıkarılmalıdır 1.
  • Baştaki sıfırları çıkaramazsınız. Yani Yazdıramıyorsanız 01için 1.
  • Çıktı formatta olmalıdır N, Code_for_N+1. Çıktının virgül ve tek boşlukla ayrıldığını unutmayın. Kod N+1no çevreleyen tırnak işaretleri var. N , Code_for_N+1kabul edilmez (virgülün önündeki alan). Son satırlar tamam.
  • Çıktının ilk karakterleri sayı olmalıdır. (Baştaki boşluk yok veya ans = N).
  • Yazdırılan numara bir sonraki kodun parçası olmamalıdır (kod bu numarayı içerebilir, ancak çıkış numarasını kodun bir parçası olarak alamazsınız).
    • Örnek: çıktı N=2olabilir: 2, printer 2. Bu durumda, printer 2kodudur N=3. Çıktının tamamını kullanamazsınız: 2, printer 2kod olarak N=3.
  • Komut dosyaları farklı dillerde olabilir
  • Veri türleri alakasız (sayı bir dize olabilir), ancak hiçbir şeyle çevrilemez (tırnak işaretleri, parantezler vb.).
  • Bunun için N=15basılmış bir kod varsa, ya yazdırmalı STOP!(bonusa bakınız) ya da hiç bir şey yazdırmamalıdır (boşluk ya da yeni satır bile değil).
    • İçin kod N=15çökemez (ancak STDERR'ye çıkış tamam).
    • Çıktı kodu N=15yazdırıldığında 16veya başka bir şeyde (bonus durumu hariç) diskalifiye edilirsiniz .
  • Dahili quine operatörlerine izin verilmez.
  • Kaynak dosyaya dosya sistemi üzerinden erişime izin verilmiyor.

Bonus:

-10 bayt basılan kod da " STOP!" yazdıran bir kod üretiyorsa, 10 bayt

Python sözdizimini kullanan örnekler: (açıkçası, bunlar yalnızca seçilen tamsayılar için çalışır, 1'den 15'e kadar olmaz)

N = 1
print "1, print 2"
1, print 2

---
N = 15
print 15
15

---
N = 15   (Qualifies for the -10 bytes bonus)
print "15, print 'STOP!'"
15, print 'STOP!'

print 'STOP!'
STOP!

----

N = 15   (Qualifies for the -10 bytes bonus)
print "15, disp('STOP!')"
15, disp('STOP!')        (disp('STOP!') outputs STOP! in MATLAB)

----
N = 15   (This one is not OK. The submission is disqualified)
print "15, print 16"
15, print 16

Standart golf kuralları geçerli! Bayt cinsinden en küçük kod (N = 1 için) kazanır!


Öyleyse, f=>f+""geçersiz olur mu? ( f+""işlevin yapım kodunu döndürür.)
Conor O'Brien,

@ C'O'Bʀɪᴇɴ onsuz, görevi başarmak bile mümkün

@nicael En azından js cevabında çoktan yapıldı
Conor O'Brien,

1
@ CᴏɴᴏʀO'Bʀɪᴇɴ ... uygulanabilir bir şekilde: D
nicael

Kurallar kafa karıştırıcı, gibi bir şey çıkarıp çıkarabilir miyim 14, print(14+1)?
nyuszika7h

Yanıtlar:


39

Pyth + ///, 15 bayt - 10 = 5

pPt`S15", STOP!

Bu 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, STOP!, Pyth'te, range(1,15+1)başlangıç ​​ve bitiş dirseklerini alıp çıkartarak ve hemen ardından ", STOP!" Yazdırarak yazdırır .

Sonraki on dört program, / içermeyen / /veya içermeyen tüm programları doğrudan çıkarır \. Yani ikinci program

2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15

verir 2ve üçüncü program 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15. Sondan bir önceki program, 15, STOP!yazdırır 15, STOP!, yani son program sadece STOP!.


3
Yüzsüz. Bunu sevdim. :)
Martin Ender

catDil olarak sayılır mı ?
kullanıcı253751

@ immibis bir primallik cattesti yapmaz, yani hayır.
kullanıcı48538

1
Program # 2 ve üstü PHP'de de çalışır. :)
Ilmari Karonen,

31

JavaScript, 131238 - 10 = 131228 bayt

Saf yaklaşım, beklenenden daha kötü çıktı. Ön görüşte beklemeliydim. Ama yine de paylaşacağımı düşündüm. Kodun tamamı burada.

Fikir: Tekrar tekrar kaçma ve ekleme N-1, ...

alert("14,alert(\"15, alert(\\\"STOP!\\\")\")")

7
Bence bu, PPCG'nin cevaplarındaki en fazla ters eğik çizgi.
lirtosiast

1
Bunun için NP ++ ve regex kullandığınızı itiraf ediyorum =)
kusur

19
Haha, bu -10 çok yardımcı olur: D
nicael


Bonus olmadan bazı baytları kaydedebilirsiniz.
Rɪᴋᴇʀ

8

CJam, 26 25 24 bayt

1{", "2$)@"_~"](_F<@*}_~

Çevrimiçi deneyin.

Sonraki programlar sadece ilk sayıyı artırır. Bu, programı 16 kez çalıştırır.


Veya aynı puan için bonus:

1{", "\2$)_G<\@`+"_~"+"STOP!"`?}_~

Çevrimiçi deneyin.

Sonraki programlar sadece ilk sayıyı artırır. Bu, programı 16 kez çalıştırır.

Bonus için alternatif çözüm:

1{", "\2$)Gmd@`+"_~"+"STOP!"`\?}_~

2
@FryAmTheEggman cjam.tryitonline.net/… , programı kodlamak için Base64'ü kullanıyor ve bu da yorumlarda kalıcı izinlerin gönderilmesini biraz kolaylaştırıyor. </selfpromotion>
Dennis,

@Dennis Teşekkürler, başım biraz ağrıyordu: P, Martin zaten kendi yazısını yazmış gibi görünüyor.
FryAmTheEggman

@FryAmTheEggman Sadece bağlantınızı yine de gördükten sonra öneri için teşekkürler. ;)
Martin Ender

7

JavaScript (ES6), 62 61 bayt - 10 bonus = 51 puan

_=>"1, "+(f=n=>`_=>"`+(n<16?n+`, "+(${f(n+1)})`:`STOP!"`))(2)

açıklama

Kendi okuma kodunu okumayan ve saçma bir şekilde uzun olmayan bir çözüm.

İlk program diğer 15 programı da oluşturur ve özyinelemeli bir işlev kullanarak bunları birbirinin içine yerleştirir. Ters eğik çizgi sorununu, dizeleri yerine işlevlerin kendilerini (sonra çıktı sırasında dizelere dönüştürürler) yerleştirerek çözerim.

_=>
  "1, "                // print the first number
  +(f=n=>`_=>"`+(      // f = recursive function for printing program N
    n<16?              // for programs 2 - 15:
      n+`, "+(${       // add N to the output of the nested function
        f(n+1)         // nest the code of program N + 1
      })`
    :`STOP!"`          // program 16 just outputs "STOP!" for the bonus
  ))(2)                // start from program 2

Ölçek


1
JavaScript'in yerleşik işlevini alma özelliğini kullanmadığı için +1 (sorgulama için gri alan)
Aᴄʜᴇʀᴏɴғᴀɪʟ

2
@Callodacity Nasıl "" + (n=>m)fonksiyonun gövdesini almak sayılmaz n=>m?
Neil

@ Neil Aslında haklısın sayılır - Ben sadece program 1'e baktığım ve
çıktıdan geçmediğimden

Tüm ters eğik çizgiler nereye gitti!
Noodle9

5

Matlab, 226 212 - 10 = 202 bayt

@StewieGriffin'e bir kaç bayt için teşekkürler =)

'awFjw|DWFw1:2DVFw1;Cnwm2Dro)WG:::DwF0\]XY*0Dnu|nDwFdw~v;|}{1W6B?2505)05<B5W4:5V5<B5>B5V6B500fDnwmDmr|y1w2';n=ans;N=n(1);M=n(2:end);if N>111;n='STOP!';else;n=[num2str(N-96),', ',39,N+1,M,39,59,M-9,''];end;disp(n)

İlk bölüm, ikinci satırı (altta) temsil eden bir dizedir, gerçek kod (sadece 9 tarafından kaydırılır). Matlab'da, dizgeler karakterlerle dolu matrislerdir, böylece sadece bir skalar ekleyerek / çıkararak vardiyaları kolayca yapabilirsiniz. Böylece program tekrar aynı dizgeyi * tekrar yazdırır, artı aynı dizgeyi yazdırır, ancak kod değiştirilir.

* Tam değil: İlk bayt, her yinelemede arttırılması gereken sayaç.

İp ile yapılan kısa numara, utanmadan çalındı .

'awFjw|Dro)w1:26B?G:>DwF0\}xy*0Dnu|nDwFdw~v;|}{1w1:26B?2505)05<B5w1:24:5w1;Cnwm25<B5>B5w1;Cnwm26B500fDnwmDmr|y1w2';
n=ans;if n(1)-96>15;n='Stop!';else;n=[num2str(n(1)-96),', ',39,n(1)+1,n(2:end),39,59,n(2:end)-9,''];end;disp(n)

İşte dizinin son birkaç satırı konsoldan kopyalandı:

>> 'mwFjw|DWFw1:2DVFw1;Cnwm2Dro)WG:::DwF0\]XY*0Dnu|nDwFdw~v;|}{1W6B?2505)05<B5W4:5V5<B5>B5V6B500fDnwmDmr|y1w2';n=ans;N=n(1);M=n(2:end);if N>111;n='STOP!';else;n=[num2str(N-96),', ',39,N+1,M,39,59,M-9,''];end;disp(n)
13, 'nwFjw|DWFw1:2DVFw1;Cnwm2Dro)WG:::DwF0\]XY*0Dnu|nDwFdw~v;|}{1W6B?2505)05<B5W4:5V5<B5>B5V6B500fDnwmDmr|y1w2';n=ans;N=n(1);M=n(2:end);if N>111;n='STOP!';else;n=[num2str(N-96),', ',39,N+1,M,39,59,M-9,''];end;disp(n)
>> 'nwFjw|DWFw1:2DVFw1;Cnwm2Dro)WG:::DwF0\]XY*0Dnu|nDwFdw~v;|}{1W6B?2505)05<B5W4:5V5<B5>B5V6B500fDnwmDmr|y1w2';n=ans;N=n(1);M=n(2:end);if N>111;n='STOP!';else;n=[num2str(N-96),', ',39,N+1,M,39,59,M-9,''];end;disp(n)
14, 'owFjw|DWFw1:2DVFw1;Cnwm2Dro)WG:::DwF0\]XY*0Dnu|nDwFdw~v;|}{1W6B?2505)05<B5W4:5V5<B5>B5V6B500fDnwmDmr|y1w2';n=ans;N=n(1);M=n(2:end);if N>111;n='STOP!';else;n=[num2str(N-96),', ',39,N+1,M,39,59,M-9,''];end;disp(n)
>> 'owFjw|DWFw1:2DVFw1;Cnwm2Dro)WG:::DwF0\]XY*0Dnu|nDwFdw~v;|}{1W6B?2505)05<B5W4:5V5<B5>B5V6B500fDnwmDmr|y1w2';n=ans;N=n(1);M=n(2:end);if N>111;n='STOP!';else;n=[num2str(N-96),', ',39,N+1,M,39,59,M-9,''];end;disp(n)
15, 'pwFjw|DWFw1:2DVFw1;Cnwm2Dro)WG:::DwF0\]XY*0Dnu|nDwFdw~v;|}{1W6B?2505)05<B5W4:5V5<B5>B5V6B500fDnwmDmr|y1w2';n=ans;N=n(1);M=n(2:end);if N>111;n='STOP!';else;n=[num2str(N-96),', ',39,N+1,M,39,59,M-9,''];end;disp(n)
>> 'pwFjw|DWFw1:2DVFw1;Cnwm2Dro)WG:::DwF0\]XY*0Dnu|nDwFdw~v;|}{1W6B?2505)05<B5W4:5V5<B5>B5V6B500fDnwmDmr|y1w2';n=ans;N=n(1);M=n(2:end);if N>111;n='STOP!';else;n=[num2str(N-96),', ',39,N+1,M,39,59,M-9,''];end;disp(n)
STOP!

5

JavaScript, 50 47 44 42 44 * bayt

a=_=>(x=1)+(x<15?", a="+a:"").replace(x,x+1)

Kendi bedenini (sadece a) çeken ve onun içinde yer değiştiren bir işlev . İşlev gövdesine JavaScript'in yerleşik bir özelliği olması, açıkça bir quine operatörü olmamasına rağmen (geçersizse, yanıtı kaldıracaktır).

a=_=>(x=1)+(x<15?", a="+a:"").replace(x,x+1);
alert(a());

Düzgün bir şekilde gömülü olarak çalışmazsa (çünkü benim için çalışmaz) orada bir örnek görebilirsiniz .


* - snippet'in sonuç vermemesi gibi görünüyor a=, daha fazla çağrı yapmak imkansız


1
"Fonksiyon gövdesini elde etmek için yerleşik bir özellik" bir quine operatörü ile nasıl aynıdır? Bunun geçersiz olduğunu söylemiyorum, sadece farkın ne olduğunu merak ediyorum.
Stewie Griffin

Sadece bir tanesi üzerinde çalışıyordum. o_o Yapamaz mısın .replace(x++,x)?
Conor O'Brien,

3
@StewieGriffin Sorgulamak için yapılanlar, diğeri meşru bir özellik.
Conor O'Brien,

@Stewie Ancak "quine işlecinin" tüm programı geri göndermesi gerekiyor, benim örneğimde ise bir quine yapma amacı olmadan bir fonksiyon alır (tüm program kodunu döndürecek yerleşik bir yöntem yoktur). İşlevlere izin verdiğiniz için, benzer olabilir, bu yüzden merak ediyordum.
nicael

Çalışıyor a=_=>(x=1)+(x<15?`, ${a}`:"").replace(x,x+1)mu
Conor O'Brien,

5

Python 2.7.10, 196 92 - 10 = 82 bayt

Whee !!! Bu komikti. Şimdi çok daha kısa. : P

n=1;a='n=%d;a=%r;print n,a%%(n+1,a)if n!=15else"STOP!"';print n,a%(n+1,a)if n!=15else"STOP!"

Açıklama:

Bununla başladım:

a='a=%r;print a%%a';print a%a

Bu sadece basit bir ip. Bu, bir sayaç eklenmiş olarak:

n=1;a='n=%d;a=%r;print n,a%%(n+1,a)';print n,a%(n+1,a)

nbaşlangıçta basılan bir sayaç değişkenidir. Onun basar Sonra n=parçası, ikame ettiği n+1için%d . Böylece buradan sonsuz sayılır.

Ve işte son versiyon. 15'te durmak için bir if cümleciği ekler ve "DUR!" yanı sıra.

n=1;a='n=%d;a=%r;print n,a%%(n+1,a)if n!=15else"STOP!"';print n,a%(n+1,a)if n!=15else"STOP!"

Eski kod:

a= ['if num==15:print"STOP!!!";exit()','print num','print"a=",a','print"num=",num+1', 'for s in a:print s']
num= 1
print num
if num==15:print"STOP!!!";exit()
print"a=",a
print"num=",num+1
for s in a:print s

Asla kazanamayacak, ama eğlenceli. : P Şimdi daha kısa, yine de hiç şansım yok. : P


Vay. Bir açıklama ekleyebilir misiniz çünkü bu harika ama neler olduğu hakkında hiçbir fikrim yok: D
Sherlock9

@ Sherlock9 yapıldı. Değerlendirmeniz için teşekkürler.
Rɪᴋᴇʀ

Bunu kesip etkileşimli bir python 2.7.6 oturumuna yapıştırırsam, elses'den önce boşluk olmadığından şikayet ediyor .
eric

@eric Python 2.7.10 kullanıyorum ve benim için çalışıyor ...
Rɪᴋᴇʀ

3

PowerShell, (215-10) = 205 197 167 106 104 103 bayt

$d='$c=(,1*{2}).count;$d={0}{1}{0};(("$c, $d"-f[char]39,$d,($c+1)),$c)[$c-eq15]';"1, $d"-f[char]39,$d,2

(Tek aletiniz PowerShell ise, her sorun bir çiviye benzer. Bekleyin ...)

Esasen, biz ayarı ile başlayan $dbir neredeyse bir büyük ole-uzun dizeye eşit Quine'a orijinal kod. Bu çıktılar 1ve daha sonra $dbiçimini operatörü ile -fdoğru bir şekilde doldurmak için {0}, {1}, {2}stand-in, artan {2}sayı,1*{2} bir her defasında bölüm.

,x*yPowerShell içinde operasyon yeni bir dizi oluşturur yeşittir her biri öğeleri x. Örneğin ,2*3, eşdeğerdir@(2,2,2) .

Bu, ilk çıktının 1, $c=(,1*2).length;$d=(etc...)ikinci kod yürütüldüğü zaman $cdizinin sayımına eşit @(1,1)veya daha fazla olacağı anlamına gelir 2.$c . Orijinal kodda bir değişken olarak kullanılmadığına dikkat edin.

$cEşittir olup olmadığını hesaplayarak 15ve sonra bir diziye endeksleyerek hesaplayarak 15 basıldığında durur , 0th elemanı $c, $dyukarıda açıklandığı gibidir, diğeri de adildir 15. Böylece, $c15 olduğunda , çıkacak 15ve başka bir şey olmayacak. Bonus için uygun değil, çünkü"15, {0}STOP!{0}" -10'un değerli olması için 5 karakter çok uzun.

>> 150 genişliğinde bir PowerShell terminali gerektirir. Veya , kodu kopyalarken yapıştırma işlemini (terminalin çıkış sargısına yararlı bir şekilde yerleştirdiği) fazladan elle kesmeniz için. Veya çıktıyı bir değişkene yakalamak ve daha sonra bu değişkeni yeniden çalıştırmak için. Vb.

Düzenleme 1 - "DUR!" ifadeler.
Düzen 2 - Durr, her seferinde .length kullanmayın, sadece bir kez arayın
Düzen 3 - Bir kuyruk olması gerekmez, bu nedenle ilk çalıştırmanın daha kısa olması gerekir
Düzen 4 - Dizeleri kullanmaktan değiştirildi hesaplamak için dizileri $c, iki bayt kurtardı. Bunun neredeyse bu yaklaşım için uygun olduğuna eminim.
Düzenleme 5 - Modlama yerine doğrudan eşitliği sayarak başka bir byte kaydetti


Windows 10 konsol penceresi artık çıktı sarma satırını kopyalamıyor.
Neil

2

JavaScript, 79 - 10 = 69 bayt

s='STOP!';for(i=15;i;){s=i--+',alert("'+s.replace(/[\\"]/g,"\\$&")+'")'};alert(s)

Hiç Function.prototype.toStringbir şekilde kullanmadan .


2

Befunge, 57 - 10 = 47 bayt

1:'!`'#*j:.',,1+:9`''*'0++,1#;:0g:48*`j@,1+;"!POTS",,,,,@

Bu harika. Burada dene .


Dur mesajının doğru kasası:STOP!
user48538

@ zyabin101 düzeltildi.
MegaTom

2

Toplu, 73 + 5 - 10 = 68 bayt

@set a=STOP!
@for /l %%a in (15,-1,1)do @set a=%%a, @echo !a!
@echo %a%

Gerektiği CMD /V:ONiçin bunun için 5 bayt ekledi.


2

Python 2.7, 107 karakter

Özyineleme kullanarak ve değil bir Quine yazma, ben iyi yeterince doğrudur çok, tasarruf değil, diye düşündüm. Kazanan olmasa da, yaklaşımın paylaşmanın eğlenceli olduğunu düşünüyorum.

Ben \ve "karakterlerinden kaçan N = 4 için bir dize oluşturarak başladım .

print "1, print \"2, print \\\"3, print \\\\\\\"4, print \\\\\\\\\\\\\\\"STOP!\\\\\\\\\\\\\\\"\\\\\\\"\\\"\""

Daha sonra, özyineleme kullanarak bir başlangıç ​​indeksine ve bir stop indeksine dayanarak bu dizgeyi yaratan bir lambda fonksiyonu yarattım. Budur:

l=lambda n,m:str(n)+", print "+"\\"*(2**(n-1)-1)+"\""+l(n+1,m)+"\\"*(2**(n-1)-1)+"\"" if n<m else "STOP!"

Bu şekilde kullanın:

print l(1,15)

Çıktı: [32902 karakter, işlenemeyecek kadar uzun]

Öyleyse, benim kolmogorov karmaşıklığı yaklaşımım o kadar başarılı değil ;-)


2

SMBF , 28 bayt

\x10değişmez baytı temsil eder (ondalık değer 16). Tamsayı bir tamsayı (bayt) olarak verilir. Yani ilk karakter çıktısı \x01. Program daha sonra "," yazdırır. Kendi kaynağını yazdırırken +, başlangıçta fazladan yazdırır .

+.<-<<.>.>[[<]>.[.>]<[-]], \x10

Açıklama:

+.                                  Increment number and print
  <-                                Pre-decrement loop counter
    <<.>.>                          Print comma and space from own source
          [             ]           Only execute if loop counter != 0
           [<]>.                    Move to left of source, then print `+`
                [.>]                Print entire source.
                    <[-]            Zero out the loop counter so this program halts.
                         , \x10     The comma, space, and loop counter used earlier.
                                    Input is empty, so `,` doesn't do anything.

Bunu standart bir tercümanda çalıştıramayacağınızı unutmayın, çünkü girişte onaltılı bir hazır bilgi gereklidir. Onaltılık çıkışın düzgün çalışması için özel bir terminale de ihtiyacınız vardır.


1

Bash, 78 74 73 - 10 = 63 bayt (Örnek, kazanamaz)

p='if(($((++a>15))));then unset a p;fi;echo ${a-STOP\!}${p+, $p}';eval $p

Geç geliyor, ama bash denenmemiş görüldü, bu yüzden bir şans verdi. İlk körfez meydan okuma ve quine benzeri bir bulmaca. Onlar eğlenceli!

Açıklama:

Bu işe yarıyor, çünkü a1'den 15'e kadar olan adımlar ve unsetberaberinde geliyor p. Betik (içinde saklanır p) eğer öyleyse ikisini de basar setve "DUR!" aksi takdirde. Başlangıçta unset aise setbir aritmetik genişleme göründüğünden 0'a.


1

Char, 30 karakter / 47 bayt (rekabetçi olmayan)

⟮a=1)+(a<ḏ?⬬+ⒸⅩ222+ᶈ0:⬯)ē(a,⧺a

Try it here (Firefox only).

Nihayet 𝔼𝕊𝕄𝕚𝕟 için iyi bir ol 'ın quine buldum.

açıklama

İşte kullandığım gerçek quine: ⟮ⒸⅩ222+ᶈ0

Cevabımda gördün mü? Umarım, siz oradan genişleyebileceksiniz.


1

Keg + PHP, 19-10 = 10 bayt

ï_(. \,,,)\!POTS(,

1'den 15'e kadar sayar ve sonra durur. TIO

Fıçı, 13 bayt

ï_(. \,,,).
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.