Rozłożone liczby

20

Biorąc pod uwagę listę Nliczb całkowitych nieujemnych, wypisz te liczby z każdą dopełnioną lewą spacją na długość N. (Alternatywnie, zwróć listę znaków / ciągów.) Możesz założyć, że Njest ona większa lub równa liczbie cyfr największej liczby na liście. Końcowe spacje są dozwolone w danych wyjściowych.

Możesz również wziąć ciąg zawierający te liczby, ale Nnie jest to długość ciągu, ale raczej liczba elementów na liście; możesz także wziąć listę ciągów znaków np ["1", "2", "3"].

To jest golf golfowy, więc wygrywa najkrótszy program w bajtach.

Przypadki testowe

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'
Conor O'Brien
źródło
Czy liczby mogą być wydrukowane po jednym w każdej linii (z odpowiednim dopełnieniem)?
Luis Mendo,
@LuisMendo tak.
Conor O'Brien

Odpowiedzi:

16

Python, 32 bajty

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

Anonimowa funkcja, która pobiera krotkę jako dane wejściowe. Liczby lub ciągi działają.

Przykład:

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
xnor
źródło
7

JavaScript (ES7), 37 bajtów

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

Dane wejściowe: tablica ciągów Dane
wyjściowe: tablica ciągów

Hedi
źródło
5

PowerShell v2 +, 36 bajtów

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

Pobiera dane wejściowe $ajako tablicę integerów. Pętle przez nie za pomocą $a|%{...}. Każda iteracja używa -foperatora ormat z opcjonalnym Alignment Component(na podstawie $a.count), aby wstawić lewą odpowiednią liczbę spacji. Ten wynikowy ciąg zostaje pozostawiony w potoku. Po zakończeniu wykonywania programu wszystkie powstałe ciągi są pozostawione w potoku jako tablica.


Przykłady

Dane wyjściowe są oddzielane znakiem nowej linii przy każdym uruchomieniu, ponieważ jest to ustawienie domyślne Write-Outputpo zakończeniu programu dla tablicy.

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
AdmBorkBork
źródło
5

JavaScript, 49 bajtów

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

Traktuje argumenty jako listę ciągów, a także zwraca listę ciągów.

Wyjaśnienie:

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
Loovjo
źródło
1
Tablica ciągów znaków jest akceptowalna, więc .join("")nie jest potrzebna.
Conor O'Brien
1
a=>a.map(n=>(" ".repeat(l=a.length)+n).slice(-l))ma tę samą długość, ale działa zarówno na liczbach całkowitych, jak i na ciągach znaków.
Neil,
5

Perl, 26 bajtów

-4 bajty dzięki @Ton Hospel

25 bajtów kodu + -aflaga.

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

Biegnij z :

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

(W niektórych starszych wersjach Perla może być konieczne dodanie -n)

Dada
źródło
1
Skorzystanie z tej -aopcji spowoduje, że Twój kod będzie krótszy ...
Ton Hospel 18.10.16
@TonHospel szum, to brzmi dość oczywisto, głupie ja .. Dzięki za przypomnienie
Dada
Nieco inna metoda pozwala uniknąć pętli i oszczędza bajt: Wypróbuj online!
Xcali,
5

Bash, 14

printf %$#d $@

Lista danych wejściowych podana w wierszu poleceń.

Nie wiele tu do wyjaśnienia. Po prostu korzysta z wbudowanych printfurządzeń, aby wykonać niezbędne wypełnienie w oparciu o liczbę przekazanych argumentów:

  • $# to liczba przekazanych argumentów
  • %<n>d jest specyfikatorem formatu printf, który wypisuje liczbę całkowitą z maksymalnie n wiodącymi spacjami
  • $@ jest listą wszystkich przekazanych argumentów
  • Specyfikator formatu jest ponownie wykorzystywany dla każdego członka $@.

Ideone .

Cyfrowa trauma
źródło
4

Vim, 19 bajtów

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

Pobiera listę liczb jeden na linię. Polega na :set expandtab, który jest popularny, ale nie uniwersalny.

Wyraźnie chcesz użyć :right . Pytanie brzmi, jak uzyskać liczbę wierszy w wierszu polecenia. Tradycyjny sposób jest taki :%ri<C-R>=line('$'), ale cały ten tekst jest długi.

Krótsze, bardziej przedsiębiorcze podejście polega na utworzeniu wiersza poleceń za pomocą !polecenia trybu normalnego . Wymaga to dziwnych obejść, rozszerzenia pliku o 2 linie, a następnie usunięcia go ponownie, ale wychodzi o 2 bajty krócej. Jestem trochę zszokowany zniekształconym wierszem poleceń, który (jak :%ri+4!) faktycznie działa, ale działa.

udioica
źródło
Nie sądzę, że możesz polegać na funkcji, która jest domyślnie wyłączona.
DJMcMayhem
@DJMcMayhem Spędziłem zbyt wiele godzin życia walcząc ze złymi ustawieniami wcięć w vimgolfie. Jawne ustawienie expandtabdodaje 7 pociągnięć do tego rozwiązania. Powodem tego problemu jest to, że muszę sprawdzić inne metody unikania / usuwania kart, które mogą teraz wygrać. To dużo czasu, wcale nie jest zabawne, pogarsza jakość mojego rozwiązania i nawet nie wpływa na żaden z podanych przypadków testowych (żaden nie ma 8+ liczb). Jeśli taka jest reguła, taka jest reguła, ale wolałbym zaznaczyć zakaz konkurowania, niż zrobić to bez niej expandtab.
udioica
@DJMcMayhem About Ypp!{. To jest rzeczywiście krótsze. To też nie działa. Zawsze przenosi cyfrę 1 do wiersza poleceń, niezależnie od długości pliku.
udioica
4

Rubinowy, 40 36 34 bajtów

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

Można pracować nad więcej.

Zadzwoń jako lambda.

Wyjaśnienie:

->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
dkudriavtsev
źródło
2

Galaretka , 7 6 bajtów

L⁶xaUU

Dane wejściowe to tablica ciągów. Wypróbuj online! lub zweryfikuj wszystkie przypadki testowe .

Jak to działa

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.
Dennis
źródło
2

Mathematica, 25 bajtów

#~StringPadLeft~Length@#&

Zarówno dane wejściowe, jak i wyjściowe są listami ciągów.

Wyjaśnienie

Length@#

Uzyskaj długość wejścia (liczbę elementów).

#~StringPadLeft~...

Pad pozostawił każdy element na wejściu, aby ich długości pasowały do ​​długości wejścia.

JungHwan Min
źródło
2

JavaScript (ES6), 47

Funkcja anonimowa, wejście: tablica ciągów, wyjście: tablica ciągów
Korzystanie z rekurencyjnej funkcji wypełniania

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

Dla wejściowej tablicy liczb całkowitych / łańcuchów 49 bajtów:

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

Test

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>

edc65
źródło
2

PHP, 55 bajtów

<?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);
Jörg Hülsermann
źródło
1
Po co używać str_pad, gdy wystarcza printf? foreach($a=$_GET[a]as$i)printf("%".count($a)."s",$i);
Crypto,
2

J, 4 bajty

":~#

Wypróbuj online!

Unary funkcja przyjmująca listę liczb po prawej jako tablicę i zwracająca dopełniony ciąg.

Tutaj jest używany w REPL. Zauważ, że linie wejściowe są wcięte o trzy spacje.

   f=: ":~#
   f 2 3
 2 3
   f 2 10
 210
   f 1111 222 33 4
1111 222  33   4
algorytmshark
źródło
Łał. Pokonałeś moje rozwiązanie referencyjne w J! Bardzo dobrze.
Conor O'Brien,
1

CJam , 11 bajtów

lS%_,f{Se[}

Wypróbuj online!(Jako zestaw testowy.)

Wyjaśnienie

l      e# Read input.
S%     e# Split around spaces.
_,     e# Copy and get length.
f{     e# Map this block over the list, passing in the length on each iteration.
  Se[  e#   Left-pad to the given length with spaces.
}
Martin Ender
źródło
1

Kotlin, 90 bajtów

Gra w golfa:

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

Nie golfowany:

fun main(a: Array<String>) {
    a.forEach { b ->
        for (i in 1..a.size - b.length) {
            print(" ")
        }
        print(b)
    }
}
Psyduck77
źródło
1

Haskell, 47 bajtów

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

Jest to funkcja od listy ciągów do listy ciągów, takich jak odpowiedzi JavaScript. replicatepozwala uzyskać listę (ciągi Haskella są listami znaków) o danym rozmiarze, więc używam jej - i pogrubionego założenia w problemie - do generowania wypełnienia (jego długość to N<długość elementu>, dla każdego elementu listy wejść). Wolałbym używać printfrozwiązania opartego na tym replicate( z jednym byłoby krótsze), ale instrukcja importu zabija wszelkie oszczędności na samej funkcji.

arjanen
źródło
1

Java, 83 82 bajty

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

Konstruuje ciąg formatu zaprojektowany do wypełniania podanych argumentów liczbą spacji równych długości tablicy. Ciąg formatu służy jako argument String.format, a wynik jest następnie zwracany. Interfejs funkcjonalny może akceptować albo a String[], Integer[]albo podobny.

Pełna klasa:

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}));
    }
}

Wypróbuj na Ideone.

-1 bajt dzięki @KevinCruijssen.

TNT
źródło
Niezłe podejście, +1. Możesz int ...s+=...iffor(int i=a.length,j=i;i-->0;s+="%"+j+"s");
zagrać w
1

Groovy, 36 bajtów

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

Pobiera tylko szereg ciągów, wyświetla tablicę wypełnionych ciągów.

Urna Magicznej Ośmiornicy
źródło
1

MATL, 14 bajtów

'%%%dd'inYDGYD

Wypróbuj to w MATL Online

Używa to sformatowanego ciągu znaków, najpierw konstruując ciąg formatu: %(NUM)da następnie stosuje ponownie formatowanie ciągu przy użyciu tego ciągu formatu i danych wejściowych.

Suever
źródło
1

JavaScript 33 bajty

podobny do @Hedi - ale domyślnym dopełnieniem jest '', więc jego 4 znaki mniej

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"]))

DanielIndie
źródło
1

K (oK) , 11 bajtów

Rozwiązanie:

,/(-#x)$$x:

Wypróbuj online!

Wyjaśnienie:

Interpretowane od prawej do lewej. Konwertuj na ciąg i lewy pad o długości listy, a następnie spłaszcz:

,/(-#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"
Streetster
źródło
0

Pyth - 7 bajtów

Prosta odpowiedź za pomocą wbudowanego paddingu.

sm.[;lQ

Pakiet testowy .

Maltysen
źródło
0

C #, 39 bajtów

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

Bierze a List<string>i wyprowadza a List<string>.

Wyjaśnienie:

/*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'
    )
;

Byłoby kilka bajtów krótszych, aby użyć LINQ, jeśli import nie jest liczony, a następnie zwraca IEnumerable<string>zamiast pełnej listy:

C #, 35 + 18 = 53 bajty

using System.Linq;s=>s.Select(c=>c.PadLeft(s.Count));
mleko
źródło
0

R, 47 bajtów

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

Odczytuje dane wejściowe ze standardowego wejścia i używa C-style formatowania z sprintf. Powinien być jakiś sposób, aby catfunkcja nie była potrzebna, ale bez niej nie mogłaby znaleźć sposobu na ukrycie cudzysłowów. Jeśli chcemy tylko cytatów początkowych i końcowych, moglibyśmy użyć nieco dłuższej opcji:

paste0(sprintf("%*.f",length(n<-scan()),n),collapse="")
Billywob
źródło