Sztuka kształtowania słowa
Biorąc pod uwagę macierz binarną i ciąg liter, zamień wszystkie 1 w macierzy od lewej do prawej na litery tego ciągu. Po uformowaniu liter w kształt matrycy wydrukuj matrycę, zastępując zerami spacje. Prawdopodobnie łatwiej jest podać przykład lub dwa.
Case: Case base ...
Wejście pierwsze:
[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"
Wyjście pierwsze:
P
P C
G P
P C
G
Przypadek: jeśli ciąg wejściowy jest dłuższy niż liczba jedynek ...
Wejście drugie:
[1,0,0]
[0,1,0]
[1,0,1]
lambda
Wyjście drugie:
l
a
m b
Przypadek: jeśli ciąg wejściowy jest krótszy niż liczba jedynek ...
Wejście trzecie:
[1,1,1]
[1,0,1]
[1,1,1]
PPCG
Wyjście trzecie:
PPC
G P
PCG
Dostępne założenia
- Możesz założyć, że ciąg wejściowy nigdy nie jest pusty.
- Możesz założyć, że matryca nigdy nie będzie pusta.
- Nie można zakładać, że macierz binarna nigdy nie będzie miała samych zer.
Zasady
- Jeśli ciąg znaków jest krótszy niż liczba jedynek, powtórz ciąg; wszystkie muszą zostać wymienione.
- Jeśli ciąg jest dłuższy niż liczba jedynek, użyj tylko tego, co jest potrzebne.
- Możesz użyć True / False zamiast liczb całkowitych / bitów dla danych wejściowych.
- Końcowe spacje SĄ WYMAGANE, wszystkie zera muszą być zastąpione spacjami.
- Pojedynczy znak nowej linii jest dopuszczalny.
- To jest golf golfowy, wygrywa najmniej bajtów.
Odpowiedzi:
MATL , 11 bajtów
Dane wejściowe to macierz numeryczna (z
;
separatorem wierszy) i ciąg znaków.Wypróbuj online! Lub sprawdź przypadki testowe: 1 , 2 , 3 .
źródło
Vim,
4442 bajtyZaoszczędź 2 bajty dzięki @DjMcMoylex !
Tutaj
^M
jest dosłownie nowa linia, i^V
jestCTRL-VPobiera dane wejściowe w tym formacie:
Oświadczenie: Jeśli ciąg znaków jest dłuższy niż ~ 40 znaków, na komputerze może zabraknąć pamięci RAM.
Wyjaśnienie:
Oto gif mojego „uruchamiania” „programu”:
źródło
{
zamiastgg
wziąć parę.Siatkówka ,
4133 bajtówWypróbuj online!
Łańcuch wejściowy jest podany w pierwszym rzędzie danych wejściowych, a następnie macierz. Ponieważ Retina nie ma pojęcia list (a tak naprawdę niczego poza ciągami znaków), w macierzy binarnej nie ma żadnych separatorów, z wyjątkiem kanałów do oddzielnych wierszy.
Wyjaśnienie
Zamienia zera w spacje.
Wielokrotnie zamień pierwszy
1
na pierwszy znak ciągu wejściowego, jednocześnie obracając ten znak na koniec ciągu wejściowego. Dotyczy to przypadków, gdy1
w ciągu wejściowym znajduje się więcej s niż znaków.Odrzuć pierwszy wiersz, tzn. Ciąg wejściowy.
źródło
(.)(.*)
- Teehee ...JavaScript ES6,
67535049 bajtówZaoszczędź 3 bajty dzięki @ETHproductions Zaoszczędź jeszcze 1 dzięki @Neil
Stary kod, zanim wiedziałem, że macierze łańcuchowe są poprawnym formatem wejściowym:
Pokaż fragment kodu
źródło
c=>' '[c]||b[i++%b.length]
, ale niestety jest to bajt dłużej ...(a,b,i)=>a.replace(/\d/g,c=>+c?b[++i]||b[i=0]:' ')
i
jestundefined
, więc++i
wracaNaN
. Ponieważb
nie maNaN
własności,b[++i]
powrotyundefined
, a||
operator uruchamia jego prawym boku argumentu, ustawieniei
się0
i zwracając pierwszy charb
.\d
? Na pewno.
wystarczy, ponieważ masz do czynienia tylko z0
s i1
s (.
nie pasuje do nowej linii).Perl, 40 bajtów
36 bajtów kodu +
-i -p
flagi.(zwróć uwagę na ostatnią przestrzeń i brak końcowej nowej linii).
Aby go uruchomić, napisz ciąg wejściowy za
-i
flagą i podaj macierz na wejściu:Jeśli twój Perl jest nieco stary, może być konieczne dodanie końcowego średnika (po spacji).
źródło
Python 2,
11471 bajtówOkazuje się, że odświeżyłem koło, prosta podwójna wymiana na sznurku wielowierszowym działa całkiem dobrze. Dodatkową zaletą łańcucha jest możliwość bezpośredniego zliczania zer zamiast konieczności wykonywania naprawdę brzydkiej
s*len(L)*len(L[0])
listy zagnieżdżonejStare rozwiązanie:
Najpierw musimy konwertować wszystko + 32 z
chr
(same zera stać przestrzenie), a następnie zastąpić wszystkie wymienione!
w{}
celu umożliwienia korzystania zformat
funkcji.JeśliJeśli zdecyduję się oszukać i użyćNULL
można to zaliczyć jako spacjęNULL
zamiast spacji, mogę pominąć dodanie 32, aby zaoszczędzić 12 bajtów. (print
wyświetla się'\x00'
jako spacja)źródło
.replace('\x00',' ')
na końcu dodaje 20 bajtówAPL, 18 bajtów
Jest to funkcja, która przyjmuje macierz boolowską jako lewy argument, a łańcuch jako prawy argument.
Wyjaśnienie:
APL ma wbudowaną funkcję, która robi coś takiego
\
(rozwiń). Działa jednak tylko na wektorach i wymaga faktycznego użycia każdej postaci.X←,⍺
: spłaszcz macierz i zapisz wynik w X.⍵⍴⍨+/X
: przekształć wektor znaków, tak aby zawierał wymaganą liczbę elementów (zajmuje się także wydłużaniem łańcucha przez powtarzanie znaków, jeśli to konieczne).X\
: weź po jednym znaku dla każdego1
i spację dla każdego0
wX
.(⍴⍺)⍴
: przekształć wynik, aby miał kształt oryginalnej matrycy.źródło
PHP,
11091978882818075 bajtówzapisano 6 bajtów dzięki @ user59178
Uruchom z
-r
. Oczekuje, że macierz jako ciąg wielowierszowy w pierwszym argumencie, ciąg w drugim argumencie.źródło
foreach(str_split($argv[1])as$c)echo$c<1?$c?:" ":($s=$argv[2])[$k++%strlen($s)];
zamieniłem kolejność dwóch trójskładników i w ten sposób upuściłem nawiasy<1
>0
for(;""!=$c=$argv[1][$i++];)
zamiastforeach(...)
PowerShell v2 +, 70 bajtów
Pobiera słowo wejściowe jako,
$a
a macierz jako tablicę tablic jako$b
(patrz przykłady poniżej). Pętle$b
, a następnie pętle przez elementy każdego rzędu$_|%{...}
. Pętla wewnętrzna jest warunkiemif
/else
, w którym albo wypisujemy$a[$n++]
i przyjmujemy mod-równy długości łańcucha, albo wypisujemy spację' '
. Są one-join
edytowane razem z powrotem w ciąg. Każdy ciąg jest pozostawiony w potoku, a dorozumiane dane wyjściowe z nowymi liniami pomiędzy sąWrite-Output
realizowane po zakończeniu programu.źródło
Groovy, 63
źródło
Python 3, 104 (lub 83) bajtów
Istnieje krótsza opcja (83 bajty), ale nie powiedzie się, jeśli ciąg znaków będzie ponad 999 razy krótszy niż potrzeba:
źródło
next
na listę. Jeśli to zrobisz, zrobis=iter(list(s)*999)
to (89 bajtów)s.pop(0)
. Wygląda na to, że skopiowałem złą wersję, naprawiłem to.s[i++%s.length()]
to dobra metodologia, choć nie znam Pythona.i++
w PythoniePyth, 12 bajtów
Wypróbuj online: demonstracja
Wyjaśnienie:
źródło
ES6, 78 bajtów
próbowałem
źródło
Common Lisp, 152 bajty
Stosowanie:
Ta funkcja przechodzi przez każdy element każdego rzędu siatki.
format
Ciąg kontrola albo drukuje miejsca, jeśli element jest 0 lub zużywa argument znaków jeśli element jest 1. Nowa linia zostanie wydrukowany po każdym wierszu siatki. Jeśli ciąg jest zbyt krótki, powtarza się od początku; jeśli jest za długi, wysyłana jest tylko odpowiednia część.źródło
Pip , 18 bajtów
17 bajtów kodu, +1 dla
-l
flagi.Pobiera tablicę jako pierwszy argument wiersza polecenia:
100 010 101
(musi być cytowany w powłokach), a ciąg znaków jako drugi argument wiersza poleceń.Wypróbuj online!Wyjaśnienie
źródło
Java,
237233 bajtówEdycja: zapisano 4 bajty dzięki Mukulowi Kumarowi
Gra w golfa:
Nie golfowany:
Testowanie:
źródło
Pyke, 12 bajtów
Wypróbuj tutaj!
Wyprowadza macierz znaków
Lub 9 bajtów, niekonkurencyjne.
Wypróbuj tutaj!
Jeszcze bardziej niekonkurencyjny, 8 bajtów
Wypróbuj tutaj!
print_grid
teraz poprawnie wyrównuje puste ciągideep_for
teraz zgaduje na podstawie fałszów innego typu niż prawdyW pobliżu
źródło
Java, 122 bajty
źródło
Mathematica, 76 bajtów
Nienazwana funkcja dwóch argumentów, z których pierwszy (
#
) jest tablicąTrue
s iFalse
s, a drugi (s
) jest listą znaków. Funkcja pomocnikajest zdefiniowany, co stawia ruchy pierwszego znaku
s
do końca, a następnie zwraca ten właśnie przeniesiony znak.f
Kilkukrotne wywołanie cyklicznie zwróci znakis
w kolejności.Podstawową funkcją jest
który wzywa
f
każdegoTrue
wartość w tablicy wejściowej i zwraca spację na każdym fałszywym wejściu. ({2}
Mówi,Map
aby pracować na elementach list komponentów tablicy, a nie na samych listach).Te 60 bajtów zwraca tablicę znaków-z-
s
i spacji. Opakowanieumieszcza znaki nowej linii między listami każdej tablicy, a następnie łączy wszystko.
źródło
C ++, 61 bajtów
źródło