พระเจ้าของฉันมันเต็มไปด้วยช่องว่าง!


42

บางคนยืนยันที่จะใช้ช่องว่างสำหรับการจัดระเบียบและการเยื้อง

สำหรับการจัดระเบียบนั่นผิดที่ไม่อาจปฏิเสธได้ ตามคำจำกัดความ tabulators จะต้องใช้สำหรับการทำตาราง

แม้สำหรับการเยื้อง

  • มีฉันทามติที่ชัดเจนในชุมชน Stack Exchange

  • การใช้พื้นที่เดียวสำหรับการเยื้องเป็นสิ่งที่ไม่พึงประสงค์ทางสายตา การใช้มากกว่าหนึ่งรายการนั้นสิ้นเปลือง

    ทั้งหมดเป็นปลาจกอล์ฟ ERS รู้ว่าโปรแกรมที่ควรจะเป็นสั้นที่สุด ไม่เพียงช่วยประหยัดเนื้อที่บนฮาร์ดดิสก์เท่านั้นเวลาในการรวบรวมจะลดลงหากต้องดำเนินการกับไบต์ให้น้อยลง

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

  • โปรแกรมแก้ไขข้อความที่ดีทั้งหมดใช้ tabulators โดยค่าเริ่มต้น (และคำจำกัดความ)

  • ฉันพูดอย่างนั้นและฉันก็ถูกเสมอ!

น่าเศร้าที่ทุกคนไม่ฟังเหตุผล มีคนส่งไฟล์ที่ผิดTMและคุณต้องแก้ไข คุณสามารถทำได้ด้วยตนเอง แต่จะมีคนอื่น

มันไม่ดีพอที่ spacers จะเสียเวลาอันมีค่าของคุณดังนั้นคุณตัดสินใจที่จะเขียนโปรแกรมที่สั้นที่สุดเพื่อดูแลปัญหา

งาน

เขียนโปรแกรมหรือฟังก์ชั่นที่ทำสิ่งต่อไปนี้:

  1. อ่านสตริงเดียวจาก STDIN หรือเป็นอาร์กิวเมนต์บรรทัดคำสั่งหรือฟังก์ชั่น

  2. ระบุตำแหน่งที่ตั้งทั้งหมดที่มีการใช้ช่องว่างสำหรับการจัดตารางหรือการเยื้อง

    การเว้นวรรคเป็นการเยื้องถ้าเกิดขึ้นที่จุดเริ่มต้นของบรรทัด

    การเว้นวรรคตั้งแต่สองช่องขึ้นไปเป็นการจัดเรียงหากไม่มีการเยื้อง

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

  3. กำหนดความกว้างของแท็บที่ยาวที่สุดที่เป็นไปได้1ซึ่งช่องว่างทั้งหมดที่ใช้สำหรับการจัดระเบียบหรือการเยื้องสามารถถูกแทนที่ด้วย tabulators โดยไม่เปลี่ยนลักษณะที่ปรากฏของไฟล์

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

  4. ใช้ความกว้างแท็บที่กำหนดไว้ก่อนหน้านี้แทนที่ช่องว่างทั้งหมดที่ใช้สำหรับการจัดระเบียบหรือการเยื้องกับตัวทำตาราง

    นอกจากนี้เมื่อใดก็ตามที่เป็นไปได้โดยไม่ต้องเปลี่ยนลักษณะที่ปรากฏของไฟล์ให้แทนที่ช่องว่างทั้งหมดที่ใช้สำหรับความสับสนด้วย tabulators (หากมีข้อสงสัยให้กำจัดช่องว่าง)

  5. ส่งคืนสตริงที่ถูกดัดแปลงจากฟังก์ชันของคุณหรือพิมพ์ไปที่ STDOUT

ตัวอย่าง

  • ช่องว่างทั้งหมดของ

    a    bc   def  ghij
    

    เป็นตาราง

    การเว้นวรรคแต่ละครั้งจะใส่สตริงก่อนหน้าของอักขระที่ไม่ใช่ช่องว่างให้มีความกว้าง 5 ดังนั้นความกว้างแท็บที่ถูกต้องคือ 5 และเอาต์พุตที่ถูกต้อง2คือ

    a--->bc-->def->ghij
    
  • สองช่องว่างแรกของ

    ab  cde f
    ghi jk lm
    

    มีการจัดระเบียบความสับสนอื่น ๆ

    ความกว้างแท็บที่ถูกต้องคือ 4 ดังนั้นผลลัพธ์ที่ถูกต้องคือ2

    ab->cde>f
    ghi>jk lm
    

    ช่องว่างสุดท้ายยังคงไม่ถูกแตะต้องเนื่องจากมันจะถูกแสดงผลเป็นสองช่องว่างหากถูกแทนที่ด้วย tabulator:

    ab->cde>f
    ghi>jk->lm
    
  • ทั้งหมดยกเว้นหนึ่งช่องว่างของ

    int
        main( )
        {
            puts("TABS!");
        }
    

    เป็นการเยื้องและอื่น ๆ ที่มีความสับสน

    ระดับการเยื้องคือ 0, 4 และ 8 ช่องว่างดังนั้นความกว้างแท็บที่ถูกต้องคือ 4 และเอาต์พุตที่ถูกต้อง2คือ

    int
    --->main( )
    --->{
    --->--->puts("TABS!");
    --->}
    

    ช่องว่างใน( )จะถูกแสดงเป็นช่องว่างสามช่องหากแทนที่ด้วย tabulator ดังนั้นจึงไม่มีการแตะต้อง

  • สองช่องว่างแรกของ

      x yz w
    

    เป็นการเยื้องและความสับสนอื่น ๆ

    ความกว้างแท็บที่เหมาะสมคือ 2 และเอาต์พุตที่ถูกต้องคือ2

    ->x>yz w
    

    ช่องว่างสุดท้ายจะถูกแสดงเป็นช่องว่างสองช่องหากแทนที่ด้วย tabulator ดังนั้นจึงยังคงไม่มีการแตะต้อง

  • สองช่องว่างแรกของ

      xy   zw
    

    เป็นการเยื้องและอีกสามคนเป็นตาราง

    เฉพาะความกว้างแท็บ 1 เท่านั้นที่อนุญาตให้กำจัดช่องว่างทั้งหมดดังนั้นผลลัพธ์ที่ถูกต้อง2คือ

    >>xy>>>zw
    
  • ช่องว่างทั้งหมดของ

    a b c d
    

    มีความสับสน

    ไม่มีความกว้างแท็บที่ยาวที่สุดที่เป็นไปได้ดังนั้นผลลัพธ์ที่ถูกต้อง2คือ

    a b c d
    

กฎเพิ่มเติม

  • ข้อมูลที่ป้อนจะประกอบด้วยอักขระ ASCII ที่พิมพ์ได้ทั้งหมดและ linefeeds

  • คุณอาจคิดว่ามีข้อความไม่เกิน 100 บรรทัดและไม่เกิน 100 ตัวอักษรต่อบรรทัด

  • หากคุณเลือก STDOUT สำหรับเอาท์พุทคุณอาจพิมพ์บรรทัดป้อนบรรทัดเดียว

  • ใช้กฎมาตรฐานของ


1 ความกว้างแท็บถูกกำหนดให้เป็นระยะทางเป็นตัวอักษรระหว่างแท็บสองแท็บติดต่อกันโดยใช้แบบอักษรที่มีช่องว่าง
2 ลูกศรศิลปะ ASCII เป็นตัวแทนของ tabulators Stack Exchange ปฏิเสธที่จะแสดงผลอย่างถูกต้องซึ่งฉันได้ส่งรายงานข้อผิดพลาด เอาท์พุทที่เกิดขึ้นจริงจะต้องมี tabulators จริง


9
+1 สำหรับการวางปัญหาพื้นที่ / แท็บที่ไร้สาระนี้ในที่สุด: D
Geobits

2
programs should be as short as possibleฉันเชื่อว่าฉันได้พบกับพี่ชายที่หายไปนานของ Arthur Whitney !!
kirbyfan64sos


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

1
ฉันกำลังร้องไห้ทุกครั้งที่เพื่อนร่วมงานเพิ่มแท็บในโค้ดที่เยื้องพื้นที่ที่สวยงามของฉัน จากนั้นฉันก็ค้นพบ CTRL + K + F ใน Visual Studio ฉันทำทุกครั้งที่ฉันเปิดไฟล์ที่แก้ไข ชีวิตของฉันดีขึ้นแล้ว
Michael M.

คำตอบ:


5

Pyth, 102 103 ไบต์

=T|u?<1hHiGeHGsKmtu++J+hHhGlhtH+tG]+HJ.b,YN-dk<1u+G?H1+1.)Gd]0]0cR\ .zZ8VKVNp?%eNT*hNd*/+tThNTC9p@N1)pb

ลองออนไลน์

แนวคิดที่น่าสนใจ แต่เนื่องจากแท็บในอินพุตทำลายแนวคิดจึงไม่สามารถใช้งานได้มาก

แก้ไข: แก้ไขข้อผิดพลาด ขอบคุณมาก @aditsu


มันขัดข้องใน "abc d"
aditsu

@aditsu อึ! Thanx สำหรับหัวขึ้น ฉันต้องการกรณีทดสอบที่ดีกว่า: P
Brian Tuck

5

PowerShell, 414 409 ไบต์

function g($a){if($a.length-gt2){g $a[0],(g $a[1..100])}else{if(!$a[1]){$a[0]}else{g $a[1],($a[0]%$a[1])}}}{$a[0]}else{g $a[1],($a[0]%$a[1])}}}
$b={($n|sls '^ +|(?<!^)  +' -a).Matches}
$n=$input-split"`n"
$s=g(&$b|%{$_.Index+$_.Length})
($n|%{$n=$_
$w=@(&$b)
$c=($n|sls '(?<!^| ) (?! )'-a).Matches
$w+$c|sort index -d|%{$x=$_.Index
$l=$_.Length
if($s-and!(($x+$l)%$s)){$n=$n-replace"(?<=^.{$x}) {$l}",("`t"*(($l/$s),1-ge1)[0])}}
$n})-join"`n"

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

วิธีการดำเนินการ

คัดลอกรหัสลงในSpaceMadness.ps1ไฟล์แล้วไพพ์อินพุตลงในสคริปต์ ฉันจะถือว่าไฟล์ที่ต้องการแปลงเรียกว่าtaboo.txt:

จาก PowerShell:

cat .\taboo.txt | .\SpaceMadness.ps1

จากพร้อมท์คำสั่ง:

type .\taboo.txt | powershell.exe -File .\SpaceMadness.txt

ฉันทดสอบด้วย PowerShell 5 แต่ควรใช้กับ 3 หรือสูงกว่า

การทดสอบ

นี่คือ PowerShell ฉบับย่อที่มีประโยชน์สำหรับการทดสอบด้านบน:

[CmdletBinding()]
param(
    [Parameter(
        Mandatory=$true,
        ValueFromPipeline=$true
    )]
    [System.IO.FileInfo[]]
    $File
)

Begin {
    $spaces = Join-Path $PSScriptRoot SpaceMadness.ps1
}

Process {
     $File | ForEach-Object {
        $ex = Join-Path $PSScriptRoot $_.Name 
        Write-Host $ex -ForegroundColor Green
        Write-Host ('='*40) -ForegroundColor Green
        (gc $ex -Raw | & $spaces)-split'\r?\n'|%{[regex]::Escape($_)} | Write-Host -ForegroundColor White -BackgroundColor Black
        Write-Host "`n"
    }
}

วางสิ่งนี้ลงในไดเรกทอรีเดียวกับที่SpaceMadness.ps1ฉันเรียกสิ่งนี้tester.ps1เรียกมันว่าอย่างนั้น:

"C:\Source\SomeFileWithSpaces.cpp" | .\tester.ps1
.\tester.ps1 C:\file1.txt,C:\file2.txt
dir C:\Source\*.rb -Recurse | .\tester.ps1

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

ผลลัพธ์มีลักษณะดังนี้ (แต่มีสี):

C:\Scripts\Powershell\Golf\ex3.txt
========================================
int
\tmain\(\ \)
\t\{
\t\tputs\("TABS!"\);
\t}

คำอธิบาย

บรรทัดแรกมากกำหนดฟังก์ชันปัจจัยร่วมกัน / ตัวหารที่ยิ่งใหญ่ที่สุดgเท่าที่ชัดถ้อยชัดคำเป็นฉันสามารถจัดการที่ใช้อาร์เรย์ (จำนวนข้อของตัวเลข) และคำนวณ GCD ซ้ำโดยใช้ขั้นตอนวิธี Euclidean

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

$bกำหนด scriptblock เพราะรำคาญฉันต้องเรียกชิ้นส่วนของรหัสนั้นสองครั้งดังนั้นฉันบันทึกบางไบต์วิธีที่ บล็อกนี้ใช้สตริง (หรืออาเรย์ของสตริง) $nและเรียกใช้ regex ที่มัน ( slsหรือSelect-String) ส่งคืนออบเจ็กต์ที่ตรงกัน จริง ๆ แล้วฉันได้ทั้งการเยื้องและตารางในที่นี่ซึ่งช่วยฉันในการประมวลผลพิเศษด้วยการจับแยก

$nใช้สำหรับสิ่งต่าง ๆ ทั้งภายในและภายนอกลูปหลัก (แย่จริงๆ แต่จำเป็นที่นี่เพื่อให้ฉันสามารถฝังไว้ใน$bscriptblock ของและใช้มันทั้งในและนอกลูปโดยไม่ต้องมีการparam()ประกาศที่ยาวและผ่านการขัดแย้ง

$sรับความกว้างแท็บโดยการเรียก$bบล็อกบนอาเรย์ของบรรทัดในไฟล์อินพุตจากนั้นรวมดัชนีและความยาวของแต่ละการแข่งขันคืนอาร์เรย์ของผลรวมเป็นอาร์กิวเมนต์ในฟังก์ชัน GCD ดังนั้น$sขนาดของแท็บของเราจึงหยุดในขณะนี้

จากนั้นลูปจะเริ่ม $nเราย้ำกว่าแต่ละบรรทัดในอาร์เรย์ของสายการป้อนข้อมูล สิ่งแรกที่ฉันทำในการวนซ้ำคือการกำหนดค่า$n(ขอบเขตท้องถิ่น) ของค่าของสายปัจจุบันด้วยเหตุผลด้านบน

$w รับค่าของการเรียกใช้สคริปต์บล็อกสำหรับบรรทัดปัจจุบันเท่านั้น (การเยื้องและตารางสำหรับบรรทัดปัจจุบัน)

$cได้รับค่าที่คล้ายกัน แต่เรากลับพบความสับสนทั้งหมด

ฉันเพิ่ม$wและ$cสิ่งที่เป็นอาร์เรย์ให้ฉันหนึ่งอาร์เรย์ที่มีทั้งหมดของพื้นที่ตรงกับที่ฉันต้องการsortมันเรียงตามดัชนีและเริ่มต้นซ้ำในแต่ละการแข่งขันสำหรับบรรทัดปัจจุบัน

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

เข้าสู่วงนี้$xอยู่ในดัชนีของการแข่งขันปัจจุบันและ$lเป็นความยาวของการแข่งขันปัจจุบัน $sในความเป็นจริงสามารถ0และที่ทำให้แบ่งที่น่ารำคาญโดยศูนย์ข้อผิดพลาดดังนั้นฉันกำลังตรวจสอบความถูกต้องของมันแล้วทำคณิตศาสตร์

!(($x+$l)%$s)บิตมีจุดเดียวที่ฉันจะตรวจสอบเพื่อดูว่ามีความสับสนควรจะถูกแทนที่ด้วยแท็บหรือไม่ หากดัชนีบวกความยาวหารด้วยความกว้างของแท็บไม่มีเหลือแล้วเราจะดีไปในการแข่งขันครั้งนี้แทนที่ด้วยแท็บ (คณิตศาสตร์ที่จะทำงานเสมอในรอยบุ๋มและtabulationsเพราะขนาดของพวกเขาคือสิ่งที่กำหนดความกว้างของแท็บ เริ่มต้นกับ).

สำหรับการแทนที่แต่ละการวนซ้ำของลูปการจับคู่ทำงานบนบรรทัดปัจจุบันของอินพุตดังนั้นจึงเป็นชุดของการแทนที่สะสม regex เพียงแค่ค้นหา$lช่องว่างที่นำหน้าด้วย$xอักขระใด ๆ เราแทนที่ด้วย$l/$sแท็บอักขระ (หรือ 1 ถ้าหมายเลขนั้นต่ำกว่าศูนย์)

ส่วน(($l/$s),1-ge1)[0]นี้เป็นวิธีที่ซับซ้อนในการพูดif (($l/$s) -lt 0) { 1 } else { $l/$s }หรือสลับ[Math]::Max(1,($l/$s))กัน มันทำให้อาร์เรย์ของ$l/$sและ1จากนั้นใช้-ge 1เพื่อส่งกลับอาร์เรย์ที่มีเพียงองค์ประกอบที่มากกว่าหรือเท่ากับหนึ่งแล้วใช้องค์ประกอบแรก มาสั้นกว่า[Math]::Maxรุ่นไม่กี่ไบต์

ดังนั้นเมื่อการแทนที่ทั้งหมดเสร็จสิ้นแล้วบรรทัดปัจจุบันจะถูกส่งคืนจากการวนซ้ำForEach-Object( %) และเมื่อพวกเขาทั้งหมดถูกส่งคืน (อาร์เรย์ของเส้นคงที่) มันก็จะ-joinมีการขึ้นบรรทัดใหม่ (เนื่องจากเราแยกบรรทัดใหม่ในตอนต้น)

ฉันรู้สึกว่ามีห้องพักสำหรับการปรับปรุงที่นี่ที่ฉันถูกไฟไหม้เกินกว่าจะจับได้ในตอนนี้ แต่บางทีฉันอาจจะเห็นอะไรบางอย่างในภายหลัง

แท็บ 4 lyfe


4

PHP - 278 210 ไบต์

ฟังก์ชั่นนี้ทำงานโดยการทดสอบความกว้างแต่ละแท็บเริ่มต้นด้วยค่า 100 ความยาวสูงสุดของบรรทัดดังนั้นความกว้างแท็บสูงสุด

สำหรับความกว้างแต่ละแท็บเราแบ่งแต่ละบรรทัดเป็น "บล็อก" ของความยาวนั้น สำหรับแต่ละช่วงนี้:

  • หากโดยการต่ออักขระตัวสุดท้ายของบล็อกก่อนหน้านี้กับบล็อกนี้เราจะพบช่องว่างสองช่องติดต่อกันก่อนตัวละครเรามีการเยื้องหรือการจัดเรียงที่ไม่สามารถเปลี่ยนเป็นพื้นที่โดยไม่เปลี่ยนลักษณะที่ปรากฏ; เราลองความกว้างแท็บถัดไป
  • มิฉะนั้นถ้าตัวละครตัวสุดท้ายเป็นช่องว่างเราจะตัดช่องว่างที่ส่วนท้ายของบล็อกเพิ่มตัวสร้างตารางและจดจำสิ่งทั้งหมด
  • มิฉะนั้นเราก็จะจดจำบล็อก

เมื่อวิเคราะห์แต่ละบล็อคของบรรทัดแล้วเราจะจดจำ linefeed หากบล็อกทั้งหมดของทุกบรรทัดถูกวิเคราะห์ด้วยความสำเร็จเราจะส่งคืนสตริงที่เราจำได้ มิฉะนั้นหากลองบวกความกว้างแท็บอย่างเข้มงวดแต่ละแท็บแล้วจะไม่มีการจัดระเบียบหรือการเยื้องและเราจะส่งคืนสตริงเดิม

function($s){for($t=101;--$t;){$c='';foreach(split('
',$s)as$l){$e='';foreach(str_split($l,$t)as$b){if(ereg('  [^ ]',$e.$b))continue 3;$c.=($e=substr($b,-1))==' '?rtrim($b).'   ':$b;}$c.='
';}return$c;}return$s;}

นี่คือรุ่นที่ไม่ได้แต่งแต้ม:

function convertSpacesToTabs($string)
{
    for ($tabWidth = 100; $tabWidth > 0; --$tabWidth)
    {
        $convertedString = '';
        foreach (explode("\n", $string) as $line)
        {
            $lastCharacter = '';
            foreach (str_split($line, $tabWidth) as $block)
            {
                if (preg_match('#  [^ ]#', $lastCharacter.$block))
                {
                    continue 3;
                }

                $lastCharacter = substr($block, -1);
                if ($lastCharacter == ' ')
                {
                    $convertedString .= rtrim($block) ."\t";
                }
                else
                {
                    $convertedString .= $block;
                }
            }

            $convertedString .= "\n";
        }

        return $convertedString;
    }

    return $string;
}

ขอขอบคุณเป็นพิเศษกับDankMemesสำหรับการบันทึก 2 ไบต์


1
คุณสามารถบันทึก 2 ไบต์โดยใช้for($t=101;--$t;)แทนfor($t=100;$t;--$t)
DankMemes

4

CJam, 112

qN/_' ff=:e`{0:X;{_0=X+:X+}%}%_:+{~;\(*},2f=0\+{{_@\%}h;}*:T;\.f{\~\{@;1$({;(T/)9c*}{\;T{T%}&S9c?}?}{1$-@><}?}N*

ลองออนไลน์

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

คำอธิบาย:

qN/          read input and split into lines
_            duplicate the array (saving one copy for later)
' ff=        replace each character in each line with 0/1 for non-space/space
:e`          RLE-encode each line (obtaining chunks of spaces/non-spaces)
{…}%         transform each line
  0:X;       set X=0
  {…}%       transform each chunk, which is a [length, 0/1] array
    _0=      copy the first element (the length)
    X+:X     increment X by it
    +        and append to the array; this is the end position for the chunk
_            duplicate the array (saving one copy for later)
:+           join the lines (putting all the chunks together in one array)
{…},         filter the array using the block to test each chunk
  ~          dump the chunk (length, 0/1, end) on the stack
  ;          discard the end position
  \(         bring the length to the top and decrement it
  *          multiply the 2 values (0/1 for non-space/space, and length-1)
              the result is non-zero (true) iff it's a chunk of at least 2 spaces
2f=          get all the end positions of the multiple-space chunks
0\+          prepend a 0 to deal with the empty array case
{…}*         fold the array using the block
  {_@\%}h;   calculate gcd of 2 numbers
:T;          save the resulting value (gcd of all numbers) in variable T
\            swap the 2 arrays we saved earlier (input lines and chunks)
.f{…}        for each chunk and its corresponding line
  \~         bring the chunk to the top and dump it on the stack
              (length, 0/1, end position)
  \          swap the end position with the 0/1 space indicator
  {…}        if 1 (space)
    @;       discard the line text
    1$(      copy the chunk length and decrement it
    {…}      if non-zero (multiple spaces)
      ;      discard the end position
      (T/)   divide the length by T, rounding up
      9c*    repeat a tab character that many times
    {…}      else (single space)
      \;     discard the length
      T{…}&  if T != 0
        T%   calculate the end position mod T
      S9c?   if non-zero, use a space, else use a tab
    ?        end if
  {…}        else (non-space)
    1$-      copy the length and subtract it from the end position
              to get the start position of the chunk
    @>       slice the line text beginning at the start position
    <        slice the result ending at the chunk length
              (this is the original chunk text)
  ?          end if
N*           join the processed lines using a newline separator

1

PowerShell , 165 160 153 152 142 138 137 ไบต์

param($s)@((0..99|%{$s-split"(
|..{0,$_})"-ne''-replace(' '*!$_*($s[0]-ne32)+' +$'),"`t"-join''})-notmatch'(?m)^ |\t '|sort{$_|% Le*})[0]

ลองออนไลน์!

หักกอล์ฟ:

param($spacedString)

$tabed = 0..99|%{
    $spacedString `
        -split "(\n|..{0,$_})" -ne '' `
        -replace (' '*!$_*($spacedString[0]-ne32)+' +$'),"`t" `
        -join ''
}

$validated = $tabed -notmatch '(?m)^ |\t '

$sorted = $validated|sort{$_|% Length}    # sort by a Length property

@($sorted)[0]  # $shortestProgram is an element with minimal length
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.