หมายเลขที่เว้นช่องว่าง


20

ได้รับรายชื่อของจำนวนเต็มไม่เป็นลบออกตัวเลขเหล่านั้นกับแต่ละซ้ายเบาะด้วยช่องว่างกับความยาวของN N( หรือมิฉะนั้นส่งคืนรายการอักขระ / สตริง) คุณอาจคิดว่าNมากกว่าหรือเท่ากับจำนวนหลักของตัวเลขที่มากที่สุดในรายการ ช่องว่างต่อท้ายได้รับอนุญาตในการส่งออก

คุณอาจใช้สตริงที่มีตัวเลขเหล่านี้ แต่Nไม่ใช่ความยาวของสตริง แต่เป็นจำนวนองค์ประกอบในรายการ ["1", "2", "3"]นอกจากนี้คุณอาจต้องใช้เวลารายการของสตริงเช่น

นี่คือรหัสกอล์ฟดังนั้นโปรแกรมที่สั้นที่สุดในหน่วยไบต์ชนะ

กรณีทดสอบ

input => 'output'
0 => '0'
1 => '1'
2 3 => ' 2 3'
2 10 => ' 210'
4 5 6 => '  4  5  6'
17 19 20 => ' 17 19 20'
7 8 9 10 => '   7   8   9  10'
100 200 300 0 => ' 100 200 300   0'
1000 400 30 7 => '1000 400  30   7'
1 33 333 7777 => '   1  33 3337777'
0 0 0 0 0 0 => '     0     0     0     0     0     0'

สามารถพิมพ์ตัวเลขในแต่ละบรรทัด (ด้วยการเติมที่เหมาะสม) ได้หรือไม่?
Luis Mendo

@ LuisMendo ใช่
Conor O'Brien

คำตอบ:


8

05AB1E , 3 ไบต์

รหัส:

Dgj

คำอธิบาย:

D    # Duplicate the input array
 g   # Get the length 
  j  # Left-pad with spaces to the length of the array

ลองออนไลน์! หรือตรวจสอบกรณีทดสอบทั้งหมด


1
โอ้ ก็เสร็จแล้วได้อย่างรวดเร็ว งานที่ดี!
Conor O'Brien

16

Python ขนาด 32 ไบต์

lambda l:'%%%ds'%len(l)*len(l)%l

ฟังก์ชั่นที่ไม่ระบุชื่อที่ใช้ tuple เป็นอินพุต ทั้งตัวเลขหรือสตริงทำงาน

ตัวอย่าง:

l=(1,33,333,7777)

'%%%ds'
## A "second-order" format string

'%%%ds'%len(l)           -> '%4s'
## Inserts the length as a number in place of '%d'
## The escaped '%%' becomes '%', ready to take a new format argument
## The result is a format string to pad with that many spaces on the left

'%%%ds'%len(l)*len(l)    -> '%4s%4s%4s%4s'
## Concatenates a copy per element

'%%%ds'%len(l)*len(l)%l  -> '   1  33 3337777'
## Inserts all the tuple elements into the format string 
## So, each one is padded with spaces

7

JavaScript (ES7), 37 ไบต์

a=>a.map(v=>v.padStart(a.length,' '))

อินพุต: อาร์เรย์ของสตริง
เอาต์พุต: อาร์เรย์ของสตริง


5

PowerShell v2 +, 36 ไบต์

param($a)$a|%{"{0,$($a.count)}"-f$_}

รับอินพุต$aเป็นอาร์เรย์ของintegers วน$a|%{...}ซ้ำพวกเขาด้วย การวนซ้ำแต่ละครั้งใช้ตัว-fดำเนินการ ormat พร้อมตัวเลือกAlignment Component(ขึ้นอยู่กับ$a.count) เพื่อปัดซ้ายจำนวนช่องว่างที่เหมาะสม สตริงผลลัพธ์นั้นถูกทิ้งไว้บนไพพ์ไลน์ เมื่อสิ้นสุดการทำงานของโปรแกรมสตริงผลลัพธ์จะถูกทิ้งไว้บนไพพ์ไลน์เป็นอาร์เรย์


ตัวอย่าง

เอาต์พุตถูกคั่นด้วยบรรทัดใหม่ในการรันแต่ละครั้งเนื่องจากเป็นค่าเริ่มต้นWrite-Outputเมื่อโปรแกรมเสร็จสิ้นสำหรับอาร์เรย์

PS C:\Tools\Scripts\golfing> @(0),@(1),@(2,3),@(2,10),@(4,5,6),@(17,19,20),@(7,8,9,10),@(100,200,300,0),@(1000,400,30,7),@(1,33,333,7777),@(0,0,0,0,0,0)|%{""+($_-join',')+" -> ";(.\spaced-out-numbers $_)}
0 -> 
0
1 -> 
1
2,3 -> 
 2
 3
2,10 -> 
 2
10
4,5,6 -> 
  4
  5
  6
17,19,20 -> 
 17
 19
 20
7,8,9,10 -> 
   7
   8
   9
  10
100,200,300,0 -> 
 100
 200
 300
   0
1000,400,30,7 -> 
1000
 400
  30
   7
1,33,333,7777 -> 
   1
  33
 333
7777
0,0,0,0,0,0 -> 
     0
     0
     0
     0
     0
     0

5

JavaScript, 49 ไบต์

a=>a.map(n=>" ".repeat(a.length-n.length)+n)

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

คำอธิบาย:

a=>                                                   An unnamed function, which takes one argument, a
   a.map(n=>                               )          Do the following to each element n in a:
            " ".repeat(a.length-n.length)             Generate the spaces needed to justify the number
                                         +n           Append the number

1
อาร์เรย์ของสตริงเป็นที่ยอมรับได้ดังนั้นจึง.join("")ไม่จำเป็น
Conor O'Brien

1
a=>a.map(n=>(" ".repeat(l=a.length)+n).slice(-l))มีความยาวเท่ากัน แต่ใช้ได้กับจำนวนเต็มเช่นเดียวกับสตริง
Neil

5

Perl, 26 ไบต์

-4 ไบต์ขอบคุณ @Ton Hospel

25 ไบต์ของรหัส + -aธง

printf"%*s",~~@F,$_ for@F

ทำงานด้วย:

perl -ae 'printf"%*s",~~@F,$_ for@F' <<< "10 11 12"

(สำหรับ Perl รุ่นเก่าคุณอาจต้องเพิ่ม-n)


1
การใช้-aตัวเลือกนี้จะทำให้รหัสของคุณสั้นลง ...
Ton Hospel

@TonHospel ครวญเพลงที่ฟังดูค่อนข้างเป็นธรรมฉันโง่ .. ขอบคุณสำหรับการเตือน
Dada

วิธีที่แตกต่างกันเล็กน้อยหลีกเลี่ยงการวนซ้ำและบันทึกไบต์: ลองออนไลน์!
Xcali

5

Bash, 14

printf %$#d $@

รายการอินพุตที่กำหนดที่บรรทัดรับคำสั่ง

ไม่มากที่จะอธิบายที่นี่ เพียงใช้printfสิ่งอำนวยความสะดวกในตัวในการทำช่องว่างภายในตามจำนวน args ที่ส่งผ่าน:

  • $# คือจำนวนของ args ที่ส่งผ่าน
  • %<n>d เป็นตัวระบุรูปแบบ printf ที่พิมพ์จำนวนเต็มที่มีช่องว่างนำหน้าสูงสุด n ช่อง
  • $@ เป็นรายการของ args ทั้งหมดที่ส่งผ่าน
  • $@ตัวระบุรูปแบบนำกลับมาใช้สำหรับสมาชิกของแต่ละคน

ไอดีโอ


4

เป็นกลุ่ม, 19 ไบต์

YPPG!{<C-F>|R%ri<CR>djVGgJ

ทำรายการหมายเลขหนึ่งบรรทัดต่อบรรทัด พึ่งพา:set expandtabซึ่งเป็นที่นิยม แต่ไม่ใช่สากล

คุณต้องการใช้:rightสิ่งนี้อย่างชัดเจน คำถามคือวิธีการรับจำนวนบรรทัดลงในบรรทัดคำสั่ง วิธีดั้งเดิมคือ:%ri<C-R>=line('$')แต่ข้อความทั้งหมดนั้นยาว

วิธีที่สั้นกว่าและกล้าได้กล้าเสียมากขึ้นคือการสร้างบรรทัดคำสั่งโดยใช้!คำสั่งโหมดปกติ มันเกี่ยวข้องกับการแก้ปัญหาแปลก ๆ บางอย่างขยายไฟล์ 2 บรรทัดแล้วลบออกอีกครั้ง แต่มันออกมา 2 ไบต์สั้นลง และฉันก็ตกใจที่บรรทัดคำสั่งที่อ่านไม่ออกที่ฉันได้รับ (เหมือน:%ri+4!) ใช้งานได้จริง แต่ก็เป็นเช่นนั้น


ฉันไม่คิดว่าคุณจะพึ่งพาคุณสมบัติที่ปิดใช้งานตามค่าเริ่มต้น
DJMcMayhem

@DJMcMayhem ฉันใช้เวลาหลายชั่วโมงในการต่อสู้กับการตั้งค่าเยื้องที่ไม่ดีใน vimgolf การตั้งค่าอย่างชัดเจนexpandtabเพิ่ม 7 จังหวะในการแก้ปัญหานี้ เหตุผลที่เป็นปัญหาคือฉันต้องตรวจสอบวิธีการอื่น ๆ เพื่อหลีกเลี่ยง / ลบแท็บที่ตอนนี้อาจชนะ มันใช้เวลานานมากไม่สนุกเลยทำให้คุณภาพของการแก้ปัญหาแย่ลงและไม่ส่งผลกระทบต่อกรณีทดสอบใด ๆ (ไม่มี 8+ ตัวเลข) หากเป็นกฎที่ว่ากฎ expandtabแต่ฉันอยากจะทำเครื่องหมายไม่แข่งขันกว่าโดยไม่ต้องทำเช่นนี้
udioica

@DJMcMayhem Ypp!{เกี่ยวกับ มันสั้นกว่าจริงๆ มันยังไม่ทำงาน มันจะนำหมายเลข 1 เข้าสู่บรรทัดคำสั่งเสมอโดยไม่คำนึงถึงความยาวของไฟล์
udioica

4

Ruby, 40 36 34 ไบต์

->m{m.map{|i|$><<i.rjust(m.size)}}

สามารถทำงานได้มากขึ้น

เรียกว่าแลมบ์ดา

คำอธิบาย:

->m{m.map{|i|$><<i.rjust(m.size)}}
->m{                             } # lambda taking array m
    m.map{|i|                   }  # map over array using variable i
             $><<                  # output to $> (stdout)
                 i.rjust(m.size)   # right justify i to m's length

2

เยลลี่ , 7 6 ไบต์

L⁶xaUU

อินพุตเป็นอาร์เรย์ของสตริง ลองออนไลน์! หรือตรวจสอบกรณีทดสอบทั้งหมด

มันทำงานอย่างไร

L⁶xaUU  Main link. Argument: A (array of strings)

L       Yield the l, the length of A.
 ⁶x     Repeat ' ' l times.

    U   Upend; reverse all strings in A.
   a    Perform vectorizing logical AND, replacing spaces with their corresponding
        digits and leaving spaces without corresponding digits untouched.
     U  Upend; reverse the strings in the result to restore the original order of
        its digits, moving the spaces to the left.

2

Mathematica ขนาด 25 ไบต์

#~StringPadLeft~Length@#&

ทั้งอินพุตและเอาต์พุตเป็นรายการของสตริง

คำอธิบาย

Length@#

รับความยาวของอินพุต (จำนวนองค์ประกอบ)

#~StringPadLeft~...

แผ่นด้านซ้ายแต่ละองค์ประกอบในอินพุตเพื่อให้ความยาวตรงกับความยาวของอินพุต


2

JavaScript (ES6), 47

ฟังก์ชันไม่ระบุชื่ออินพุต: อาร์เรย์ของสตริงเอาต์พุต: อาร์เรย์ของสตริง
การใช้ฟังก์ชันแพ็ดดิ้งแบบเรียกซ้ำ

a=>a.map(x=>p(x),p=x=>x[a.length-1]?x:p(' '+x))

สำหรับอาร์เรย์จำนวนเต็ม / สตริงเป็นอินพุต 49 ไบต์:

a=>a.map(x=>p(x),p=x=>(y=' '+x)[a.length]?x:p(y))

ทดสอบ

f=
a=>a.map(x=>p(x),p=x=>x[a.length-1]?x:p(' '+x))

function update() {
  var l=I.value.match(/\d+/g)||[]
  O.textContent = f(l)
}

update()
 
<input id=I oninput='update()' value='1000,400,30,7'>
<pre id=O></pre>


2

PHP, 55 ไบต์

<?foreach($a=$_GET[a]as$i)printf("%".count($a)."s",$i);

Pevious Version 59 Bytes

<?foreach($a=$_GET[a]as$i)echo str_pad($i,count($a)," ",0);

1
ทำไมต้องใช้ str_pad เมื่อ printf เพียงพอ foreach($a=$_GET[a]as$i)printf("%".count($a)."s",$i);
Crypto

2

J, 4 ไบต์

":~#

ลองออนไลน์!

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

ที่นี่มีการใช้งานที่ REPL โปรดทราบว่าบรรทัดอินพุตมีการเว้นวรรคสามช่อง

   f=: ":~#
   f 2 3
 2 3
   f 2 10
 210
   f 1111 222 33 4
1111 222  33   4

ว้าว. คุณเอาชนะโซลูชันอ้างอิงของฉันใน J! ดีมาก.
Conor O'Brien


1

Kotlin, 90 ไบต์

แข็งแรงเล่นกอล์ฟ:

fun main(a:Array<String>){a.forEach{b->for(i in 1..a.size-b.length){print(" ")};print(b)}}

Ungolfed:

fun main(a: Array<String>) {
    a.forEach { b ->
        for (i in 1..a.size - b.length) {
            print(" ")
        }
        print(b)
    }
}

1

Haskell, 47 ไบต์

k=length
f l=map(\s->replicate(k l-k s)' '++s)l

นั่นคือฟังก์ชั่นจากรายการของสตริงไปยังรายการของสตริงเช่นคำตอบ JavaScript replicateอนุญาตให้หนึ่งรายการ (สตริง Haskell เป็นรายการอักขระ) ของขนาดที่กำหนดดังนั้นฉันใช้มัน - และสมมติฐานที่เป็นตัวหนาในปัญหา - เพื่อสร้างช่องว่างภายใน (ความยาวคือN- <ยาวขององค์ประกอบ> สำหรับแต่ละองค์ประกอบ ของรายการอินพุต) ฉันต้องการที่จะใช้printfโซลูชันที่เป็นพื้นฐานมากกว่าโซลูชันนี้ด้วยreplicate(มันจะสั้นลงสำหรับสิ่งหนึ่ง) แต่คำสั่งการนำเข้าจะช่วยประหยัดค่าใช้จ่ายใด ๆ


1

Java, 83 82 ไบต์

a->{String s="";for(int i=a.length,j=i;i-->0;)s+="%"+j+"s";return s.format(s,a);};

สร้างสตริงรูปแบบที่ออกแบบเพื่อรองอาร์กิวเมนต์ที่กำหนดด้วยจำนวนช่องว่างเท่ากับความยาวของอาร์เรย์ สตริงรูปแบบใช้เป็นอาร์กิวเมนต์สำหรับString.formatและผลลัพธ์จะถูกส่งคืน อินเทอร์เฟซที่ใช้งานได้สามารถยอมรับได้ทั้ง a String[]หรือa Integer[]หรือคล้ายคลึงกัน

ชั้นเต็ม:

public class Test {
    public static void main(String[] args) {
        java.util.function.Function<Integer[], String> f = a -> {
            String s = "";
            for (int i = a.length, j = i; i-- > 0;)
                s += "%" + j + "s";
            return s.format(s, a);
        };

        System.out.println(f.apply(new Integer[] {0}));
        System.out.println(f.apply(new Integer[] {2, 10}));
        System.out.println(f.apply(new Integer[] {7, 8, 9, 10}));
        System.out.println(f.apply(new Integer[] {1, 33, 333, 7777}));
        System.out.println(f.apply(new Integer[] {0, 0, 0, 0, 0, 0}));
    }
}

ลองใช้กับ Ideone

-1 ไบต์ขอบคุณ @KevinCruijssen


วิธีการที่ดี +1 คุณสามารถตีมันทีละ 1 ไบต์โดยใส่int ...และs+=...ภายในifดังนี้:for(int i=a.length,j=i;i-->0;s+="%"+j+"s");
Kevin Cruijssen

1

Groovy ขนาด 36 ไบต์

{a->a.collect{it.padLeft(a.size())}}

ใช้ในอาร์เรย์ของสตริงเท่านั้นส่งออกอาร์เรย์ของสตริงที่มีเบาะ


1

MATL, 14 ไบต์

'%%%dd'inYDGYD

ลองใช้งานที่MATL Online

สิ่งนี้ใช้การสร้างสตริงที่จัดรูปแบบโดยสร้างสตริงการจัดรูปแบบก่อน%(NUM)dจากนั้นจึงใช้การจัดรูปแบบสตริงอีกครั้งโดยใช้สตริงการจัดรูปแบบนี้และอินพุต


1

จาวาสคริปต์ 33 ไบต์

คล้ายกับ @Hedi - แต่ช่องว่างภายในเริ่มต้นคือ '' ดังนั้นจึงมี 4 ตัวอักษรน้อยกว่า

a=>a.map(s=>s.padStart(a.length))

f=a=>a.map(s=>s.padStart(a.length))

console.log(f(["0"]))
console.log(f(["1"]))
console.log(f(["2","3"]))
console.log(f(["2","10"]))
console.log(f(["17" ,"19" ,"2"]))
console.log(f(["1000" ,"400" ,"30" ,"7"]))


1

K (oK) 11 ไบต์

วิธีการแก้:

,/(-#x)$$x:

ลองออนไลน์!

คำอธิบาย:

ตีความจากขวาไปซ้าย แปลงเป็นสตริงและแผ่นซ้ายด้วยความยาวของรายการจากนั้นปรับให้แบน:

,/(-#x)$$x: / the solution                      | example:
         x: / save as 'x'                       |
        $   / string                            | $10 20 30 -> "10","20","30"
       $    / pad right by left                 | 5$"abc" -> "abc  "
  (   )     / do the stuff in brackets together |
    #x      / count x                           | #10 20 30 -> 3
   -        / negate                            |
,/          / flatten (concatenate-over)        | ,/" a"," b"," c" -> " a b c"


0

C #, 39 ไบต์

s=>s.ConvertAll(c=>c.PadLeft(s.Count));

ใช้เวลาList<string>และผลList<string>

คำอธิบาย:

/*Func<List<string>, List<string>> Lambda =*/ s =>
    s.ConvertAll(c =>                                // Create a new List<string> by...
        c.PadLeft(s.Count)                           // ...padding each element by 'N'
    )
;

จะสั้นกว่านี้สักสองสามไบต์หากใช้ LINQ หากการนับการนำเข้านั้นไม่ถูกนับและส่งคืนIEnumerable<string>แทนที่จะเป็นรายการเต็มรูปแบบ:

C #, 35 + 18 = 53 ไบต์

using System.Linq;s=>s.Select(c=>c.PadLeft(s.Count));

0

R, 47 ไบต์

cat(sprintf("%*.f",length(n<-scan()),n),sep="")

อ่านข้อมูลจาก stdin และใช้การจัดรูปแบบ sprintfC-สไตล์ด้วย ควรมีวิธีที่catฟังก์ชั่นไม่จำเป็น แต่ไม่สามารถหาวิธีที่จะระงับราคาในแต่ละองค์ประกอบโดยไม่ได้ หากเราต้องการคำพูดเริ่มต้นและสิ้นสุดเราสามารถใช้ตัวเลือกที่ยาวกว่านี้เล็กน้อย:

paste0(sprintf("%*.f",length(n<-scan()),n),collapse="")
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.