Beklenmeyen işlevlere neden olan kaynak kodundaki boş bir satırın silinmesi [kapalı]


38

Program mantığının akışında boş bir satır bulunduğunda iyi çalışan bir komut dosyası yazın, ancak bu satır kaldırılırken beklenmeyen davranışlara neden oluyor veya kesiliyor.

Standart boşluklardan ve aptal cevaplardan kaçının . Programınız "kullanışlı" bir şey yapmalı, yapması gereken birkaç tamsayı eklemek olsa bile.

Çok satırlı bir diziden boş bir satırın çıkarılması, bu çok satırlı dizeden beklenen çıktının teknik olarak değişmemesi gerektiği sürece sayılmaz ^$.

Boşluk aptallığına da izin verilmez; satırbaşları, sekmeler, boşluklar vb. ile garip şeyler yapmayın.


11
Bence Whitespace'i dışlamalısın.
nneonneo

17
Ben Boşluk düşünüyorum olan bir " standart kaçamak "
core1024

5
nneonneo, sadece boşluklarını sözdizimi olarak kullanan bir dil olan Whitespace hakkında konuşuyor .
Kyle Kanos

4
"Beklenmeyen işlevsellik" çok iyi bir ifadedir.
Kaz

3
Bu soruyu konu dışı olarak kapatmak için oy kullanıyorum, çünkü bu konudaki aşikar zorluklar artık konu dışı. meta.codegolf.stackexchange.com/a/8326/20469
kedi

Yanıtlar:


62

JavaScript

"Merhaba, Dünya!" İle bir uyarı penceresi açar. Boş satır varsa, "0" uyarır.

(function(){
    alert(~(arguments.callee+[]).indexOf('\n\n') && "Hello, World!");

})();

gösteri

Açıklama:

arguments.callee Kendi kendine çalışan anonim işlev için bir başvuru.

Boş bir dizi ( []) eklemek, işlevi size kaynak kodunu veren bir dizgeye aktarır.

indexOf-1dize bulunamazsa döndürür .

Bir bit değil işlemi (Sahne ~) sonuçlanır -1dönüştürülmektedir 0bir Falsey değerdir.


2
Bu ne aldatmaca ?!
Kroltan

1
arguments.calleeişlevin kaynağını içerir.
Matthew,

2
Bunun artık katı modda (çoğu modern kodun kullanacağı) çalışmadığını unutmayın. Sıkı mod kullanımı yasaklar arguments.callee.
Daniel Lo Nigro

1
@Michael: Hayır, spec tam formatı hakkında hiçbir şey söylemiyor. Aslında , çevresinde çalışan beyaz boşlukları korumayan motorlar var.
Bergi

2
@DanielLoNigro Sadece fonksiyon ifadesine bir isim verebilir ve bunun yerine onu kullanabilirsiniz arguments.callee. Hatta daha da kısaltır.
Bir kedi,

42

C

Bu sihirli 8-top program hala boş bir çizgi olmadan çalışacak, ancak biraz daha belirleyici olacak - çıktıda tarafsız cevapların hiçbiri görünmeyecek.

#include <stdio.h>
#include <time.h>
#include <stdlib.h>
int main() {
  int x, t;
  char *quotes[] = {
        // Positive :-)
        "It is certain", "It is decidedly so", "Without a doubt", "Yes definitely", "You may rely on it",
        "As I see it, yes", "Most likely", "Outlook good", "Yes", "Signs point to yes",
        // Indifferent :-\

        "Reply hazy try again", "Ask again later", "Better not tell you now", "Cannot predict now", "Concentrate and ask again",
        // Negative :-(
        "Don't count on it", "My reply is no", "My sources say no", "Outlook not so good", "Very doubtful" };
  srandom(time(NULL)); // Initialize random number generator
  x = random() % (sizeof(quotes) / sizeof(char*)); // Choose a random outcome
  printf("The Magic Eight Ball says...\n%s\n",quotes[x]);
  return 0;
}

açıklama

C ayrıştırıcısı ve ardından yeni satır karakteriyle ters eğik çizgi göründüğünde, her ikisini de yok sayar ve ikinci satırı ilkinin devamı olarak değerlendirir. Boş satır olmadan, "kayıtsız" cevapların tümü önceki yorumun bir parçası olarak değerlendirilir.


51
Ben + 1'ledim, ancak ters eğik çizgiyle biten C yorumlarını görmek IMO'nun standart bir kaçağı olmaya başladı.
Tim S.

2
Bu "standart boşluklara" yazılan bir referansdı, bu yüzden kelimenin tam anlamıyla bir "boşluk" değil.
Tim S.,

5
@TimS. Bu "çözüm" ile sıkıldıysanız, neden affettiniz?
John Dvorak

8
Yorumun bir sonraki satırındaki ters eğik çizgi (trigraph veya trigraph yok) bana 125 ün kazandı. Onları görmeye devam ediyorum ve onlar fazlasıyla tekrarlanmaya, tamamen görünmeye başladı ve artık zeki ya da komik değiller. (Bu onları kullananlar için talihsizdir, burada ispinoz gibi, çünkü onlar hiçbir şekilde öfkeyi haketmiyorlar ve bazen bundan tamamen habersizler - ama hile onu kazanıyor.)
doppelgreener

4
@Jan standartlaşmaya başlaması uzun standart / fazla abartılı ile aynı değildir ... kullanımı burada oldukça zekicedir , yerin dışına bakmaz (gördüğümden farklı olarak, açıklanamayan karakterleri var) yorumun sonu veya sıra dışı bir şey yapmak için yorumlarını yorum başlangıç ​​karakterleriyle bitirin). Yani: Ben hileci kullanmaya devam değil çözümü, çözüm.
Tim S.

37

Befunge-93

v
&
&
+
#

.
@

İlk befunge programım :)

Girişten iki sayı okur ve toplamlarını yazdırır. Boş satırı silerseniz, hiçbir şey yazdırmaz.

Açıklama:

vKodun yürütülmesi için aşağı doğru bir yön
&atar bir tamsayı okur
+sayıyı toplar
#, bir sonraki komutu
.basarsa yığıntan bir tamsayı yazdırır
@program biter

Yazılı olarak, #boş hat ve contines üzerinde atlar .. Boş satırı sildiğinizde Satın ., atlanır.

Http://befunge.aurlien.net/ adresinde güzel bir tercüman var gibi görünüyor.


Ah, akıllıca.
seequ

1
Befunge 98 de bunu yapıyor. İyi düşünmek. Ve bu tercümanın bazı yararları var (seninkini fazla kullanmadım, bu yüzden faydalarını bilmiyorum).
Justin

32

Yakut / Shell

​​​​​​
#!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
#!   The Amazing Integer Adder             !
#! Adds 1 and 1, and displays the result   !
#!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

p 1+1

Yeni bir satır en üstte ise, iyi çalışır, aksi takdirde ilk yorum satırı kabuk tarafından hatalı biçimlendirilmiş bir shebang olarak yorumlanır.


3
Bu her zaman işe ya da işe yaramayacak mıydı? Örneğin, olarak çalıştırılırsa ruby youranswer.rbo yakut tercüman olmak koşmak zaten, çünkü bu bir shebang bakmak olmaz, ancak bunu ran eğer ./youranswer.rbo hiç aday olmayacağını .. hayır shebang olmadığından
Reinstate Monica

6
En azından benim yakutumla, Shebang onu çalıştırırsanız bile onurlandırılır ruby youranswer.rb; bu, dosyada gerekli komut satırı anahtarlarını ayarlamakta faydalı olabilir. Öyleyse ruby: no Ruby script found in input (LoadError)
anladığım

29

Scala

case class IntWrapper(i: Int)

{
  val answer = (IntWrapper(0) /: (1 to 100)){(x, y) => IntWrapper(x.i + y)} // Add up ints
  println(s"Sum of wrapped integers is $answer")
}

Boş çizgiyi kaldırırsanız, çıktı yazdırılmaz. Gerçekten aradıysanız, yığınınız taşacağından hangisi en iyisidir IntWrapper.

Bu, Scala'nın noktalı virgül çıkarımının bir köşe örneğidir. Normal olarak, yeni kodlar, elde edilen kod geçerli olduğunda ne kadar noktalı virgül alırlar? Bununla birlikte, Scala devs insanları Mısırlı parantez kullanmaya zorlamak istemedi , bu yüzden parantezleri hemen hemen bir sınıfa koymak için parantez koymak geçerli. Ancak, boş bir satır parantezleri sınıf tanımından boşaltır. Boş satır kaldırıldığında, kod bir sınıf tanımı ve bir blok olmaktan, bir yapıcı olan bir sınıf tanımına ve bu konuda özyinelemeli bir yapıcıya dönüşür!


6
Mısır Konsollarını zorlamamak çok hoş. Ancak noktalı virgül çıkarımı bence, kötü bir fikir.
Almo

Noktalı virgül çıkarımı, çoğunlukla JavaScript nedeniyle hatalı bir ad alır. Dili onunla birlikte düşünürseniz biraz daha az acı verir (örneğin kimse Python'da bundan şikayet etmez). Ne yazık ki Scala, noktalı virgül çıkarımı ile iyi oynamayan birkaç özellik içeriyordu. Bu ve postfix operatörleri var (ki cevabımda kullanmaya başlamıştım ama bu biraz pasifti).
James_pic

2
@James_pic: AFAIK, Python'da hiç şikayet etmiyor, çünkü Python'da yok. JS'de, noktalı virgüller sözdiziminin gerekli bir parçasıdır ve belirli noktalara eklenebilir (çıkarılabilir). Python'da, noktalı virgüller sözdiziminin gerekli bir parçası değildir, ancak isteğe bağlı olarak kullanılabilir. Bu büyük bir fark.
Mason Wheeler

Büyük bir fark gibi görünebilir, ancak Scala şu anda ifade sınırlarını belirsizleştiren birkaç özelliği kaldırırsa, JavaScript'in çitin kenarından Python'a geçecektir.
James_pic

1
@James_pic: Python'u farklı kılan şey, newline'ın kaçma veya herhangi bir parantez içinde olmadıkça ifadeyi sonlandırmasıdır. Tam / eksik bir kural yoktur.
Jan Hudec,

27

GolfScript

~{.@\%:

}do;

Sıfır olmayan iki tamsayının GCD'sini hesaplar. Boş çizgiyi kaldırmak programı keser.

Çevrimiçi deneyin.

Nasıl çalışır

Bu, Öklid algoritmasının bir GolfScript uygulamasıdır:

      # STACK: "15 24"
~     # Interpret the input string.
{     # STACK: 15 24
  .@  # Duplicate the topmost integer and rotate the other on top of both copies.
      # STACK: 24 24 15
  \   # Swap the topmost integers.
      # STACK: 24 15 24
  %   # Calculate the modulus.
      # STACK: 24 15
}do   # If the modulus is non-zero, repeat the loop.
;     # Discard the last modulus.

Sadece küçük bir problem var:

{}doGerçeği kontrol edip etmediğini kontrol etmek için modül yığıntan çıkar, bu yüzden döngünün sonunda çoğaltılmalıdır. Bu normal olarak gerçekleştirilir ., ancak :\n\naynı etkiye sahiptir: En üstteki yığın öğesini LF ( :\n) değişkeninde saklar , sonra bu değişkenin içeriğini iter.


7
Vay, hatta bu bir değişken mi? : O
aditsu

@aditsu: Yalnızca #, {ve }, değişken isimleri olarak kullanılan sözdizimi Onlar'olarak parçası olamaz. Dizeler dahil her diğer simge iyi.
Dennis,

@Dennis vay. TIL bile karakter dizileri değişken olarak kullanılabilir. Bu herhangi bir şey için faydalı mı?
John Dvorak

@JanDvorak: Bazı kenar durumlarının yanı sıra (palindromik kod, düşük kod , muhtemelen değil. Bunun GolfScript yorumlayıcısının kodu belirteçlere ayırmasının sadece ( belgelenmiş ) bir yan etkisi olduğunu düşünüyorum .
Dennis

@Dennis , eksi işaretini değil .:-1girişi girdiği anlamına -1mı geliyor? Hmm ...
John Dvorak

23

MediaWiki Şablonu Sözdizimi

Şablonu tanımla: Foo olarak

{{{a

b|Uh-oh!}}}

Başka bir sayfada

{{Foo|a

b=Works!}}  <!-- outputs "Works!" -->

{{Foo|a


b=Works!}}  <!-- outputs "Uh-oh!" -->

{{Foo|a
b=Works!}}  <!-- outputs "Uh-oh!" -->

MediaWiki'de parametre adları yeni satırlar içerebilir.


1
Güzel, bu aradığım şeyin sınırları boyunca, bunun gibi garip olaylar.
Naftuli Kay

16

LaTeX (backref)

Aşağıdaki LaTeX kodu bir alıntı kullanır ve alıntı, girişin atıldığı sayfaların bir listesini içerir. İşte ilk sayfa. Paket hyperrefayrıca PDF linkleri ekler, sayfa geri referansı kırmızı, alıntı link yeşildir.

\documentclass{article}
\usepackage[colorlinks,pagebackref]{hyperref}
\begin{document}
Donald E. Knuth is the inventor of \TeX~\cite{knuth}.
\begin{thebibliography}{9}
\bibitem{knuth}
Donald E. Knuth: \textit{The \TeX book}; Addison Wesley, 1984.

\end{thebibliography}
\end{document}

Sonuç

Ancak LaTeX, boş satırı gerektirmez, boş satır gereksiz görünür ve örnek hala hyperrefboş ve boş satır çalışır:

\documentclass{article}
\begin{document}
Donald E. Knuth is the inventor of \TeX~\cite{knuth}.
\begin{thebibliography}{9}
\bibitem{knuth}
Donald E. Knuth: \textit{The \TeX book}; Addison Wesley, 1984.
\end{thebibliography}
\end{document}

Hiperref olmayan sonuç

Fakat linkler ve geri referanslar gitti, bu yüzden onları tekrar yerleştirdik:

\documentclass{article}
\usepackage[colorlinks,pagebackref]{hyperref}
\begin{document}
Donald E. Knuth is the inventor of \TeX~\cite{knuth}.
\begin{thebibliography}{9}
\bibitem{knuth}
Donald E. Knuth: \textit{The \TeX book}; Addison Wesley, 1984.
\end{thebibliography}
\end{document}

Ancak şimdi örnek bozuldu ve artık derlenmeyecek :

Runaway argument?
 Donald E. Knuth: \textit {The \TeX book}; Addison Wesley, 1984. \end \ETC.
! File ended while scanning use of \BR@@bibitem.
<inserted text> 
                \par 
<*> knuth

?

Ne oldu? Paket hyperref(ya da backreftarafından yüklenen daha kesin paket hyperref), geri referans listesini eklemek için kaynakça girişinin sonunda almak istiyor. Ancak LaTeX'teki sözdizimi yalnızca girişin başlangıcını sağlar \bibitem, bitiş herhangi bir yerde olabilir. Bu acil durum paketinde girişi boş bir satırla bitirmek backrefzorunda \bibitemolan bir kısıtlama eklendi . Daha sonra paket \bibitemgeri referansları girişin sonuna koymak için yeniden tanımlayabilir .

Boş satır eksik olduğundan, TeX aramaya devam ediyor, ancak bunun yerine dosyanın sonunu buluyor ve hata mesajını veriyor.


12

C (yarı karışık)

Bu küçük program komut satırında bir sayı alır ve onun faktoringini hesaplar. Bununla birlikte, çalışma alanının doğrulanması için, beyaz alanın ve boş satırların doğru kullanımı da dahil olmak üzere şirketin kodlama standartlarına uyulduğunu doğrulayan AI işlevselliği de içermektedir. Boş bir satırın kaldırılması, yetersiz bakım yapılabilir programı reddetme algoritmasını tetikler.

Hiçbir yerde hiçbir satır devam veya trigraph yok. Bunun geçerli bir ANSI C99 olduğuna inanıyorum.

Dahil olan ileri matematik nedeniyle, eğer derlerseniz gcc, kullanmayı unutmayın -lm.

#include <setjmp.h>
#include <stdio.h>
#define max(x,y) ((x<y?y:x))
#define swap(x,y) ((x^=y,y^=x,x^=y))
#include <stdlib.h>
#include <math.h>
#define vfry(x,p,z,y,i) (!!y&((z##z##L##I##p##x##z##z)))
#define NDEBUG

/* 
 * Proper use of whitespace is essential!
 * Please do not remove any blank lines.
 */

const double E = 2.71828182845904523536;

int vrfy(double epsilon, int magic, const char *key, long int L) {
  /* You are not expected to understand this */
  double x=284.2891,u=2.34e56;
  while (rand()+magic*pow(epsilon,sin(x-E))!=log(u*L))
    x*=vrfy(1.0/epsilon,(int)u,&key[swap(L,magic)],L++);
  return u/lgamma(x);
}

int main(int argc, char *argv[]) {
  int N_=831293812; /* do not change, see Knuth 1987 */
  if (!vfry(E, N,_, "M=&;VT=I!9", 0xfe86ddcaL)) {
    fprintf(stderr, "Code standards violation detected!\n");
    abort();
  }
  if (argc < 2) {
    fprintf(stderr, "Usage: %s n\nComputes n!\n", argv[0]);
    exit(1);
  }
  int m=1, n=atoi(argv[1]), i;
  for (i=1; i <= n; i++)
    m *= i;
  printf("%d! = %d\n", n, m);
  return 0;
}

Bir şeyin önceden reklamı

Karmaşık vrfyfonksiyon asla çağrılmaz, aksine komik görünümlü vfrymakro. Önişlemcinin dizgi birleştirme özelliğinin kullanılması, yalnızca paritenin denetlendiği gerçeğini gizler __LINE__.


Ayrıcatcc -run
Vi

Bu gerçekten temiz. Bu vfryişlev tanımı genişletilmiş değil gerçekten beni güdük.
FUZxxl

11

C

Bu program, beklendiği gibi çalışır (açıklamalarda açıklandığı gibi), önceki boş satır foo = 5;kaldırılmazsa.

Ne yazık ki, bir kez üretim kodunda neredeyse tamamen böyle bir hatayla karşılaştım.

#include <stdio.h>

int main()
{
    int foo = 0;

    #define FROB(x) do {                                            \
        x++;                                                        \
        printf("%d\n", x);                                          \
    } while (0);                                                    \

    foo = 5;
    FROB(foo); /* prints 6 */
    FROB(foo); /* prints 7 */
    FROB(foo); /* prints 8 */

    return 0;
}

Bu örnek do { ... } while (0)bir makroda çok satırlı bir ifade oluşturmak için deyimi kullanır (bkz. Https://stackoverflow.com/questions/257418/do-while-0-what-is-it-good-for ). Aynı zamanda #definebirden fazla çizgiye yaymak için ters eğik çizgi karakterini kullanır ve rahatça gözden geçirilebilir. Ancak, aynı zamanda iki şeyi yanlış yapar:

  • Sonra bir noktalı virgül var, while (0)deyim ise genellikle bunu ihmal ediyor
  • Son satırından sonra bir ters eğik çizgi var. #define

Bu yerinde, boş satırın daha önce kaldırılması, foo = 5;bu atama işleminden sonra ve printfayrıca makroyu her başlattıktan sonra yürütülmesine neden olur FROB. Sonuç olarak, boş satırı çıkardıktan sonraki çıktı:

1
6
6


@TheRare Ama bu daha az belirgin.
Ypnypn

6
Çok belirgin bir şekilde sağa doğru kayan ters eğik çizgilere bakmazsanız daha az belirgindir. (Ama orada çok dikkat çekici bir şekilde sağa doğru
yüzdükleri için, bakacaklar

3
Ancak, bunlardan biri
dışındaki

6
@QuadmasterXLII, teknik olarak konuşursak, hepsi haklı - haklı, kesin.
Mark

9

C / C ++

int main(){

    return __LINE__ - 3;
}

Başarı döndürür ve true için bir uygulama olarak kullanılabilir . Boş satır kaldırılırsa, false yerine bir uygulama olarak kullanabilirsiniz .


8

Güç kalkanı

Bu fonksiyon iki sayı ekleyecektir.

function add ($a, $b) {
    $numbers = @($a `

            $b)
        $numbers| measure -sum| select -expand sum
}

Boş çizgiyi kaldırmak, fonksiyonun başarısız olmasına neden olur: Unexpected token '$b' in expression or statement.

açıklama

Dizi öğeleri newlines ve / veya virgüllerle ayrılabilir. Satır devam karakteri (yerleştirme `) sonra $aayrılması için ek bir yeni satır gerektirir $ave $b. Aksi takdirde, tercüman kodu $numbers = @($a $b)(eleman ayırıcı yok) olarak görüntüler.


7

TeX

\noindent\everypar{$\bullet$ hello }

world
\bye

Boş satır olmadan "merhaba" yazdırılmaz.

açıklama

TeX boş satırı bir paragraf sonu olarak değerlendirir ve \everyparyeni bir paragrafın başlangıcında yürütülür.


6

Java

import java.util.Scanner;

public class BlankLine
{
    public static void main( String[] args )
    {
        //This calculates 2^ given number
        //if you remove blank line after the next line it will always print 1
        int x = new Throwable().getStackTrace()[0].getLineNumber();

        int y = new Throwable().getStackTrace()[0].getLineNumber() - x;
        System.out.println("Number:");
        Scanner scanner = new Scanner(System.in);
        int r = 1;
        int n = scanner.nextInt();

        for(int i = 0; i < n; i++){
            r *= y;
        }
        System.out.println("2^number: "+r);
    }
}

x geçerli satır numarası, y geçerli satır numarası - x. Aralarında boş satır varsa sonuç 2 olur. Kod 2 ^ sayısını hesaplar.


1
+1 basitçe Java olduğundan, Kod İnceleme sık ziyaretçisi olmasına rağmen neden kullanmadığınızı merak ediyorum Math.pow?
Simon Forsberg

Çünkü kodum bir şeyler yapmalı. 2 sayı eklemek biraz fazla basit.
barteks2x

Math.powSonuç kullanmak ve yazdırmak da bir şeyler yapmak değil mi?
Simon Forsberg

Ve şimdi gerçekten kullanabileceğimin farkına vardım.
barteks2x

7
Çok fazla golf oynadın. Doğru yaptığımız şeylerin yerine Kod İncelemeyi ziyaret etmelisin !
Simon Forsberg

6

Perl 5

print(<<""
Hello, World!

);

Bu kod yazdırılır Hello, World!. Boş satırın kaldırılması bunun yerine bir sözdizimi hatası veriyor.

Açıklama:

Perl'in çok satırlı dizgiler için here-doc sözdizimi , boş bir sonlandırıcı dizeye izin verir. Hatta açıkça belgelenmiştir. Boş satırın kaldırılması, parantezin kapanmasına (ve eğer varsa bir sonraki boş satıra kadar olan her şey) dizenin bir parçası olarak yorumlanmasına ve sözdizimi hatasına neden olur.

Aldığınız hata mesajları, böyle garip bir sözdizimi özelliği için oldukça iyi. Programda satır sonunda hiç boş satır yoksa print(<<"", Perl der ki:

Foo.pl satır 1'de EOF'dan önce "" string terminator bulamıyor.

Program sonunda boş bir satır varsa , bunun yerine böyle bir şey alırsınız:

foo.pl. satır 4, EOF'ta sözdizimi hatası
  (1. satırdan başlayarak kaçak bir çok satırlı << dize olabilir)
Derleme hataları nedeniyle foo.pl uygulaması durduruldu.


5

Grup, yığın, parça, bir defada alınan miktar

@echo off
setLocal enableDelayedExpansion
set NL=^


echo Hello!NL!World

Bu kod bir Hellosonraki satırda çıkacaktır World. Boş satırlardan biri veya ikisi kaldırıldığında, hiçbir şey çıkarmaz.

Burada bir açıklama var .


4

Yakut

İlk satırın silinmesi hataya neden olur:

line = IO.readlines($0).first.chomp if line.empty? puts 34+4 else raise "Please add a newline at the beginning of the program." end

2
Hata mesajını seviyorum. Programı çalıştırmaya çalışan ve bu cevabı alan birinin tepkisini görmek istersiniz.
21:14

4

piton

Bunun standart boşluklara düşüp düşmediğini bilmiyorum, listeye baktım ve görmedim.

src = open(__file__, 'r')
code = src.readlines()
src.close()

if code[3] == '\n':
    print 'Hello World!'

Bu düzenli çalıştırma geri döner

Hello World!

4. satırdaki boş satır olmadan çalıştırılması, örneğin aşağıdaki gibi:

src = open(
__file__, 'r')
code = src.readlines()
src.close()
if code[3] == '\n':
    print 'Hello World!'

hiçbir şey döndürmez.


3

Python 2.x

Bu program girilen dizenin beşinci karakterini gösterir.

import inspect

text = raw_input()
print 'Fifth character of the string:', text[inspect.getlineno(inspect.currentframe())]

Bu hiçbir şekilde gizli değil. Boş satırı kaldırırsanız, dördüncü karakter, bir tane eklerseniz altıncı karakter verir.


3

Tcl

İki sayı ekleyen bir işlev (ve yeni satırın silinip silinmediğini kontrol eder):

proc add {a b} {
    if {[llength [split [info body add] \n]] < 5} {error "function has been modified"}

    return [expr $a+$b]
}

Burada saklanacak hiçbir şey yok, söylediğini yapıyor, bu yüzden açıklamayı bozmayacağım. İşlev info, İsviçre'deki bir iç gözlem bıçağı bıçağıdır (başka dillerin de yansıma dediği şey). info bodyBir işlevin kaynak kodunu döndürür (C veya mecliste yazılı değilse).

Javascript çözümünü görene kadar bunun beni güttüğünü itiraf etmeliyim.


3

C

#include <stdio.h>


int main() {
    const char* a = "You love blank lines.";
    #define print_out(a) \

    printf("%s\n", a);
    a = "You don't seem to love blank lines";
    print_out(a);
    return 0;
}

Boş satırla ayerel değişken adır ve makro parametresi olmadan ...


3

Teknik olarak "kod" sorunu değil, sunucu sorunu. Bu bir CGI betiğinden Apache'ye gönderilirse (lütfen istediğiniz herhangi bir dilde oluşturulabilir), istemciye bir HTTP yanıtı gönderir:

HTTP/1.x 200 OK 
Content-Type: text/html; charset=UTF-8

Hello world!

Öte yandan, başlıktan sonraki boş alanı bulamadığı için başarısız olur.

HTTP/1.x 200 OK 
Content-Type: text/html; charset=UTF-8
Hello world!

2

JavaScript

İşlev whereami, kaynak koddaki kendi konumuna göre çağıran hattın konumuna yanıt verir.

console.log (whereami ()) //3 line(s)  before me 


function whereami () {
    var a=function a(e){try{to}catch(c){for(var d=c.stack.split("\n"),b=0;b<d.length&&!~d[b].indexOf("a");b++);return c.stack.split("\n")[b+~~e].match(/:(\d+)/)[1]-~~window.hasOwnProperty("__commandLineAPI")}},a1=a(1),i


    i= a(2)>a(1)+4?a(1):a(1)>a1+2?a1-1:a/a1



    return ((i=(a(2)<i?i-1:a(1)>i+3?a(2)-a(1)-1:a/1)) + " line(s) "   ) + (i<a(2)?" after":(i>=a(2)?" before":"confusing")) + " me";
}


console.log (whereami ()) //3 line(s)  after me

İşlevdeki herhangi bir boş satır whereamikaldırılırsa. Çıktı NaN line(s) confusing me. (Satır eklemek bunu bozmaz)

Aslında sadece isırasıyla ilk ve son satır arasında kaç satır olduğunu sayar . Belirli bir değerin altına düşerlerse. Referans çizgisi, NaNne tatmin edici NaN<callingLinene de uygun değildir NaN>=callingLine. Okunamayan üçlü ifadelerde biraz saklamaya çalıştım.


1
Güzel. Böyle istisnalar yığını kullanmayı düşünmemiştim.
nderscore

2

Perl

#!/usr/bin/perl

use strict;
use warnings;

open IN, "<".$0 or die "Did not find input files!";
while (<IN>) {
        m/blabla/ && ((<IN> =~ /\}/ && print "tra-la-la...\n") || print "ti-ri-li\n");

}
close IN;

Bu perl betiği betiği okuyacak ve "blabla" içeren satırın kapanış dirseği olup olmadığını kontrol edecektir.


2

Escript

escriptUygulamadaki hatalardan dolayı geçerli escript en az üç satır uzunluğunda olmalı ve ilk satır o satır veya boş satır olmalıdır. Dolayısıyla, aşağıdaki betiğin, birincisinin birincisi olması gereken iki boş satır olması gerekir:

main(_) -> io:format("Hello world!~n", []), halt().

Ya da iki satırda kesilmek zorunda kalıyor ancak yine de ilk boş satırın olması gerekiyor.

main(_) ->
    io:format("Hello world!~n", []), halt().

Aksi takdirde alacaksın

escript: Premature end of file reached

2

Yakut

print %q
2+2=

p(2+2)

Yazdırılıyor 2+2=4, ancak boş üçüncü satır olmadan bir sözdizimi hatası veriyor. %qherhangi bir kelime dışı karakterin, yeni satır karakteri bile bir dize sınırlayıcı olarak kullanılmasına izin verir. Yani ilk üç kod satırı aslında print %q"2+2="ya da sadece eşdeğerdir print "2+2=". Sonrasındaki yeni satır 2+2=bir alıntı sınırlayıcı olarak kullanıldığından, aynı zamanda bir satır sınırlayıcı olarak ayrıştırılmaz , bu nedenle derhal bir başkasına ihtiyacınız vardır.


1

Uykusuzluk (her iki versiyonda)!

Þyoo

â

Bu kod bir ~ basar (neden diye sormayın, uykusuzluk gariptir). Boş çizgiyi kaldırırsanız, bunun yerine ÿ yazdırır.

Bu arada ilk harf bir diken .


1
Yaşasın, dikenler! Bu karakteri uzun zamandır görmedim, +1.
Addison Crump

0

C ++

Bu klasik ve aptal bir numara. Gördüğünüzde ne olduğunu bileceksiniz, bu sadece tamamlanma uğruna burada. Bu nedenle, bunu bir topluluk wiki cevabı olarak işaretliyorum.

int main() {
    //This program won't work without the next line, why??/

    return 1;
}

Bu neden çalışıyor


13
Bu aslında boşluklardan biridir.
Mhmd

@ Mahdd farkında değildim. Her iki durumda da, insanların bu tür sorularda her zaman bunu kullandıklarını biliyorum ve bunu sadece burada bırakmak istedim, böylece birileri bunu yapmak için akıllıca bulmazdı.
Aearnus

1
Bu cevap iki nedenden dolayı yanlıştır. İlk olmasıdır ??/aracı \​, böylece ??//aracı \/ve çizgi bitmez olarak \​, bir satır devam yoktur. İkincisi, davranışın yürütülmesine bakılmaksızın tam olarak aynı return 0;olmasıdır, çünkü yürütmenin mainkapanışına ulaştığında standart davranıştır }.
hvd

@ hvd İşte. Onardım.
Aearnus

3
@cra I know people always use this in these kinds of questionbu yüzden standart bir kaçamak yaptık
undergroundmonorail

0

Bunu bir html dosyasına yapıştırın ve tarayıcınızda açın. Oldukça basit, ama biraz zor, çünkü belgedeki boş satırların sayısını alır ve bir uyarı gösteren bir işlevi çağırmak için bir dizini dizine ekler.

<body>
<script>
[null, function(){alert("GIVE ME MY LINE BACK")}, function(){alert("2 + 2 = " + (2+2))}][document.body.innerHTML.split("\n\n").length]()

</script>
</body>

Bu sınır çizgisi kurallarını ihlal ediyor. Teknik olarak JavaScript'te çoklu satır dizeleri yoktur, bunun tek nedeni budur.

Diğer script etiketlerine müdahale etmeden bir script etiketinde bir sözdizimi hatası yaşayabileceğiniz için bu, yalnızca sayfada bir hata olması durumunda olumlu bir sonuç gösterir. Hata aynı alarm etiketinde olduğu için ikinci uyarının ateşlenmesini önler.

<body>
<script>
window.onerror=function(){
  alert("2 + 2 = " + (2+2));
}
</script>
<script>
var a = "\

";
alert("GIVE ME MY LINE BACK!");
</script>
</body>

0

Yakut

puts (% #{ARGV[0].to_i + ARGV[1].to_i}

)

İşin sırrı, yeni satırın gerçekten bir sekme, ardından yeni bir satır olmasıdır. Bunun önemli olup olmadığını bilmiyorum ama bunun açık olduğunu sanıyordum. Ondan sonraki karakter %de bir sekmedir, ancak bir nedenden ötürü görünmez. Ruby'nin yüzde gösterimini, dizeye ilk 2 argümanı ekleyen bir dize yapmak için kullanıyorum. Burada daha fazlası var: http://teohm.com/blog/2012/10/15/start-using-ruby-percent-notation/


Aslında sayılmaz, talimatları okuyun: "Boşluk aptallığı yok." Tam olarak bir kişi \nmevcut olmalı ve programın beklendiği gibi çalışmasını sağlamak için çok önemlidir.
Naftuli Kay

Ah tamam :( iyi denedim
addison

1
Bununla birlikte, bunu düzeltebileceğinizi düşünüyorum: bir yeni satırın kendisi yüzde sınırlayıcı olabilir.
histocrat
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.