เขียนบรรทัดในโปรแกรมที่ดูไร้ประโยชน์ [ปิด]


26

เขียนบางโปรแกรม (ขนาดไม่สำคัญ) และใส่บรรทัดที่ดูไร้ประโยชน์ แต่จริง ๆ แล้วไม่ใช่ - ถ้ามันถูกลบออกไปโปรแกรมจะหยุดทำงานหรือทำสิ่งผิดปกติ อย่าลังเลที่จะทำเครื่องหมายบรรทัดที่ดูไม่ได้ใช้โดยความคิดเห็นหรือกล่าวถึงคำอธิบายรหัสของคุณเช่นในตัวอย่างด้านล่าง (แน่นอนในตัวอย่างนี้บรรทัดไม่จำเป็นจริง ๆ แล้วมันเป็นเพียงตัวอย่าง)

int main(void) {
    /* The line below is actually needed. */
    2 + 2;

    return 0;
}

เนื่องจากนี่คือการประกวดความนิยมการแก้ปัญหาด้วยคะแนนโหวตสูงสุดจะเป็นผู้ชนะ


2
เหตุใดบรรทัดในตัวอย่างจำเป็น?
Gari BN

3
@GariBN ไม่ใช่: "ในตัวอย่างนี้ไม่จำเป็นต้องใช้บรรทัดจริง ๆ เป็นเพียงตัวอย่าง"
elixenide

9
@EdCottrell ดีใจที่ได้ทราบ ... ฉันคิดว่าฉันพลาดบางสิ่งพื้นฐานไปแล้ว ...
Gari BN

2
ดังนั้นมันจึงเป็นสิ่งจำเป็น สำหรับตัวอย่าง :-)
Florian F

1
ฉันลงคะแนนให้ปิดคำถามนี้เป็นหัวข้อนอกเพราะความท้าทายที่ไม่ได้อยู่ในหัวข้อบนเว็บไซต์นี้อีกต่อไป meta.codegolf.stackexchange.com/a/8326/20469
cat

คำตอบ:


33

C

int main(int argc, char **argv) {
    switch(argc) {
        case 2:
            ;
            int allowed = 0;
        case 3:
            argc--;
            break;
        default:
            argc = 3;
    }
    return 0;
}

;จะไม่รวบรวมถ้าเราเอาเดียว

แก้ไข :

วิธีแก้ไขด้านล่าง:

สิ่งนี้เกิดขึ้นเพราะcaseคำแถลงเป็นเพียงฉลากและตามด้วยคำสั่ง (ซึ่งมาตรฐานอ้างถึงว่าเป็น "ตัวระบุสำหรับการกระทำที่จะดำเนินการ" ซึ่งออกกฎการประกาศ) เพื่อป้องกันไม่ให้เรานำหน้าการประกาศกับ;เป็นคำสั่ง null ข้อมูลจำเพาะสำหรับcaseฉลากสามารถพบได้ที่นี่ได้ที่หน้า 142 (131 ในเอกสาร)


4
GCC กล่าวว่า "ฉลากสามารถเป็นส่วนหนึ่งของคำสั่งได้และการประกาศไม่ใช่คำสั่ง"
Vortico

1
ฉันถูกกัดโดยสิ่งนี้ในโปรแกรมที่ฉันเขียนเพื่อโรงเรียน
Kevin - Reinstate Monica

สิ่งนี้ทำให้โปรแกรมจริงดูน่าเกลียดจริง ๆ : \
วาลพูดว่า Reinstate Monica

23

C / C ++

เพียงแค่เขียนโค้ดในรูปแบบของการแนะนำ / การสอน ...

บทช่วยสอน 2 : อ่านตัวเลขดำเนินการทางคณิตศาสตร์กับพวกเขาและพิมพ์ผลลัพธ์

//////////////////////////////////////////////////
///////////////////////////////////////////////////
/////                                            //
/////           T  U  T  O  R  I  A  L           //
/////                                            //
///////////////////////////////////////////////////

#include "stdio.h"

int main()
{
    ///////////////////////////////////////////////
    // Local variables (int means integer!!)      /
    int a, b, result;

    ///////////////////////////////////////////////
    // Reading them in                            /
    scanf("%d", &a);
    scanf("%d", &b);

    ///////////////////////////////////////////////
    // Performing an operation, e.g. addition!!!  /
    result = a+b;

    ///////////////////////////////////////////////
    // Why is the next line absolutely mandatory??/
    result = 42;
    printf("The result is: %d", result);

}

การลบเส้น result = 42;ที่มองอย่างรวดเร็วครั้งแรกนั้นมีทั้งความฟุ่มเฟือยและเมื่อพิจารณาถึงวัตถุประสงค์ที่ระบุไว้ผิดพลาดจริง ๆ แล้วจะทำให้โปรแกรมไม่ทำตามที่คำอธิบายระบุไว้

ทำไม?

Trigraphs ตีอีกครั้ง! ?? /จะถูกแทนที่ด้วยตัวประมวลผลล่วงหน้าด้วย\ซึ่งจะเชื่อมต่อบรรทัดถัดไปในความคิดเห็น ผล = 42; กลายเป็นส่วนหนึ่งของความคิดเห็นดังนั้น "บันทึก" สายการพิมพ์ ด้วยผลลัพธ์ = 42; ลบบรรทัดบรรทัดprintfจะถูกกลืนโดยความคิดเห็น คอมไพเลอร์บางคนอาจให้คำเตือนหรือทริกเกอร์อาจถูกปิดเป็นค่าเริ่มต้นและจะต้องเปิดใช้งานเพื่อให้ตัวอย่างนี้ทำงานได้ การไฮไลต์ไวยากรณ์อาจหักหลัง แต่ก็มีคอมไพเลอร์และ IDE ที่อยู่รอบตัวคุณ


อย่างน้อยใน gcc คุณต้องระบุว่าคุณต้องการใช้ trigraph โดยการเพิ่มการตั้งค่าสถานะนี้ (-trigraphs) หากไม่มีสิ่งนี้ gcc จะเพิ่มการเตือนและละเว้น trigraphs
Gari BN

4
ทำได้ดีนี่! ฉันดีใจที่ฉันไม่ได้เลื่อนลงมาก่อนที่จะคิดออก คุณสามารถเปลี่ยน blockquote ของคุณลงในข้อความสปอยเลอร์โดยเริ่มต้นด้วยแทนเพียง>! >
ossifrage คลื่นไส้

@squeamishossifrage: ขอบคุณนี่เป็นความตั้งใจดั้งเดิมของฉันฉันใช้>!ไม่ได้ในทุกบรรทัด ฉันแม้ว่าพวกเขาจะไม่แสดงให้ฉันในขณะที่ฉันเขียนพวกเขา ที่น่าสนใจ SE parser ไม่ได้ทำให้เสีย :)
vsz

1
ฉันรู้ว่ามีอะไรบางอย่างที่ไม่เหมาะสมเกิดขึ้นตอนที่สองที่ฉันเห็นรวมถึงท้องถิ่น"stdio.h"แทนที่จะเป็นห้องสมุดจริงรวมถึง<stdio.h>
Braden ที่ดีที่สุด

1
ช่วงเวลาที่ฉันเห็นความคิดเห็นที่ฟุ่มเฟือยที่ฉันพูดออกมาดัง ๆ ว่า "Trigraph ของที่ไหน? จะต้องมีสิ่งกระตุ้น - อานั่นก็คือ"
แมว

19

ช่องว่าง

น่าเสียดายที่ฉันไม่สามารถแสดงโปรแกรมของฉันที่นี่เพราะ StackExchange ตัดช่องว่างต่อท้ายทั้งหมด เช่นเดียวกับ pastebin.com และ pastie.org ดังนั้นฉันจึงไม่สามารถลิงก์กับมันได้

แน่นอนว่าโปรแกรมทั้งหมด “ ดูไร้ประโยชน์” แต่ถ้าคุณลบบรรทัดใด ๆ มันจะทำอะไรที่แตกต่างออกไป


41
แต่โชคดีไม่มีอะไรที่มีค่าจะหายไปเพราะภาษาทั้งหมดจะไร้ประโยชน์ :-)
ossifrage คลื่นไส้

1
@Timwi แล้วกล่อง "data paste data" ล่ะ?
Braden ที่ดีที่สุด

1
@ Timwi ฉันเพิ่งทดสอบที่นี่และฉันเห็นสิ่งที่คุณหมายถึง แต่ถ้าคุณใส่ข้อความที่ไม่ใช่ช่องว่างข้อความจะส่งและข้อมูลการวางแบบดิบจะไม่ถูกแตะต้อง เช่นคุณสามารถใส่บรรทัดพิเศษที่พูดว่า "คัดลอกข้อมูลวางดิบและลบบรรทัดนี้"
Braden Best

8
แทนที่ \ t ด้วย t แทนที่ "" ด้วย s, แทนที่ \ n ด้วย n
Cruncher

7
เล่นพิเรนที่ดีที่สุด: โพสต์สิ่งที่ไม่เขียนโค้ด
Kaz Wolfe

9

JavaScript:

for (var a = 0, b = 4; ++a < b; a++)b+-

2 + 2; // This line is needed, or it will alert twice!
alert(a);

เหตุผลที่มันเป็นเพราะร่างกายของforมันคือb+-ไม่ใช่b++หรือb--; ดังนั้นถ้าคุณลบบรรทัดที่จำเป็นก็จะเพิ่มมูลค่าของb-alert(a)


"มันจะเพิ่มbมูลค่าของalert(a)" ดังนั้นไม่ควรb+-จะเป็นb+=?
Gaurang Tandon

@GaurangTandon ไม่; ความคิดก็คือว่ามันมีลักษณะเหมือนหรือb++ b--
แปรงสีฟัน

b + - actualy หมายถึงอะไร
Mhmd

5
b + -2 + 2@ user689 นั่นเป็นเหตุผลที่คุณจะลบบรรทัดที่มีก็ประเมิน2 + 2; b + -alert(a);
แปรงสีฟัน

8

C:

#include <stdio.h>
#include <string.h>

int main() {
    int i,sum;
    char s[4];

    /* Add all the integers < 1000 that contain no '0' or '9' */
    sum=0;
    for (i=0; i<1000; i++) {
        sprintf(s,"%d",i);
        if (strchr(s,'0')) goto skip;
        if (strchr(s,'9')) goto skip;
        sum += i;
      skip:
        i = i; /* Don't delete this line! */
    }
    printf("The answer is %d\n",sum);  /* <<< Should be 258948 */
    return 0;
}

หากคุณลบบรรทัดi = i;รหัสจะไม่ทำงาน นี้เป็นเพราะ...

... ในความเป็นจริงมันจะไม่ได้รวบรวม ตามมาตรฐาน C ฉลากเช่นข้ามในตัวอย่างข้างต้นจะต้องเชื่อมโยงกับคำสั่ง แม้แต่เซมิโคลอนเดียวก็พอเพียง แต่ถ้าคุณลบทั้งบรรทัดดังนั้นเลเบลจะไม่มีคำสั่งที่เกี่ยวข้องและการคอมไพล์ล้มเหลว คำตอบนี้อธิบายรายละเอียดเพิ่มเติมอีกเล็กน้อย


7

APL

นี่คือฟังก์ชัน APL:

i_←{
  ⍺←⎕IO ⋄ ⎕IO←⍺
  ⍵⍴⍳×/⍵
}

มันทำสิ่งเดียวกับ monadic ของ J i.:

      i_ 5 5
 1  2  3  4  5
 6  7  8  9 10
11 12 13 14 15
16 17 18 19 20
21 22 23 24 25

สามารถใช้อาร์กิวเมนต์ซ้ายที่เป็นทางเลือกซึ่งให้อ็อฟเซ็ต:

      0 i_ 5 5
 0  1  2  3  4
 5  6  7  8  9
10 11 12 13 14
15 16 17 18 19
20 21 22 23 24

บรรทัด⍺←⎕IO ⋄ ⎕IO←⍺ดูไร้ประโยชน์ ("กำหนด⎕IOให้จากนั้นกำหนดให้กับ⎕IO") แต่ส่วนแรกจะทำงานหากไม่มีข้อโต้แย้งที่เหลืออยู่เท่านั้นดังนั้นในความเป็นจริงมันจะทำอะไรบางอย่าง:

  • ถ้าไม่มีจะได้รับการตั้งค่าไปที่ ⎕IO(ทั่วโลก)
  • set (local) ⎕IOเป็น

7

C #

Func<int, int> fibo;
fibo = null; //Note that this can be set to *any* Func<int, int> reference.  It doesn't matter.
fibo = x => x < 1 ? 1 : fibo(x-1) + fibo(x-2);

fiboต้องกำหนดตัวแปรก่อนที่คุณจะสามารถใช้ภายในแลมบ์ดาได้แม้ว่าคุณจะกำหนดแลมบ์ดาfiboนั้นให้กับตัวเองก็ตาม หากคุณลบการมอบหมาย (ดูเหมือนไร้ประโยชน์) ข้อผิดพลาดของคอมไพเลอร์จะเกิดขึ้น (“ การใช้ตัวแปรโลคอลที่ไม่ได้กำหนด 'fibo'”)


มันไม่ใช่ข้อยกเว้นอ้างอิง null มันเป็นข้อผิดพลาดของคอมไพเลอร์ตัวแปร นอกจากนี้ควรย้ายการประกาศไปยังบรรทัดของตนเองเพราะการประกาศนั้นไม่มีประโยชน์
เคนดัลล์เฟรย์

@KendallFrey จุดดี! คงที่
Ben Reich

5

ชุด Windows:

echo hello
pause
echo world

ตั้งค่าโปรแกรมให้ทำงานและแก้ไขไฟล์เป็น:

rem test01
pause
echo hello world

หากคุณลบหรือปรับขนาดความคิดเห็นมันจะทำให้เกิดความเสียหายเป็นอินสแตนซ์ที่ 1 ของโปรแกรมหยุดชั่วคราวและจากนั้นตีความต่อจากไบต์ที่ 19 เป็นต้นไป


ฉันไม่เห็นความคิดเห็นใด ๆ
orion

4
REM (คำพูด) เป็นผู้ดำเนินการความคิดเห็น - stackoverflow.com/questions/11269338
OJW

4

ชวา

package stackexchange;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

public class Curl
{
    public void getUrl(String address)
    {
        try {
            URL url = new URL(address);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setRequestMethod("GET");
            BufferedReader input = new BufferedReader(new InputStreamReader(conn.getInputStream()));

            /* don't remove this line! */
            http://codegolf.stackexchange.com

            while( true ){
                String line = input.readLine();
                if( line==null ) break http;
                System.out.println(line);
            }

            input.close();

        } catch(IOException ex){
            // ignore.
        }
    }

    public static void main(String[] args) {
        Curl curl = new Curl();
        curl.getUrl("http://codegolf.stackexchange.com");
    }
}

มันเป็นโปรแกรมที่ทำงานที่ดึงหน้าเว็บจาก URL คุณอาจจะแปลกใจว่าสาย

            http://codegolf.stackexchange.com

รวบรวมโดยไม่มีแม้แต่คำเตือน ความจริงแล้วโปรแกรมไม่ได้คอมไพล์ถ้าไม่มีมัน

มันเป็นจริงฉลากตามด้วยการแสดงความคิดเห็นhttp: //codegolf...เลเบลใช้กับขณะและใช้ในbreak http;คำสั่ง


1
โปรดอธิบายหน่อยสิหรือฉันจะลบบรรทัดนั้นไม่ว่าคุณจะพูดอะไร
Bill Woodger

3

ทับทิม

require 'prime'

# Given a regular expression, return the smallest prime containing it
# and the substring of the prime that matches it
def smallest_prime_matching_regexp(regexp)
  match = 'this assignment is necessary even though the value is never used'
  prime = Prime.find { |n| match = n.to_s[regexp] }
  return prime, match
end

[ /4/, /1+2/, /[02468]{2,}/ ].each do |regexp|
  prime, match = smallest_prime_matching_regexp(regexp)
  puts "#{regexp.inspect}:\t#{prime} (#{match})"
end

สิ่งที่คล้ายกันเกิดขึ้นเมื่อไม่นานมานี้ - ผู้ร่วมงานตั้งค่าสถานะการเริ่มต้นที่ไม่จำเป็นของฉันในระหว่างการตรวจสอบโค้ดและฉันถูกล่อลวงให้ใส่คำอธิบายในบล็อกสปอยเลอร์ ดังนั้นฉันจะทำที่นี่

จำเป็นต้องใช้บรรทัดเนื่องจากตัวแปรที่เริ่มต้นภายในบล็อกนั้นเป็นแบบโลคัลสำหรับบล็อกนั้น หากเราเริ่มต้นมันนอกบล็อกแล้วค่าจะสามารถหลบหนีไปยังขอบเขตวิธี

ผลผลิตตามที่เป็นอยู่:

/4/:    41 (4)
/1+2/:  127 (12)
/[02468]{2,}/:  223 (22)

เอาท์พุทที่มีบรรทัดแรกของวิธีการลบออก:

ตัวแปรโลคัลหรือเมธอด `match 'ที่ไม่ได้กำหนดไว้สำหรับ main: Object (NameError)


1
มันค่อนข้างชัดเจนว่าทำไมถึงต้องการ ... และต่อไปวิธีที่ดีกว่าในการเขียนนี้จะเป็นเพียงmatch = Prime.find { |n| n.to_s[regexp] }
Doorknob

1
นั่นจะไม่ทำสิ่งที่ฉันต้องการ ... Prime.findส่งคืนn(เช่น 223) และmatchต้องเป็นn.to_s[regexp](เช่น "22") เห็นได้ชัดว่าฉันวางแผนปัญหาที่จะทำให้ที่จำเป็น
ประวัติศาสตร์

โอ้ขอโทษไม่ได้สังเกตเห็นว่าคุณกำลังเรียกfindบนPrimeและไม่อาร์เรย์ อย่างไรก็ตามมันก็ค่อนข้างง่ายที่จะสังเกตเห็นว่าเหตุใดจึงจำเป็นต้องใช้บรรทัดนั้น ...
Doorknob

ยุติธรรมพอสมควร บางทีเพื่อนร่วมงานของฉันอาจเป็นคนที่ไม่สนใจ
ประวัติศาสตร์

ฮะ. ไม่มีการประกาศตัวแปร แต่เป็นวิธีการตรงกันข้ามกับการกำหนดค่าเริ่มต้นของท้องถิ่น / nonlocal เป็นสิ่งที่ Python ทำ มันจะรู้สึกแปลก ๆ ถ้าฉันตัดสินใจเรียนรูบี้
user2357112 รองรับ Monica

3

PHP

<?php
$some_html_text= <<<EOT
<h1>This is a Header </h1>
<body> This is a body </body>
EOT;
//This is a comment    

ที่นี่ \n//This is a commentมีความจำเป็น หากไม่มีรหัสก็จะไม่ทำงาน

อย่างน้อย\nถ่านเป็นสิ่งจำเป็นหลังจากEOT;ที่เรียกใช้อย่างถูกต้อง


3

JAVASCRIPT

var a = function(b) {
    return b;
}

; // This must be here

(function() {
    // more code
}());

โดยไม่ต้องอัฒภาคแล้วaจะกลายเป็นสิ่งที่เคยค่าตอบแทนจากฟังก์ชั่นที่ 2 คือ - undefinedในกรณีนี้มันเป็น เพราะฟังก์ชั่นที่ได้รับมอบหมายมาเพื่อจะดำเนินการได้ทันทีที่มีฟังก์ชั่นที่สองเป็นอาร์กิวเมนต์ab


2

COBOL (เมนเฟรมของ IBM)

   ID DIVISION. 
   PROGRAM-ID. USELESS. 
   DATA DIVISION. 
   WORKING-STORAGE SECTION. 
   01  W-WHEN-COMPILED              PIC X(8)BX(8) VALUE SPACE.
   PROCEDURE DIVISION. 
       IF W-WHEN-COMPILED EQUAL TO SPACE 
           NEXT SENTENCE 
       END-IF 
       MOVE SPACE                   TO W-WHEN-COMPILED. 
       MOVE WHEN-COMPILED           TO W-WHEN-COMPILED 

       DISPLAY W-WHEN-COMPILED " HELLO WORLD!" 
       GOBACK 
       . 

หากคุณรันโปรแกรมดังกล่าว (IBM Mainframe COBOL ใด ๆ ตั้งแต่ COBOL II (คอมไพเลอร์ IBM แรกถึงมาตรฐาน 1985, อาจเป็น IBM COBOLs อื่น ๆ เช่นกัน) เอาต์พุตคือ:

02/22/14 13.11.02 สวัสดีชาวโลก!

อย่างไรก็ตามหากคุณลบบรรทัดที่ไม่มีประโยชน์ออกไป "ย้ายพื้นที่ไปเป็น W-WHEN-COMPILED" (ฟิลด์มีค่าเริ่มต้นของพื้นที่และมีเนื้อหาอื่น ๆ ไว้ในคำสั่งถัดไปและมันถูกแยกไปอยู่แล้ว) โปรแกรมสร้างผลลัพธ์ไม่ออกและจริง Abends (U4038) (นั่นหมายความว่ามันล้มเหลว) ด้วยข้อความต่อไปนี้ :

 IGZ0037S The flow of control in program USELESS proceeded beyond the 
          last line of the program.  From compile unit USELESS at entry 
          point USELESS at compile unit offset +000003AC at entry offset
          +000003AC at address 119003AC. 

(รหัสข้อความและข้อความจะแตกต่างกันระหว่างคอมไพเลอร์ออฟเซ็ตขึ้นอยู่กับคอมไพเลอร์ที่ใช้จริงและตัวเลือกการคอมไพล์ที่อยู่ขึ้นอยู่กับตำแหน่งที่โปรแกรมถูกโหลดเมื่อประมวลผล)

NEXT SENTENCEเหตุผลก็คือ มันคือSecret GO TOนี่คือคอมไพเลอร์ตามล่าหยุดเต็ม / ระยะเวลาถัดไปในแหล่งที่มาและสร้างสาขาเพื่อคำแนะนำต่อไปนี้ จาก COBOL II การใช้งานแบบ full-stop / period นั้นผ่อนคลาย โปรแกรมจะต้องจบลงด้วยการหยุดเต็ม / ระยะเวลา ในกรณีนี้สาขาจะปิดท้ายโปรแกรม

ทั้งสองโปรแกรมรวบรวม 100% clean (ไม่มีข้อความวินิจฉัย, Return Code of zero)

พฤติกรรมนี้เป็นใบ้ "IBM Extension" ถึง COBOL มาตรฐาน 1985 ไม่อนุญาตให้ใช้NEXT SENTENCEภายในIF/ END-IF( CONTINUEใช้แทนซึ่งเป็นแบบไม่มี op) IBM อนุญาตให้ทำเช่นนี้ - ทำให้ Gotchas ที่น่ากลัวเป็นครั้งคราว


2
#include <stdio.h>
#include <stdlib.h>

void strcmp_or_die(char *s, char *t) {
    if(!strcmp(s, t)) {
        printf("Success!\n");
    } else {
        int *ptr = NULL;
        *ptr = 0;
    }
}

int main(void) {
    char blah = '\0'; //segfaults without this line

    char v[2] = "ok";
    strcmp_or_die(v, "ok");
}

ปัญหาการล้นสตริงอย่างง่าย


1
คอมไพเลอร์ที่ดีจะให้การวินิจฉัย "initializers มากเกินไป"
Ben Voigt

แพลตฟอร์ม segfaults blahใดที่ไม่มี ที่นี่ด้วย OpenBSD 5.5 / amd64 และ gcc ของระบบมันไม่เคยมีคำว่า segfaults ไม่ว่าจะมีหรือไม่blahก็ตาม โปรแกรมที่คอมไพล์ได้จัดสรรพื้นที่สแต็ก 16 ไบต์และคัดลอกค่า 16- บิตของ "ok" ไปยัง 2 ไบต์แรก ไบต์ที่ 3 ที่ไม่ได้กำหนดค่าเริ่มต้นมี '\ 0' โดยโชค หากblahอยู่ที่นั่นมันจะอยู่ในไบต์ที่ 16 และจะยังไม่ยุติสตริง
kernigh

2

~ - ~!

นี่อาจเป็นสิ่งที่โง่ที่สุดและชัดเจนที่สุด

'=|hello\|:
'=~!|Useless?\|:
@'[|y|]|n|:

yมันจะพ่นข้อผิดพลาดโดยไม่ต้องบรรทัดที่สองที่กับมันมันพิมพ์

แบ็กสแลชไม่ได้เป็นตัวละครสำหรับหลบหนีเลย


คุณออกเสียงชื่อภาษาได้อย่างไร

8
@professorfish~-~!
Timtech

1
@professorfish นั่นคือ "ไม่มีความคิดเห็น"
cjfaure

1

Windows Batch

นี่เป็นไฟล์แบตช์ที่พิมพ์ตัวเลข 1 ถึง 10 ด้วยบรรทัดว่างหลังจากแต่ละไฟล์:

@echo off

setlocal EnableDelayedExpansion

set NL=^


rem Previous two lines deliberately left blank for NL to work.

for /l %%a in (1,1,10) do (
    echo %%a!NL!
)

endlocal

pause

สิ่งนี้ทำให้การใช้แฮ็คสกปรกเพื่อเก็บบรรทัดใหม่ภายในตัวแปรอย่างมีประสิทธิภาพ(การใช้การขยายที่ล่าช้าทำให้กำจัดเส้น NL ที่ดูน่ากลัวยิ่งขึ้นในคำตอบที่เชื่อมโยง) หากคุณลบหรือเปลี่ยนแปลงสองบรรทัดว่างเปล่าที่ไม่มีประโยชน์อย่างสมบูรณ์เหนือความคิดเห็นแสดงว่ามันไม่ทำงาน


0

troff

Troff เป็นระบบประมวลผลข้อความที่ยอดเยี่ยมที่สุด ฉันใช้มันสำหรับเอกสารของฉัน มันต้องการระบบมาโครเพื่อให้พร้อมใช้งานและที่มีชื่อเสียงที่สุดคือmsแพ็คเกจมาโคร ลองรวบรวมโค้ดต่อไปนี้พร้อม-msตัวเลือกแบบคลาสสิก

.\" -ms macro package
.\" the following line seems to be useless
\& \" print an invisible character
.ad c
.sp |300p \" absolute vertical positionning
.ps 36p
.ft B
My title.
.PP
This is a paragraph.

บรรทัดที่สามดูเหมือนจะไร้ประโยชน์และจริง ๆ แล้วจะไร้ประโยชน์หากไม่มีแพ็กเกจแมโคร เนื่องจากมีการติดตามตำแหน่งสองบรรทัดด้านล่างโดยการวางตำแหน่งแนวตั้งแบบสัมบูรณ์จึงไม่มีความหมายที่จะพิมพ์อะไรมาก่อน แต่หากไม่มีตัวละครที่มองไม่เห็นการจัดตำแหน่งแนวตั้งจะไม่มีผลกระทบแม้ว่าฉันจะไม่แน่ใจอย่างแน่นอนว่าฉันสามารถอธิบายได้ว่าทำไม (ดูหัวข้อนี้หากคุณต้องการให้มีการสนทนาอย่างรวดเร็ว) สิ่งนี้ทำให้ผู้ใช้ใหม่คลั่ง แต่เคล็ดลับควรคุ้นเคยกับผู้ใช้ที่ทดลองมากกว่า

เพิ่งตรวจสอบกับเวอร์ชั่น troff ที่ชื่นชอบซึ่งไม่เป็นที่รู้จัก (troff มรดกสืบทอด) แต่ฉันค่อนข้างมั่นใจว่ามันยังใช้งานได้เหมือนกันกับ GNU troff


สิ่งที่ดีสิ่งนี้เกิดขึ้นใน LaTeX หากไม่มีกล่องเปล่าหรือสิ่งที่คล้ายกันระยะห่างแนวตั้งจะไม่ทำงานอย่างถูกต้อง
orion
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.