Yazdırma için program şablonu * herhangi bir * string


40

Aşağıdaki özelliklere sahip bir program yazın:

  • Olduğu gibi çalıştığında, program çıktı üretmez (yani, çıktı 0 byte).

  • Programın içinde (istediğiniz bir seçim: başlangıçta, sonunda veya ortada bir yerde olabilir) aşağıdaki özelliklere sahip bir konum vardır: herhangi bir dize yerleştirerek programı değiştirmek , ortaya çıkan programın o dizeyi yazdırmasına neden olur. idam.

    Bu, dizenin tırnak işaretleri, ters eğik çizgiler, yorum işaretleri, sınırlayıcılar, NUL baytlar vb. İçerip içermediğinden bağımsız olarak çalışmalıdır; Ne koyduğunuza bakılmaksızın, dize hala bir dize olarak yorumlanır ve tamamen sözlü olarak basılır. Bununla birlikte, derleyicinin hafızasının tükenmesine ya da benzerinin bitmesine neden olacaksa çok kesin dizeleri işleyemezsiniz (kesin olarak, en az 1000 bayt uzunluğunda ya da üç kez dizeleri kullanabilmelisiniz). programınızın uzunluğu, hangisi daha uzunsa).

Geçersiz bir çözüm örneği şöyle olabilir:

print("");
#      ^ text goes here

Python, Perl, Ruby, vb .; birçok dize için çalışsa da, çift tırnak içeren bir dize veya alt dizeyi içeren bir dize \n(yeni satır olarak yorumlanacaktır) için çalışmaz .

Bu sorunun çoğu dilde muhtemelen mümkün olmadığını unutmayın; Mesele en azından kısmen çalıştığı dili bulmaktır. Seçtiğiniz dil, bu sitenin tanımı altında bir programlama dili olmalıdır , örneğin Metin içinde bir çözüm sunmaz .

Bu bir olduğu için en kısa program şablonu kazanır. Ancak, mevcut kazananı geçemeseler bile çözüm sunmalarından vazgeçmeyin! Hala ikinci, üçüncü, vb. Yer için yarışabilirsiniz ya da mümkün olduğu kadar çok cevap bulabilmek için. Ancak, göndermeden önce programınızın tüm spesifikasyonları karşıladığından emin olmalısınız; yaklaşık çözümler problemin noktasını kaçıracaktır.


İlgili Sandbox yazısı burada .

Girilen dize için desteklememiz gereken karakter aralığını netleştirebilir misiniz? ASCII? ASCII + yazdırılamaz? Tüm unicode?
DJMcMayhem

3
Tüm 256 sekizli. Bunları bayt olarak mı yoksa Unicode olarak mı yorumluyorsun? yazdırıldığında fazla bir fark yaratmaz.

1
Sorunun amacı (ve şu anda ifade edilme şekli) ek bir çıktı alamayacağınızdır. Aklından kaçınmak için uyarlanamayacak bir çözümünüz var mı? (Başıboş çıktıları önlemek için fazladan bayt kullanılması, başıboş çıktılar oluşturmak ve teknik özelliklere uymamak için tercih edilir.)

1
Bu bir kod değişikliği gerektirmiyorsa, önemsiz olurdu AWK, sadece 1yapacaktır.
Robert Benson,

Yanıtlar:


37

Excel, 1 bayt

'

Ungolfed versiyonu

'        <-- print the following text,
             and exit the current formula

Bunun yeni hatları kabul edebileceğini sanmıyorum.
Conor O'Brien,

3
@ ConorO'Brien vardiya + enter ile yapar
Adam

2
@ MrPaulch Bu oldukça fazla sayıda retro mühendisliği idi. Bu komutun sistemi çökertme gibi diğer bazı bilinmeyen işlevleri gizlediğinden eminim.
Adam

1
Bu aynı zamanda OpenOffice Calc üzerinde de çalışır. Biçime bir hücre ayarladığınızda otomatik olarak kullanılır @.
Ismael Miguel,

1
Şahsen ben bu cevabın iyi olduğunu düşünüyorum. @Dennis, aynı konsepti kullanan Mathematica gönderimi silmiş. Excel'in ön ucu, "" "" /// testini sözlü olmayan bir dize olarak saklayacaktır, bu yüzden mantığı ile bu silinmelidir. İşte <Row> <Cell> <Data ss: Type = " "X: Ticked =" 1 "> test // & quot; & quot; & quot; /// </Data> </Cell> </Row>
Kelly Lowder 28:16

20

Jolf, 6 bayt

a Lq6(

açıklama

a Lq6(
a       print
  L 6   all but the first 6 characters of
   q    the source code
     (  and exit

15

Perl 5 , 30 21 19 bayt

<VERİ> __ END__ yazdırmak

Çevrimiçi deneyin!

Sondaki yeni hat. Bu markaları keyfi veriler daha sonra üzerinden okunabilir kaynak dosyası, eklenecek sağlayan bir Perl özelliğini kullanmak DATAdosya tanıtıcısına. Argüman olarak bir dosya askısı verdiğimizde, dosya askısının printdosyadaki tüm satırların listesini döndürmesine neden olan bir liste bağlamı verilir. Daha sonra printörtük olarak hepsini birleştirir, satırları bölmeyi geri alır ve yeni satırların nerede olduğuna bakılmaksızın bize tam olarak orijinal dizgiyi verir.

Yeni hatları manuel olarak kullanmanın gerekmediğini fark eden @Dada ve her biri golf oynayabilecek bir karakter tespit eden @ ninjalj ve @b_jonas sayesinde.


2
İhtiyacın olduğunu sanmıyorum undef$/. Bir argüman olarak print, <DATA>liste bağlamında çağrılır, bu yüzden var olan her satırı okumalıdır.
Dada

Haklısın. Her seferinde girdiyi bir satır okur, satır ayırıcıları tutar, ardından yazdırırken hepsini örtülü olarak birleştirir; Bu da 8 baytlık bir tasarruf; Ben yazıyı düzelteceğim.

4
Sen kullanabilirsiniz __END__yerine __DATA__.
ninjalj

Ne @ ninjalj diyor ki, artı işaretinden büyük olan newline'ı atlayabilirsiniz (fakat program sonunda newline'a ihtiyacınız var).
b_jonas

14

Zsh, 6 bayt

<<'
'

Sonunda yeni bir satır var. Dize programın sonuna eklenir.

Bash, 20 17 bayt

3 byte'ı çıkardığı için Adam'a teşekkürler .

exec sed 1d "$0"

* nix kabuk betiği, 21 14 bayt

7 bayt'ı çıkardığı için Adam'a teşekkürler .

#!/bin/sed 1d

1
@Copper Sonunda yeni bir satır var. Dize bundan sonra eklenir.
jimmy23013

Ah, anlıyorum. Beni düzelttiğin için teşekkürler!
Bakır

6/9-baytlık çözümler tercümanlıktaki bir hatayı bana kullanıyorlar gibi gözüküyor (elbette buna izin verilmiyor değil). (Bazı deneylerle AFAICT, bir hat üzerinde kendi başına yeni bir hat arıyorlar, ancak satırlar yeni hatlara bölünerek tanımlanıyor, bu yüzden bir satırdaki yeni satır asla başaramaz.) zshÇözüm doğru görünüyor; ancak, 9 baytlık bashçözüm yanlıştır (eğer dosyada yoksa, takip eden bir yeni satır ekler).

@ ais523 Bana da bir hata gibi geldi. Ve tercümanların izin vermelerini beklemiyordum. Bash çözümü kaldırıldı.
jimmy23013

1
bash için sed 1dyerine kullanabilirsiniztail -n+2
Adam

13

brainfuck ( Okunamayan Brainfuck ), 9 bayt

,+[-.,+]!

Girişi sonuna kadar ekleyin. Bu sefer sonunda yeni bir satır yok.

Programın sonuna eklenen girdileri kabul edecek dilleri ararken, beyin fırtınası farklı bir olasılık gibi görünüyordu; Esolangs dilinde yazılan birçok beyin fırtınası tercümanı hem programı hem de programın girişini standart girdiden alır ve bu nedenle aralarında anlatmak için bir yol gerekir. Bu durumda, bir !karakterin programla girdi arasında farklılaştığını gösteren bir kural var ,[.,]!Hello, world!; kısa beyin fırtınası programları yazmak için sıklıkla kullanılan bir numara ; Bu temelde !normalden farklı bir anlama sahip farklı bir beyin fırtınası lehçesi yaratır .

Teoride, bu nedenle, sadece bu tercümanlardan birini bulabiliriz catve şartnameyi yerine getirmek için bir program verebiliriz . Yine de büyük bir incelik var; brainfuck tipik olarak her hücre için 256 değer kullanır, 256 oktet vardır ve birinin EOF için kullanılması gerekir. Bu nedenle, tüm 256 okteti kelimenin tam anlamıyla yankılanmak istiyorsak, EOF'yi hiç tespit edemiyoruz ve programı başka bir şekilde sonlandırmamız gerekecek. Başka bir deyişle, 256 sekizlik ve EOF 257'ye farklı değerler veren veya EOF'de çöken bir uygulama bulmamız gerekiyor.

Okunamayan'ı girin . Okunamayan'da bu zorluğun önüne geçen ve bir girdiyi kabul eden bir beyin fırtınası tercümanı var !; Ek olarak, çoğu beyin sızıntısı yorumlayıcısının aksine, EOF için bignum hücreleri ve -1'i kullanır ve EOF'nin diğer 256 olası oktetten ayırt edilmesini sağlar. Bu nedenle, programın özel tercümanı olarak Okunamayan Brainfuck kullanımıyla cat, EOF = -1 üzerinde duran bir beyin fırtınası programı yazarak mücadeleyi sadece 9 byte çözebiliriz .

Daha iyisini yapmak mümkün mü? Eh, şu 7 baytlık programı deneyebilirsiniz hangi girişimleri çıktı o döngünün patlak önce dizenin sonunda EOF:

+[,.+]!

Bu programın davranışı, Okunamayan tercümanın hata koşullarındaki davranışına bağlıdır (bu nedenle, yalnızca beyin tıkanmasının uygulanmasına değil, beyin sızıntısının uygulanmasını çalıştırmak için kullanılan uygulamaya bağlıdır). Ne yazık ki, kullandığım Okunamayan tercüman standart çıktıdaki çıktıları veriyor , bu da tasarrufun işe yaramayacağı anlamına geliyor. EOF çıktısı girişiminde bulunan veya girişimi sessizce atlayan bir Okunamayan tercüman bilen varsa, bana bildirin; Bu orada yedi baytlık bir çözüm olurdu.


1
,[.,]!Burada çalışıyor ve 6 bayt (sadece işaretli kutucuğu işaretleyiniz !). Ayrıca sona erer.
FinW

@FinW: Bu web sitesine bir NUL baytının nasıl girileceğini çözemiyorum, ancak bu kod bir tane görürse kesin olarak sonlandırılacak.

Ben yaptığımda NUL bayt olmadan iyi çalıştı.
FinW

1
Kelimenin tam anlamıyla bir ,(mevcut bant elemanına standart girişi okuyun) ve ardından bir ](mevcut bant elemanı 0 ise çıkış döngüsü) var. Bu nedenle, 0 değeri olan bir giriş baytının okunması (yani NUL) döngüyü kıracaktır.

Ancak tercüman herhangi bir girdi okumazsa (örneğin, dizginin sonundan sonra !) geçerli bant öğesini otomatik olarak 0'a ayarlar, bu nedenle döngüyü sonlandırır.
FinW

9

Dyalog APL , 11 bayt

Aşağıdaki, f fonksiyonunun gövdesidir :

2↓⎕CR'f'⋄→

Sonunda yeni bir satır var, bundan sonra her şey eklenebilir.

2↓ ilk iki satırı (başlık ve bu satır)

⎕CR'f' haracter R, bir ePresentation f

sonra

bırakmak, vazgeçmek



9

JavaScript + HTML5 DOM, 163 Bayt

<html><body><script>fetch(location).then((r)=>r.text().then((t)=>console.log(t.slice(145,t.lastIndexOf("</b")))));document.body.remove()</script></body></html>

Kapanış body etiketinden önce doğrudan istediğiniz herhangi bir şeyi ekleyebilirsiniz. Bu, sayfa kaynağını almak ve açılış kodunu ve kapanış etiketlerini çıkarmak suretiyle çalışır.

Gerçek öldürücü sonsuz bir döngüden nasıl kaçılacağını bulmaktı. while(true){}Sayfayı koymak , tüm geri aramaları sonsuza dek engeller, yürütmeyi dondurur ve JavaScript’in ana konuyu duraklatma yolu yoktur. Bununla birlikte, artık bulunmayan kod hiçbir zaman çalışmaz, bu nedenle belge gövdesi seppuku'yu en son komutta işleyerek klonunun yüklenmesini beklerken kendini siler.

Evet, uzun ve dolambaçlı, ancak JS'de mümkün olması gerçekten şaşırtıcı.


1
Chrome son zamanlarda ayrıştırıcı engelleyen komut dosyalarında sinirlendi ve bunlardan bir demet şikayet etti. Herhangi bir komut dosyasının yazdırma girişimi mahvetmesini önlemek için ayrıştırıcıyı kasıtlı olarak engelleme fikrini seviyorum .

7

PHP, 46 bayt

(takip eden satır sonu dahil)

<?=join([""]+file(__FILE__));halt_compiler();
STRING HERE

Evet: filefonksiyon bile ikili güvenlidir.

[""]+ 0 dizini (dosyanın ilk satırı) boş bir dizeyle değiştirir


6

gs2 , 4 bayt

╥¶=☼

CP437 kodlamasını kullanır. Dize sonunda gider. kaynak kodunu alır, 4 tuşuna basar, =önde gelen birçok karakteri bırakır ve çıkar.

Çevrimiçi deneyin!


5

PHP 94 bayt

<?$f=fopen(__FILE__,'rb');fseek($f,93);while(false!==($c=fgetc($f)))echo$c;__halt_compiler();

Dizenizi son noktalı virgülün arkasına yerleştirin.

Gizli özellikleri için Yay sanırım? __halt_compiler (), tam olarak adından beklediğiniz şeyi yapar. Önceki kod sadece dosyayı açar ve bu son noktalı virgülten sonraki baytları stdout'a yazar. NUL, BEL vb. İyi çıkıyor. Unicode değişmezleri (♪) Windows'a batırıldı, ancak bunun yalnızca Windows cmd'nin unicode'da başarısız olduğunu düşünüyorum.


1) 93 bayt sayıyorum, 94 değil. 2) false!==$c=...parantez gerektirmez. 3) rbalıntı yapmak gerekmez. 4) Bir byte'ı for($f=fopen(...),fseek($f,88);false!==(...);)echo$c;5) başka bir iki byte'tan daha kısa kaydedebilirsiniz :<?for($f=fopen(__FILE__,rb);false!==$s=fgets($f,86);)echo$i++?$s:"";__halt_compiler();
Titus

6) ve ikinci parametreyi atlarsanız fgetsve şablona izleyen bir satır sonu eklerseniz başka bir iki bayt .
Titus


3

PHP, 48 60 bayt

<?=substr(file_get_contents(__FILE__),60);__halt_compiler();STRING HERE

PHP'nin kapatılmasının dizenin içermesini engellemediğinin farkına vardım <?.


Yanlış yerleştirilmiş bir kapanış dirseğin var. Benim denememden çok daha düzenli dosya dökümü olsa da, substr () 'nin boş baytlarda boğulacağını düşündüm - tahmin etmeyin.
ToXik-yogHayat

Bu deneyin: <?die(substr(file_get_contents(__FILE__),48))?>STRING HERE. Çalışmalı. Ben denedim <?die('a')?>ve işe yaradı.
Ismael Miguel,

@IsmaelMiguel çalışmayacak. dieparametresini yazmaz, ancak çıkış kodu olarak gönderir. Olmalıydı die(print ...).
Titus

@ ToXik-yogHurt çoğu string işlevi ikili güvenlidir. hatta file. Aslında şu anda olmayan bir şeyi düşünemiyorum.
Titus,

@Titus Denedie('text');
Ismael Miguel

2

İkili Lambda Hesabı , 1 bayt

 [text goes here]

Bu, metinden önceki tek bir boşluk (0x20).

Çevrimiçi deneyin!

Nasıl çalışır

0x20 = 00100000 2 olarak ayrıştırıldı

00    λx.
01        x
0000  (ignored, can be anything)

(Aslında, karakterlerden herhangi biri !"#$%&\'()*+,-./eşit derecede iyi çalışacaktır.)

Bu tam bir ifade olduğu için, programın geri kalanı girdi verileri olarak ve ikili lambda matem I / O kuralları altında λ x özdeşliği altında yorumlanır . x , girişi doğrudan çıkışa kopyalar.


İlgi alanı dışında, neden kimlik işlevi ile ekleme arasındaki sıfır bit bitmiyor?

@ ais523 Tercüman her seferinde bir bayt ve bir kez λ x okur . x ayrıştırıldı, dolgu zaten tüketildi.
Anders Kaseorg



1

Excel VBA, 6 Bayt

Bu daha çok, Adam'ın Cevabında VBA ortamındaki Orta Pencereye Yanıtında tutulan metnin nasıl basılacağı sorusuna cevap vermek içindir.

Temel kurulum:

Aktif sayfadaki A1 hücresinde , yazdırılacak dizgiyi tutmak için aşağıdaki formülü kullanın. Bayt sayımı uğruna, bu 1 Bayt ekleyecektir.

'[Your Text Here]

Örneğin:

'Hello 
World

Hemen Pencere İşlevi, 5 + 1 = 6 Bayt

?[A1]

'A1 hücresindeki +1 Bayt


0

Vim (eski modda), 28 bayt

#!/bin/ex -c ':1d' -c ':wq'
[string]

28 bayt son satırsonunu da içeriyor.


0

Vim, 738 bayt

:imap <esc> <c-v><esc>
:imap <c-a> <c-v><c-a>
:imap <c-b> <c-v><c-b>
:imap <c-c> <c-v><c-c>
:imap <c-d> <c-v><c-d>
:imap <c-e> <c-v><c-e>
:imap <c-f> <c-v><c-f>
:imap <c-g> <c-v><c-g>
:imap <c-h> <c-v><c-h>
:imap <c-i> <c-v><c-i>
:imap <c-j> <c-v><c-j>
:imap <c-k> <c-v><c-k>
:imap <c-l> <c-v><c-l>
:imap <c-m> <c-v><c-m>
:imap <c-n> <c-v><c-n>
:imap <c-o> <c-v><c-o>
:imap <c-p> <c-v><c-p>
:imap <c-q> <c-v><c-q>
:imap <c-r> <c-v><c-r>
:imap <c-s> <c-v><c-s>
:imap <c-t> <c-v><c-t>
:imap <c-u> <c-v><c-u>
:imap <c-v> <c-v><c-v>
:imap <c-w> <c-v><c-w>
:imap <c-x> <c-v><c-x>
:imap <c-y> <c-v><c-y>
:imap <c-z> <c-v><c-z>
:imap <c-@> <c-v><c-@>
:imap <c-\> <c-v><c-\>
:imap <c-]> <c-v><c-]>
:imap <c-^> <c-v><c-^>
:imap <c-?> <c-v><c-?>
i

Ekleme modundaki tüm kontrol karakterlerini <c-v>, ardından onları tam anlamıyla girecek olan kontrol karakterine yeniden bağlar . ^ _ (birim ayırıcı), varsayılan olarak tam anlamıyla çıktısı alındığından, yeniden bağlama işlemine ihtiyaç duymaz.

Değişken metin elbette sonunda gelir.

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.