Şeritlerindeki rakamlar


32

Giriş:

Bir tamsayı listesi

Çıktı:

Her basamağı (ve eksi işaretini) -0123456789, herhangi bir kopyalanan basamağı yok sayarak sırasına göre kendi şeridine koyun .

Örnek:

Giriş: [1,729,4728510,-3832,748129321,89842,-938744,0,11111]

Çıktı:

-0123456789  <- Added as clarification only, it's not part of the output

  1         
   2    7 9
 012 45 78 
-  23    8 
  1234  789
   2 4   89
-   34  789
 0         
  1        

Meydan okuma kuralları:

  • Rakamdaki kopyalanan rakamlar yoksayılır.
  • G / Ç herhangi bir makul biçimde olabilir. Giriş, bir dizi / karakter dizisi veya karakter dizisi olabilir. Çıktı, dizgelerin, karakterlerin, karakter matrislerinin vs. bir listesi olabilir.
  • Sondaki boşluklar isteğe bağlıdır.
  • Herhangi bir satır aralığı veya sondaki yeni satırlar isteğe bağlıdır (ancak satırlar arasında değil).
  • Giriş her zaman en az bir tam sayı içerecektir
  • En azından -2,147,483,648olsa da 2,147,483,647(32-bit) bir tamsayı aralığını desteklemeniz gerekir .
  • Girdi-liste içerirler asla -0, 00(veya ikiden fazla sıfır) veya, başında sıfır (yani sahip tamsayılar 012).
  • Diliniz negatif sayılar için farklı bir sembol kullanıyorsa (bir üst gibi ¯), tutarlı olduğu sürece bunun yerine onu kullanmanıza da izin verilir.
  • Tutarlı bir şekilde bir boşluk sınırlandırıcısına sahip olmanıza izin verilir (bu nedenle , tutarlı olduğu sürece - 0 1 2 3 4 6 7 9(bunun yerine 5 veya 8 olmayan bir satır olabilir -01234 67 9) (ve bu nedenle -ve arasında bir boşluk olmalıdır 0).

Genel kurallar:

  • Bu , bayt cinsinden en kısa cevap kazanır.
    Code-golf dillerinin, codegolfing olmayan dillerle cevap göndermekten vazgeçmesine izin vermeyin. Herhangi bir programlama dili için mümkün olduğunca kısa bir cevap bulmaya çalışın.
  • Cevabınız için standart kurallar geçerlidir , bu nedenle STDIN / STDOUT fonksiyonlarını, uygun parametrelerle fonksiyonlarını ve geri dönüş tipini, tam programları kullanmanıza izin verilir. Senin çağrı.
  • Varsayılan Loopholes yasaktır.
  • Mümkünse, lütfen kodunuz için test içeren bir bağlantı ekleyin.
  • Ayrıca, lütfen gerekirse bir açıklama ekleyin.

Test durumları:

Input: [1,729,4728510,-3832,748129321,89842,-938744,0,11111]
Output:
  1         
   2    7 9
 012 45 78 
-  23    8 
  1234  789
   2 4   89
-   34  789
 0         
  1        

Input: [4,534,4,4,53,26,71,835044,-3559534,-1027849356,-9,-99,-3459,-3459,-94593,-10234567859]
Output:
      4     
     345    
      4     
      4     
     3 5    
    2   6   
   1     7  
  0  345  8 
 -   345   9
 -0123456789
 -         9
 -         9
 -   345   9
 -   345   9
 -   345   9
 -0123456789

Input: [112,379,-3,409817,239087123,-96,0,895127308,-97140,923,-748]
Output:
  12       
   3    7 9
-  3       
 01 4   789
 0123   789
-      6  9
 0         
  123 5 789
-01  4  7 9
   23     9
-    4  78 

Input: [-15,-14,-13,-12,-11,10,-9,-8,-7,-5,-4,-3,-1,0,9,100,101,102,1103,104,105,106,116,-12345690]
Output:
- 1   5    
- 1  4     
- 1 3      
- 12       
- 1        
-01        
-         9
-        8 
-       7  
-     5    
-    4     
-   3      
- 1        
 0         
          9
 01        
 01        
 012       
 01 3      
 01  4     
 01   5    
 01    6   
  1    6   
-0123456  9

Input: [99,88,77,66,55,44,33,22,11,10,0,0,0,-941]
Output:
          9
         8 
        7  
       6   
      5    
     4     
    3      
   2       
  1        
 01        
 0         
 0         
 0         
- 1  4    9

Rakamlar arasındaki boşluklara çıktıda izin verilir mi?
Shaggy

Biz üst eksi kullanabilir miyim ¯yerine -?
Uriel

Eksik sayılar hala boşluklarla değiştirilir, bu nedenle, örneğinizde 4 ve 6 ile 7 ve 9 arasında 3 boşluk olur: "-0 1 2 3 4 <space> 6 7 <space> 9"(Bazı nedenlerden dolayı yorumlarda birden fazla boşluk daraltılır)
Shaggy

1
Bunu senin yanına gizlice sokmayı umuyordum! : D İyi benekli!
Shaggy

Yanıtlar:


4

Stax , 8 bayt

║V≡u╝─é╢

Koş ve hata ayıkla

Standart girişte satır başına bir sayı alır. Her karakterin hedef dizinini bularak ve sonucun o dizinine atayarak çalışır. Dizin sınırların dışındaysa, dizilinceye kadar sıfır ile genişletilir. Çıktı sırasında 0bir boşluk olur. Gerisi karakter kodlarıdır.

Ambalajsız, ağzı açılmış ve yorumlanmış, göründüğü gibi.

m       for each line of input, execute the rest of the program and print the result
 zs     put an empty array under the line of input
 F      for each character code in the line of input, run the rest of the program
  Vd    "0123456789"
  I^    get the index of the character in this string and increment
  _&    assign this character to that index in the original string

Bunu çalıştır


Biri bir tane uzunluk listesi girmenin anlamı nedir? (Eğer sadece değer veya değer ve yeni bir satır ise işe yaramaz.)
Jonathan Allan

1
Ah evet, iyi nokta. Tekli değerler için de çalışan alternatif bir giriş şeklidir ["7"]. Bu format aynı zamanda gibi birden çok değeri işleyebilir ["34", "43"].
özyinelemeli

6

05AB1E , 13 bayt

Kod:

v'-žh«DyмSð:,

05AB1E kodlamasını kullanır . Çevrimiçi deneyin!

Açıklama:

v               # For each element in the input..
 '-žh«          #   Push -0123456789
      D         #   Duplicate this string
       yм       #   String subtraction with the current element
                    e.g. "-0123456789" "456" м  →  "-0123789"
         Sð:    #   Replace all remaining elements with spaces
                    e.g. "-0123456789" "-0123789" Sð:  →  "     456   "
            ,   #   Pop and print with a newline

1
Güzel!
Değişim

2
@Emigna Ekleme rotası da çok ilginç bir yaklaşım. Aslında, 4 bayt vðTúyvyÐd+ǝ},;) ile kaydedebilirsiniz düşünüyorum .
Adnan

1
Parlak! ǝBöyle çalışacağını bilmiyordum -0. Ama şimdi bunun bir parçası olduğuma göre, bu aslında bir sayıdır ve ilk önce okuduğum gibi bir dize değildir: P
Emigna

Ooooof ... 23 byte idi. 05AB1E (insanlığı cezalandırmak).
Magic Octopus Urn


4

JavaScript, 59 58 bayt

Dizge dizisi olarak girdi ve çıktı.

a=>a.map(x=>`-0123456789`.replace(eval(`/[^${x}]/g`),` `))

Dene

o.innerText=(g=s=>(f=
a=>a.map(x=>`-0123456789`.replace(eval(`/[^${x}]/g`),` `))
)(s.split`,`).join`\n`)(i.value="1,729,4728510,-3832,748129321,89842,-938744,0,11111");oninput=_=>o.innerText=g(i.value)
input{width:100%;}
<input id=i><pre id=o></pre>


orijinal

Dizeleri bir dizi olarak girdi alır ve bir dizi karakter dizisi çıkarır

a=>a.map(x=>[...`-0123456789`].map(y=>-~x.search(y)?y:` `))


1
Böyle zarif bir çözüm, gerçekten beğendim.
Brian H.


3

05AB1E , 17 13 bayt

Adnan sayesinde 4 byte kurtarıldı

vðTúyvyÐd+ǝ},

Çevrimiçi deneyin!

açıklama

v               # loop over elements y in input
 ðTú            # push a space prepended by 10 spaces
    yv          # for each element y in the outer y
      y         # push y
       Ðd+      # push y+isdigit(y)
          ǝ     # insert y at this position in the space-string
           }    # end inner loop
            ,   # print

3

Ruby , 42 bayt

Sayı dizisini işleyen anonim lambda:

->a{a.map{|n|"-0123456789".tr"^#{n}",?\s}}

Çevrimiçi deneyin!

Alternatif olarak, tamamen Perl benzeri bir tam program çok daha kısadır. -plAnahtarların bu bağlamda oldukça komik göründüğünü söyleyebilirim :

Ruby -pl , 29 bayt

$_="-0123456789".tr"^#$_"," "

Çevrimiçi deneyin!

Son olarak, çıkış dizelerinin alıntılanması kabul edilebilirse aşağıdakiler mümkündür:

Ruby -n , 27 bayt

p"-0123456789".tr ?^+$_,?\s

Çevrimiçi deneyin!


3

JavaScript (Node.js) , 60 bayt

  • @Andrew Taylor'a üyeliğin azaltılmasından dolayı teşekkür ederiz (8 karakter)
  • X.match için @Yair Rand'a teşekkür ederiz (8 karakter)
a=>a.map(X=>"-0123456789".replace(/./g,x=>X.match(x)?x:" "))

Çevrimiçi deneyin!


Ah, bu joinnumara çok güzel - ama bir dizi karakter dizisi gibi okunan bir soru OK çıktısı, belki de 8 byte'ı kaldırabilirsin.
Andrew Taylor

Oldukça emin değiştirerek başka kaydedebilirsiniz (X+"").includes(x)ileRegExp(x).test(X)
Andrew Taylor

(X+"").match(x)daha kısa olurdu. Bu soru aynı zamanda girdilerin bir dizi dizge olmasına izin verir, böylece olabilir X.match(x).
Yair Rand

2

Japt , 16 bayt

Dizge dizisi olarak girdi ve çıktı.

£Ao ¬i- ®iS gXøZ

Dene


açıklama

£                    :Map over each element X
 Ao                  :  Range [0,10)
    ¬                :  Join to a string
     i-              :  Prepend "-"
        ®            :  Map over each character Z
         iS          :    Prepend a space
            g        :    Get the character at index
             XøZ     :      X contains Z? (true=1, false=0)

2

Python 3 , 77 64 bayt

@Rod sayesinde -12 bayt

lambda x:[[[" ",z][z in str(y)]for z in"-0123456789"]for y in x]

Çevrimiçi deneyin!

Python'da golf oynamadaki ilk uygun girişimim. Tavsiye edilir!

2B karakter dizisini döndürür.


1
Sen kullanabilirsiniz '-0123456789'yerine range(10)ve birinci blok ve takas damla str(z)ile zde python2 geçip kullanabilirsiniz `y`yerine str(y)( ``- eşdeğer ila + olan repr)
Çubuk

Gereksiz yer in "-.
Jonathan Frech


2

Haskell , 47 bayt

map(\s->do d<-"-0123456789";max" "[d|elem d s])

Çevrimiçi deneyin!

Kullanımları max bir boşluk beri hiçbir eleman exist, herhangi basamaklı veya eksi işareti daha küçük bir boşluk girmek için.

Çok fazla sayıda takip eden boşluk varsa, iki bayt kaydedilebilir:

45 bayt

map(\s->do d<-'-':['0'..];max" "[d|elem d s])

Çevrimiçi deneyin!


2

MATL , 13 bayt

"45KY2ht@gm*c

Giriş, bir hücre dizesi dizisidir. Çevrimiçi deneyin! Veya tüm test durumlarını doğrulayın .

açıklama

         % Implicit input: cell array of strings, for example {'1','729',...,'11111'}
"        % For each cell
  45     %   Push 45 (ASCII code of '-')
  KY2    %   Push predefined literal '0123456789'
  h      %   Concatenate horizontally: gives '-0123456789'
  t      %   Duplicate
  @      %   Push current cell, for example {'729'}
  g      %   Convert cell to matrix. This effectively gives the cell's contents, '729'
  m      %   Ismember: gives an array of zeros and ones indicating membership of each
         %   char from '-0123456789' in '729'. The result in the example is
         %   [0 0 0 1 0 0 0 0 1 0 1]
  *      %   Multiply, element-wise. Chars are implicity converted to ASCII 
         %   Gives the array [0 0 0 50 0 0 0 0 55 0 57] 
  c      %   Convert ASCII codes to chars. 0 is displayed as space. Gives the string
         %   '   2    7 9'
         % Implicit end
         % Implicilly display each string on a different line

2

J , 32 27 bayt

FrownyFrog sayesinde -5 bayt!

10|.":(10<."."0@[)}11$' '"0

Çevrimiçi deneyin!

Orijinal çözüm:

J , 32 bayt

(('_0123456789'i.[)}11$' '"0)@":

Açıklama:

@": karakterlere dönüştür

}11$' '"0 11 karakter dizisinin içeriğini bu karakterlerle değiştir

'_0123456789'i.[ Bu listedeki karakterlerin indeksleri ile gösterilen yerlerde

Çevrimiçi deneyin!


1
10|.":(10<."."0@[)}11$' '"0
FrownyFrog

@ FrownyFrog Güzel bir çözüm, teşekkürler!
Galen Ivanov

2

Google Sayfaları , 124 bayt

=Transpose(ArrayFormula(If(IsError(Find(Mid("-0123456789",Row($1:$11),1),Split(A1,",")))," ",Mid("-0123456789",Row($1:$11),1

Giriş, hücrede virgülle ayrılmış bir listedir A1. Çıktı aralığındadır ancak birçok girişleri giriş vardı edilir. (Formülü istediğiniz yere koyabilirsiniz, kolaylık olması için seçtim .) Sayfaların, formülü sonuna otomatik olarak dört parantez ekleyeceğini ve bu dört baytı kurtardığımızı unutmayın.B1:L??B1

Screenshot

Başka bir test durumu ve başka bir test durumu

Açıklama:

  • Mid("-0123456789",Row($1:$11),1) sırayla 11 karakterin her birini seçer.
  • Find(Mid(~),Split(A1,","))her giriş öğesinde bu karakterleri arar. Bu ya sayısal bir değer döndürür ya da bulunmazsa bir hata verir.
  • If(IsError(Find(~)," ",Mid(~))karakter bulunamazsa veya karakter ise bir boşluk döndürür. (Keşke kopyalamayı engellemenin bir yolu olsaydı)Mid(~) kısmı ama bir tanesini bilmiyorum)
  • ArrayFormula(If(~))Çok hücreli referansları yapan Mid(~)ve Find(~)çalışan şey budur. Aynı zamanda bir hücrede bir formülü yapan ve çoklu hücrelerde dönüş değerleridir.
  • Transpose(ArrayFormula(~)) döndürülen diziyi transpoze eder, çünkü yana doğru başlar.

2

Jöle , 12 bayt

ØD”-;¹⁶e?€Ʋ€

Çevrimiçi deneyin!

-2 Jonathan Allan, yapmadığım bir kuralı okudum.

TIO bağlantısında kullanılan G / Ç formatının, dize gösterimleri listesi olarak girilen ve satır listesi olarak çıkarılan asıl biçim olmadığını unutmayın.


1

Perl 6 , 35 bayt

{.map:{map {m/$^a/||' '},'-',|^10}}

Çevrimiçi deneyin!

Çıktı, regex eşleşmeleri veya boşluk karakterleri içeren bir karakter matrisidir.


Eğer 'giriş herhangi bir makul formatta olabilirse' stdin olabilir, o zaman muhtemelen -pebaşlangıçtaki $^a.$_
Phil H

@PhilH -pve -nher nasılsa buggy, en azından TIO'da . Nedense $_bloklara geçmedi. Görmek Örnek 1 , Örnek 2 .
nwellnhof

1

Java 8, 53 bayt

a->a.map(i->"-0123456789".replaceAll("[^"+i+"]"," "))

Benim kendi meydan okumam, başardığımda olacağımı düşündüğümden daha kolay.

Hem giriş hem de çıkış olarak a java.util.stream.Stream<String>.

Açıklama:

Çevrimiçi deneyin.

a->                              // Method with String-Stream as both input and return-type
  a.map(i->                      //  For every String in the input:
    "-0123456789"                //   Replace it with "-0123456789",
    .replaceAll("[^"+i+"]"," ")) //   with every character not in `i` replaced with a space


1

R , 96 75 bayt

for(i in scan())cat(paste(gsub(paste0("[^",i,"]")," ","-0123456789"),"\n"))

Çevrimiçi deneyin!

Bu regex yaklaşımını önerdiği için Kevin Cruijssen'e teşekkürler!

Stdin'den boşlukla ayrılmış tam sayılar olarak girdi alır ve eski sanatı stdout'a yazdırır.


Emin daha da golfed edilebilir ediyorum bu yüzden, çok iyi R bilmiyorum ama bu farklı yaklaşım 12 daha kısa bayt geçerli: function(N)for(i in N)cat(paste(gsub(paste("[^","]",sep=i)," ","-0123456789"),"\n")). (Tamsayı dizi yerine dize dizisi olarak girin.) Çevrimiçi olarak deneyin.
Kevin Cruijssen

@KevinCruijssen ah, güzel, evet, ben de onu aşağı golf.
Giuseppe

1

SOGL V0.12 , 14 13 bayt

{ø,{²²⁴WI1ž}P

Burada dene!

Açıklama:

{ø,{²²⁴WI1ž}P

{            repeat input times
 ø,            push an empty string and the next input above that
   {       }   for each character in the input
    ²²           push "0123456789"
      ⁴          copy the character on top
       W         and get it's index in that string (1-indexed, 0 for the non-existent "-")
        I        increment that (SOGL is 1-indexed, so this is required)
         1ž      at coordinates (index; 1) in the string pushed earlier, insert that original copy of the character
            P  print the current line

1

SNOBOL4 (CSNOBOL4) , 85 bayt

I	X =INPUT	:F(END)
	S ='-0123456789'
R	S NOTANY(X ' ') =' '	:S(R)
	OUTPUT =S	:(I)
END

Çevrimiçi deneyin!

I	X =INPUT	:F(END)		;* read input, if none, goto end
	S ='-0123456789'		;* set the string
R	S NOTANY(X ' ') =' '	:S(R)	;* replace characters of S not in X + space with space
	OUTPUT =S	:(I)		;* print S, goto I
END

1

Pyth, 14 bayt

VQm*d}dNs+\-UT

Dizelerin listesi olarak girdi alır ve her satır için dizelerin listesini çıkarır.
Burada dene

açıklama

VQm*d}dNs+\-UT
VQ                For each string in the input...
  m     s+\-UT    ... and each character in "-0123456789"...
     }dN          ... check if the character is in the string...
   *d             ... and get that character or an empty string.

1

Retina , 26 bayt

%"-0123456789"~`.+
[^$&]¶ 

Çevrimiçi deneyin! Not: Sondaki boşluk. Açıklama: Her giriş satırı için %alt aşamasını bir ~kez yürütür . ~Birinci satır sarar kendi alt aşamasını, çalıştırır [^ve ]<CR><SP>bir program varsa, o yerine geçer karakter olmayan boşluklar doğrultusunda. Bu "-0123456789"programa girişin verilen dize olduğunu belirtir ( $değişikliklere izin verilir, ancak bunlara ihtiyacım yok).


1

Perl 5 -n , 30 bayt

-İlk pozisyondan başka bir yerde görünebilirse işe yaramaz

#!/usr/bin/perl -n
say"-0123456789"=~s/[^$_]/ /gr

Çevrimiçi deneyin!


-Eğer bu doğru olabilirse ilk pozisyondan başka bir yerde görünebilirse işe yaramazsa, o zaman bu zorluğa cevap veremezsiniz, çünkü artık tamsayı olmazlardı. : P
Outgolfer Erik,


1

CJam , 20 bayt

qS%{'-10,+s_@-SerN}/

Çevrimiçi deneyin!

Girdiyi tam sayıların boşlukla ayrılmış listesi olarak kabul eder. @Adnans'ın yanıtı ile hemen hemen aynı yaklaşım.


1

C (gcc) , 95 94 bayt

c,d;f(l,n)char**l;{for(;n--;l++)for(c=0;c<12;)putchar(strchr(*l,d=c++?c+46:45)?d:d^58?32:10);}

Çevrimiçi deneyin!

Bir dizge listesi şeklinde giriş yapın. STDOUT çıkışına.


Sen kaldırarak golf bir byte can c++ve değişen d=c?c+47:için d=c++?c+46:.
Kevin Cruijssen

1

K4 , 30 27 bayt

Çözüm:

{?[a in$x;a:"-",.Q.n;" "]}'

Örnek:

q)k){?[a in$x;a:"-",.Q.n;" "]}'1 729 4728510 -3832 748129321 89842 -938744 0 11111
"  1        "
"   2    7 9"
" 012 45 78 "
"-  23    8 "
"  1234  789"
"   2 4   89"
"-   34  789"
" 0         "
"  1        "

Açıklama:

Girdiye bağlı olarak "-0123 ..." veya "" döndürün. Soldan sağa doğru yorumlanır. APL cevabı için rekabet yok :(

{?[a in$x;a:"-",.Q.n;" "]}' / the solution
{                        }' / lambda for each
 ?[      ;          ;   ]   / if[cond;true;false]
                .Q.n        / string "0123456789"
            "-",            / join with "-"
          a:                / save as a
       $x                   / convert input to string
   a in                     / return boolean list where each a in x
                     " "    / whitespace (return when false)

0

APL + WIN, 33 bayt

Bir dize olarak ekran girişi için ister

n←11⍴' '⋄n['-0123456789'⍳s]←s←⎕⋄n
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.