Kelime Şekillendirme Sanatı


21

Kelime Şekillendirme Sanatı

İkili bir matris ve bir harf dizisi verildiğinde, matristeki tüm 1'leri soldan sağa, dizenin harfleriyle değiştirin. Harfler matris şeklinde oluşturulduktan sonra, 0'ları boşluklarla değiştirerek matrisi yazdırın. Bir veya iki örnek vermek muhtemelen daha kolay.


Dava: Temel dava ...

Bir Giriş:

[0,0,1,0,0]
[0,1,0,1,0]
[1,0,0,0,1]
[0,1,0,1,0]
[0,0,1,0,0]

"PPCGPPCG"

Çıktı Bir:

  P    
 P C  
G   P
 P C 
  G  

Durum: Giriş dizgisi sayı sayısından uzunsa ...

İki giriş:

[1,0,0]
[0,1,0]
[1,0,1]

lambda

İkinci Çıktı:

l  
 a 
m b

Durum: Giriş dizgisi sayı sayısından kısa ise ...

Giriş Üç:

[1,1,1]
[1,0,1]
[1,1,1]

PPCG

Çıkış üç:

PPC
G P
PCG

Mevcut Varsayımlar

  • Giriş dizesinin asla boş olmadığını kabul edebilirsiniz.
  • Matrisin asla boş olmayacağını varsayabilirsiniz.
  • İkili matrisin hiçbir zaman sıfır olmayacağını varsaymayabilirsiniz.

kurallar

  • Dize bir tanesinden daha kısaysa, dizeyi tekrarlayın; herkes değiştirilmelidir.
  • Dize, sayıdan daha uzunsa, yalnızca gerekenleri kullanın.
  • Giriş için tamsayı / bit yerine True / False komutunu kullanabilirsiniz.
  • Sondaki boşluklar GEREKLİDİR, tüm sıfırlar boşluklarla değiştirilmelidir .
  • Tek bir izleyen yeni satır kabul edilebilir.
  • Bu kod golf, en düşük bayt sayısı kazanıyor.

Matrisin bir dizi olarak girilmesi gerekiyor mu yoksa çok satırlı bir dize kullanabilir miyim?
Titus,

@Titus sorun değil, Martin Ender çoktan yaptı.
Magic Octopus Urn,

Temel durum sağa bırakılmaz. Yukarıdan aşağıya, sonra soldan sağa mı demek istiyorsun?
edc65

1
Matris, örneğin, 2x2 sıfır ızgarasıysa, tek bir boşluk mu yoksa 2x2 boşluk ızgarası mı vermeliyiz?
artificialnull

@ pieman2201, daha iyi olması için 4 numaralı test senaryosunu temizledi.
Magic Octopus Urn,

Yanıtlar:


3

MATL , 11 bayt

yz:)1Gg!(c!

Girişler sayısal bir matristir ( ;satır ayırıcı olarak) ve bir dizedir.

Çevrimiçi deneyin! Veya test durumlarını doğrulayın: 1 , 2 , 3 .

y       % Take the two inputs implicitly. Duplicate the first
        % STACK: [1,0,0; 0,1,0; 1,0,1], 'lambda', [1,0,0; 0,1,0; 1,0,1]
z       % Number of nonzeros
        % STACK: [1,0,0; 0,1,0; 1,0,1], 'lambda', 4
:       % Range
        % STACK: [1,0,0; 0,1,0; 1,0,1], 'lambda', [1 2 3 4]
)       % Reference indexing (select values)
        % STACK: [1,0,0; 0,1,0; 1,0,1], 'lamb'
1Gg     % Push first input as a logical matrix; will be used as index
        % STACK: [1,0,0; 0,1,0; 1,0,1], 'lamb', [1,0,0; 0,1,0; 1,0,1]
!       % Transpose. This is necessary because MATL uses column-major order
        % (down, then accross)
(       % Assignment indexing (fill with values). Since the original matrix
        % is numeric, the new values are introduced as their ASCII codes
        % STACK: [108, 0, 109; 0, 97, 0; 1, 0, 98]
c       % Convert to char
        % STACK: ['l m'; ' a '; '  b']
!       % Transpose back. Implicitly display
        % STACK: ['l  '; ' a '; 'm b']

MATL her zaman koleksiyonları nasıl gördüğümü yeniden tanımlıyor ...
Magic Octopus Urn

@carusocomputing Matlab'da olduğu gibi, ana veri tipi "dikdörtgen" dizilerdir: matrisler veya n-boyutlu analogları. Sayılar, karakterler veya Boolean değerleri içerebilirler. Python'un listeleri gibi keyfi şeyler içerebilen hücre dizileri de var
Luis Mendo

Açık 2 hafta sonra seçilen en iyi cevap.
Magic Octopus Urn

8

Vim, 44 42 bayt

qqy$P0xjf1"_xP{@qq@q:s/0/ /g^M:s/,/^V^M/g^M{D

@DjMcMoylex sayesinde 2 bayt kaydedildi !

Burada, ^Mbir hazır satır olduğunu ve ^VbirCTRL-V

Bu formattaki girişi alır:

PPCG
00100,01010,10001,01010,00100

Feragatname: Dize ~ 40 karakterden uzunsa, bilgisayarınız ram bitebilir.

Açıklama:

qq             @qq@q                            # Start recording a recursive macro.
  y$P0x                                         # Duplicate the string and cut out the first character
       jf1"_xP{                                 # Find the first 1, and replace it with the cut character from the string.
                                                # Now we have replaced all the 1's with their respective character, but we still have the array in the original format, and we have the string massivly duplicated at the first line, so we need to clean it up:
                    :s/0/ /g^M                  # Replace all 0's with a space
                              :s/,/^V^M/g^M     # Replace all ,'s with a newline. The ^V acts like a backslash, it escapes the newline so that the command isn't run too soon
                                           {D   # Delete the first line

İşte benim "program" çalışan "benim bir gif:

Me typing the keys


1
Hahaha, sorumluluk reddini seviyorum.
Magic Octopus Urn,

Birkaç çıkarmak için {yerine kullanabilirsiniz gg.
DJMcMayhem

Tamam, GIF gerçekten temiz, ama sadece bağlantı yoluyla ekleyebileceğinizi düşünüyor musunuz? Benim krom ben :( geçmiş kaydırmak için deneyin her zaman kalıyor
wnnmaw

6

Retina , 41 33 bayt

0

+1`(.)(.*)(\D+)1
$2$1$3$1
A1`

Çevrimiçi deneyin!

Giriş dizesi girişin ilk satırında ve ardından matris tarafından verilir. Retina'da liste kavramı yoktur (ya da karakter dizileri dışında gerçekten bir şey yoktur), satır matemlerinin satırları ayırması dışında ikili matriste ayırıcılar yoktur.

açıklama

0

Sıfırları boşluklara dönüştürür.

+1`(.)(.*)(\D+)1
$2$1$3$1

1Bu karakteri giriş dizesinin sonuna döndürürken, ilk önce giriş dizesinin ilk karakteri ile tekrar tekrar değiştirin . Bu 1, giriş dizesindeki karakterlerden daha fazla s olduğu halleri dikkate alır .

A1`

İlk satırı, yani giriş dizesini atın.


2
(.)(.*)- Teehee ...
Magic Octopus Urn

6

JavaScript ES6, 67 53 50 49 bayt

@ETHproductions sayesinde 3 bayt kurtarıldı @Neil sayesinde 1 kayıt daha kaydedildi

(a,b,i)=>a.replace(/./g,c=>+c?b[++i]||b[i=0]:' ')

f=
(a,b,i)=>a.replace(/./g,c=>+c?b[++i]||b[i=0]:' ')

G=_=>h.innerHTML = f(`00100
01010
10001
01010
00100`,z.value)
h.innerHTML = G()
<input id=z oninput="G()" value="PPCG"></input>
<pre id=h>

Eski kod daha önce dize matrislerinin geçerli bir girdi formatı olduğunu biliyordum:

(a,b)=>a.map(c=>c.map(d=>d?b[i++%b.length]:' ').join``,i=0).join`
`


Ben öneririz c=>' '[c]||b[i++%b.length], ama ne yazık ki bir bayt ... artık var
ETHproductions

1
Ancak, 3 bayttan tasarruf etmenin başka bir yolu var:(a,b,i)=>a.replace(/\d/g,c=>+c?b[++i]||b[i=0]:' ')
ETHproductions 14:16

Sanırım dizenin ikinci karakterinde başlayacak. Bir snippet güncellemesi iyi olurdu.
Titus,

1
@Titus İlk başta, iyani undefined, ++idöndürür NaN. Yana bhiçbir vardır NaNmülkiyet, b[++i]döner undefinedve ||operatör ayarı, sağ tarafı argüman çalışır ietmek 0ve ilk kömürü dönen b.
ETHProductions,

1
Neden test ediyorsun \d? .Sadece 0s ve 1s ile ilgilenmeniz gerektiğinden ( .yeni satırlarla eşleşmiyorsa) kesinlikle yeterli .
Neil

5

Perl, 40 bayt

36 bayt kod + -i -pbayrakları.

@F=$^I=~/./g;s/1/$F[$i++%@F]/g;y;0; 

(son boşluğa ve son satırın olmamasına dikkat edin).

Çalıştırmak için -ibayraktan sonra giriş dizesini yazın ve girilen matrisi girin:

perl -iPPCGPPCG -pe '@F=$^I=~/./g;s/1/$F[$i++%@F]/g;y;0; ' <<< "00100
01010
10001
01010
00100"

Perl'iniz biraz eskiyse (boşluktan sonra) bir son noktalı virgül eklemeniz gerekebilir.


5

Python 2, 114 71 bayt

Tekerleği yeniden icat ediyordum, çok hatlı bir ipte basit bir çift değiştirme oldukça iyi çalışıyor. Dize, s*len(L)*len(L[0])iç içe geçmiş bir liste için gerçekten çirkin yapmak yerine, doğrudan sıfırları saymanın avantajına sahiptir.

lambda S,s:S.replace("0"," ").replace("1","{}").format(*s*S.count('0'))

Eski çözüm:

lambda s,L:"\n".join(["".join(map(lambda n:chr(n+32),l)).replace("!","{}")for l in L]).format(*s*len(L)*len(L[0]))

Öncelikle biz her şeyi + 32 dönüştürmek chr(tümü sıfır boşluk haline), o zaman her yerini !ile {}kullanılmasına izin vermek için formatişlevini.

Eğer NULLbir boşluk olarak sayılabilir Ben hile ve kullanmaya karar verirseniz NULLyerine uzayın, ben 12 bayt kurtarmak için 32 eklenmesini atlayabilir. ( boşluk olarak printgörüntüler '\x00')

lambda s,L:"\n".join(["".join(map(chr,l)).replace('\x01','{}')for l in L]).format(*s*len(L)*len(L[0]))

NULL'ları kullanmak ve sonunda boşluk bırakmamaları daha kısa olmaz mıydı?
nedla2004

@ nedla2004, Bunu nasıl yapmamı önerirsin? Sadece bir .replace('\x00',' ')ucuna 20 bayt ekler
wnnmaw

Ama sonra bundan kurtulabileceğinizi düşünüyorum: harita (lambda n: chr (n + 32), l)
nedla2004 15:16

İkinci çözüm sonunda mekanlara takas, bana 12 bayt kaydeder bütün zaman, bundan daha beni mal olacak boş değerlere ile çalışır
wnnmaw

Aslında yapabileceğinden daha fazlasını çıkarabileceğini düşündüm.
nedla2004

3

APL, 18 bayt

{(⍴⍺)⍴X\⍵⍴⍨+/X←,⍺}

Bu, boole matrisini sol argümanı, dize de sağ argümanı olarak alan bir fonksiyondur.

      (↑(1 0 0)(0 1 0)(1 0 1)) {(⍴⍺)⍴X\⍵⍴⍨+/X←,⍺}'lambda'
l  
 a 
m b

Açıklama:

APL, böyle bir şey yapan bir yerleşike sahiptir \(genişletin). Ancak, yalnızca vektörler üzerinde çalışır ve gerçekte kullanılmasını gerektiren her karakter gerektirir.

  • X←,⍺: matrisi düzleştirin ve sonucu X'te saklayın.
  • ⍵⍴⍨+/X: karakter vektörünü gerekli eleman sayısına sahip olacak şekilde yeniden şekillendirin (bu gerekli olması halinde karakterleri tekrarlayarak dizgiyi uzatmayı da sağlar).
  • X\: Her biri için karakterlerden birini almak 1ve her biri için bir boşluk 0in X.
  • (⍴⍺)⍴: sonucu, orijinal matrisin şekline sahip olacak şekilde yeniden şekillendirin.

3

PHP, 110 91 97 88 82 81 80 75 bayt

@ user59178 sayesinde 6 bayt kaydedildi

while(""<$c=$argv[1][$i++])echo$c<1?$c?:" ":($s=$argv[2])[$k++%strlen($s)];

İle koş -r. İlk argümanda çok satırlı dize, ikinci argümanda dize olarak matris bekler.


1
Senin 82 dayanan bir 80 bayt sürümü sürümünü bayt: foreach(str_split($argv[1])as$c)echo$c<1?$c?:" ":($s=$argv[2])[$k++%strlen($s)];İki ternaries sırasını takas ve böylece kullanarak ikincisinden parantez düştü <1ziyade>0
user59178

1
4 bayt'ı for(;""!=$c=$argv[1][$i++];)yerineforeach(...)
user59178

3

PowerShell v2 +, 70 bayt

param($a,$b)$b|%{-join($_|%{if($_){$a[$n++];$n%=$a.length}else{' '}})}

Girdi kelimesini $ave matrisi bir dizi dizisi olarak alır $b(aşağıdaki örneklere bakınız). Geçiş yapar $b, sonra her satırın öğelerini geçirir $_|%{...}. İç döngü, çıktımızın ve dizenin uzunluğuna mod-eşit aldığımız veya bir boşluk çıkardığımız bir if/ elsekoşuludur . Bunlar tekrar bir ip haline getirilir. Dizelerin her biri boru hattında bırakılır ve program bitiminde yeni çizgilerle örtük çıktılar gerçekleşir .$a[$n++]' '-joinWrite-Output

PS C:\Tools\Scripts\golfing> .\the-art-of-word-shaping.ps1 'PPCGPPCG' @(@(0,0,1,0,0),@(0,1,0,1,0),@(1,0,0,0,1),@(0,1,0,1,0),@(0,0,1,0,0))
  P  
 P C 
G   P
 P C 
  G  

PS C:\Tools\Scripts\golfing> .\the-art-of-word-shaping.ps1 'lambda' @(@(1,0,0),@(0,1,0),@(1,0,1))
l  
 a 
m b

PS C:\Tools\Scripts\golfing> .\the-art-of-word-shaping.ps1 'PPCG' @(@(1,1,1),@(1,0,1),@(1,1,1))
PPC
G P
PCG


2

Python 3, 104 (veya 83) Bayt

import itertools as i
def f(s,L):s=i.cycle(s);return'\n'.join(' '.join(next(s)*e for e in l)for l in L)

Daha kısa bir seçenek var (83 Bayt), ancak dizenin gerekenden 999 kat daha kısa olması durumunda başarısız olur:

def f(s,L):s=list(s)*999;return'\n'.join(' '.join(s.pop(0)*e for e in l)for l in L)

İkinci çözüm benim için işe yaramıyor, çünkü nextbir listeyi arayamazsınız. Bunu yaparsanız s=iter(list(s)*999)(89 bayt)
L3viathan

1
@ L3viathan üzgünüm, demek istedim s.pop(0). Yanlış sürümü kopyaladığım anlaşılıyor.
Alissa,

s[i++%s.length()]pitonu bilmeme rağmen, iyi bir metodoloji.
Magic Octopus Urn,

Güzel olurdu, ama i++Python'da olduğu gibi bir şey yok
Alissa

1

Pyth, 12 bayt

jms?R@z~hZ\ 

Çevrimiçi deneyin: Gösteri

Açıklama:

jms?R@z~hZ\ dQ   implicit d and Q at the end
                 I use the variable Z, which is initialized with 0 by default
 m           Q   map each line d of the Q (input matrix) to:
   ?R       d       map each number d of the line either to
     @z~hZ             input[Z++] (increase Z, but lookup in input string with old value)
          \            or space
  s                 join chars to a string
j                print each string on a separate line


1

Ortak Lisp, 152 bayt

(defun m(g w)(let((a 0))(loop for r in g do(loop for e in r do(format t"~[ ~;~c~]"e(char w a))(if(= e 1)(setf a(mod(1+ a)(length w)))))(format t"~%"))))

Kullanımı:

* (m (list (list 1 0 1)
           (list 0 1 0)
           (list 1 0 1)) "ppcg")
p p
 c 
g p

Bu işlev, kılavuzun her satırındaki her bir öğe boyunca döngü oluşturur. formatEleman, bir 0 ya da eleman 1. Bir satır ızgaranın her satır sonra basılmış olur ise, karakter bağımsız değişkeni kullanır, kontrol dizisi bir boşluk basar ya. Dize çok kısa ise, baştan tekrar eder; çok uzunsa, yalnızca uygun kısım çıkarılır.


1

Pip , 18 bayt

17 baytlık kod, -lbayrak için +1 .

Yb{a?y@++vs}MMa^s

Diziyi, bunun gibi ilk komut satırı argümanı olarak alır: 100 010 101(kabukları içinde alıntı yapılması gerekir) ve ikinci komut satırı argümanı olarak dize.Çevrimiçi deneyin!

açıklama

                   a and b are cmdline args, s is space, v is -1
Yb                 Yank b into global variable y
              a^s  Split a on space into list of rows
  {        }MM     Map this function to the items of the items of a (i.e. each character):
   a               Function argument
    ?              Ternary operator (truthy if 1, falsey if 0)
       ++v         If truthy, increment v...
     y@            ... and use it to index into y (cyclically)
                   I.e.: each time we hit a 1, replace it with the next character of y
          s        If falsey, space
                   The result is a list of lists of characters; -l concats sublists and
                   newline-separates the main list

1

Java, 237 233 Bayt

Düzenleme: Mukul Kumar sayesinde 4 Byte kurtarıldı

golfed:

String T(int[][]m,String b){int l=m.length,a=0;String o="";for(int i=0;i<l;i++){for(int j=0;j<l;j++){if(m[i][j]==1&&a<b.length()){o+=Character.toString(b.toCharArray()[a]);a++;if(a== b.length()-1)a=0;}else o+=" ";}o+="\n";}return o;}

Ungolfed:

public String T(int[][] m, String b) {
    int l = m.length,a=0;
    String o = "";
    for(int i = 0; i < l; i++)
    {
        for(int j = 0; j < l; j++)
        {
            if(m[i][j] == 1 && a < b.length())
            {
                o += Character.toString(b.toCharArray()[a]);
                a++;

                if(a == b.length() - 1)
                    a = 0;
            }
            else
             o += " ";
        }
        o += "\n";
    }
    return o;
}

Test yapmak:

  int[][] matrix = new int[][]
  {{ 0, 0, 1, 0, 0 }, { 0, 1, 0, 1, 0 },
  { 1, 0, 0, 0, 1 },{ 0, 1, 0, 1, 0 },
  { 0, 0, 1, 0, 0 },};
  TheArtOfWordShaping taows = new TheArtOfWordShaping();
  System.out.println(taows.T(matrix, "PPCGPPCG"));

  matrix = new int[][] {{1,0,0}, {0,1,0}, {1,0, 1}};
  taows = new TheArtOfWordShaping();
  System.out.println(taows.T(matrix, "lamda"));

  matrix = new int[][] {{1,1,1},{1,0,1},{1,1, 1}};
  taows = new TheArtOfWordShaping();
  System.out.println(taows.T(matrix, "PPCG"));

  P  
 P C 
G   P
 P C 
  P  

l  
 a 
m d

PPC
P P
CPP

Tüm
int'yi

1

Pyke, 12 bayt

.FdRIKQoQl%@

Burada dene!

Bir karakter matrisi çıkarır

Veya 9 bayt, rekabetçi olmayan.

.FdRIKQo@

Burada dene!

  • Dizine eklenebilen dizine, dizine eklenebilen dizinin uzunluğundan daha büyük olduğunda kaydırma ekleyin. .F - deep_for (input) I - eğer ^: Qo @ - Q [o ++] dR - else ""

Daha da rekabetçi olmayan, 8 bayt

.FIQo@(P

Burada dene!

  • print_grid şimdi boş dizeleri düzgün şekilde hizalar
  • deep_for Şimdi gerçeklere göre farklı bir türün sahte üzerinde tip-tahmin yapmak

.F    (  -  deep_for(input)
 I       -   if ^:
  Qo@    -    input[o++]
       P - pretty_print(^)

1

Java, 122 bayt

String g(int[][]a,char[]b){String r="";int e=0;for(int[]c:a){for(int d:c){r+=d==0?' ':b[e++%b.length];}r+='\n';}return r;}

0

Mathematica, 76 bayt

""<>(s=#2;f:=(s=RotateLeft[s];Last[s]);Map[If[#1,f," "]&,#,{2}]~Riffle~"\n")&

İki argümanın adlandırılmamış işlevi; bunlardan ilki ( #) bir Trues ve Falses dizisidir ve ikincisi ( s) bir karakter listesidir. Yardımcı fonksiyon

f:=(s=RotateLeft[s];Last[s])

hamle, ilk karakteri ssonuna kadar hareket ettirir ve sonra o hareket ettirilen karakteri döndürür. fBirkaç kez aramak s, sırayla sırayla karakterleri döndürür .

Çekirdek işlevi

Map[If[#1,f," "]&,#,{2}]

giriş dizisindeki fher Truedeğeri çağırır ve her yanlış girişte boşluk döndürür. ( Dizinin bileşen listelerinde, bu listeler kendileri için değil, öğeler üzerinde çalışacaklarını {2}söyler Map.)

Bu 60 bayt, bir dizi karakter sve boşluk döndürür . Sarıcı

    ""<>(...~Riffle~"\n")&

bu dizinin listelerinin her birinin arasına yeni satırlar koyar ve ardından her şeyi birleştirir.


0

C ++, 61 bayt

for(auto&i:m){for(int&j:i)cout<<(j?s[k++%l]:' ');cout<<'\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.