スペースで区切られた番号


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'

数字を各行に1つずつ(適切なパディングを使用して)印刷できますか?
ルイスメンドー

@LuisMendoはい。
コナーオブライエン

回答:



16

Python、32バイト

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

入力としてタプルを受け取る匿名関数。数字または文字列のいずれかが機能します。

例:

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$_}

入力$aintegersの配列として受け取ります。でループします$a|%{...}。各反復では、-format演算子とオプション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("")必要ありません。
コナーオブライエン

1
a=>a.map(n=>(" ".repeat(l=a.length)+n).slice(-l))長さは同じですが、文字列だけでなく整数でも機能します。
ニール

5

Perl、26バイト

@Ton Hospelのおかげで-4バイト

25バイトのコード+ -aフラグ。

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

で実行:

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

(Perlの古いバージョンでは、追加する必要がある場合があります-n


1
使用する-aオプションは、あなたのコードが短くなります...
トンHospel

@TonHospelハム、それはかなり明白に聞こえます、愚かな私..リマインダーをありがとう
ダダ

少し異なる方法でループを回避し、バイトを節約します:オンラインで試してみてください!
Xcali

5

バッシュ、14

printf %$#d $@

コマンドラインで与えられた入力リスト。

ここではあまり説明しません。printf渡された引数の数に基づいて、単に組み込み機能を使用して必要なパディングを実行します。

  • $# 渡された引数の数です
  • %<n>d 最大n個の先行スペースを含む整数を出力するprintf形式指定子です
  • $@ 渡されたすべての引数のリストです
  • 形式指定子は、の各メンバーに再利用されます$@

イデオネ


4

Vim、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

ルビー、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);

以前のバージョン59バイト

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

1
printfで十分なのに、なぜstr_padを使用するのですか?foreach($a=$_GET[a]as$i)printf("%".count($a)."s",$i);
暗号

2

J、4バイト

":~#

オンラインでお試しください!

右側の数字のリストを配列として受け取り、パディングされた文字列を返す単項関数。

ここでは、REPLで使用されています。入力行は3つのスペースでインデントされていることに注意してください。

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

ワオ。Jで私の参照ソリューションを破りました!非常に素晴らしい。
コナーオブライエン


1

Kotlin、90バイト

ゴルフ:

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

ゴルフをしていない:

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各要素に対して-<length of element>)入力リストの)。私は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、結果が返されます。機能的インターフェースは、String[]またはのいずれか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でお試しください。

@KevinCruijssenのおかげで-1バイト。


素敵なアプローチ、+ 1。置くことによって1つのバイトによって次のことができ、ゴルフをint ...してs+=...内部のifこのような:for(int i=a.length,j=i;i-->0;s+="%"+j+"s");
ケビンCruijssen

1

Groovy、36バイト

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

文字列の配列のみを取り、埋め込み文字列の配列を出力します。


1

MATL、14バイト

'%%%dd'inYDGYD

MATL Onlineで試してみてください

これは、最初にフォーマット文字列を作成することにより、フォーマットされた文字列の作成を使用します。%(NUM)d次に、このフォーマット文字列と入力を使用して、文字列フォーマットを再度適用します。


1

JavaScript 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'
    )
;

インポートがカウントされずIEnumerable<string>、完全なリストの代わりに戻る場合、LINQを使用するには数バイト短くなります。

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から入力を読み取り、でCスタイルのフォーマットを使用しsprintfます。cat関数を必要としない何らかの方法があるはずですが、それなしでは各要素の引用符を抑制する方法を見つけることができませんでした。開始と終了の引用だけが必要な場合は、少し長いオプションを使用できます。

paste0(sprintf("%*.f",length(n<-scan()),n),collapse="")
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.