Wydaje się, że nigdy nie mamy dość wyzwań związanych z alfabetem ...
Przepis
Dany
- ciąg liter
S
i - dwie dodatnie liczby całkowite
M
,N
,
utwórz zupę alfabetyczną z literami S
zajmującymi losowe pozycje w prostokątnej misce o rozmiarze M
× N
, otoczonej nie alfabetycznym, spacji, która reprezentuje brzeg miski.
Pozycje nie używane przez litery powinny być wyświetlane jako spacje. Zobacz przykłady poniżej .
Zasady dodatkowe
- Rozmiar
M
×N
odnosi się do wnętrza miski. Rozmiar wraz z obręczą wynosiM+2
×N+2
. - Każda postać z
S
powinna pojawić się raz w misce, w innej pozycji ; to znaczy, jedna postać nie może zastąpić innej. S
może zawierać duplikaty . Na przykład, jeśliS
jest to sznurek'abcc'
, zupa musi zawierać jedena
, jedenb
i dwac
(wszystkie w różnych pozycjach).- Wejścia będą spełniać ograniczenia
M >= 1
,N >= 1
,1 <= length(S) <= M*N
. - Obrzeże miski może być dowolnym niealfabetycznym znakiem spacji , spójnym między przebiegami programu i wartościami wejściowymi.
- Pozycje liter w misce są losowe, więc wynik może się różnić przy każdym uruchomieniu programu z tymi samymi danymi wejściowymi.
- Biorąc pod uwagę dane wejściowe, każdy możliwy zestaw pozycji literowych powinien mieć niezerowe prawdopodobieństwo . Ponieważ nie można tego sprawdzić w kilku realizacjach programu, wyjaśnij, w jaki sposób twój kod to spełnia.
- Dozwolone są wiodące lub końcowe białe znaki wokół obręczy.
S
będą zawierać tylko wielkie litery. Jeśli chcesz, możesz wybrać tylko małe litery.- Wejścia i wyjścia są elastyczne jak zwykle. Na przykład wynikiem może być ciąg znaków z nowymi liniami, tablica znaków 2D lub lista linii.
- Programy lub funkcje są dozwolone w dowolnym języku programowania . Standardowe luki są zabronione.
- Najkrótszy kod w bajtach wygrywa.
Przykłady
Dane wejściowe są pokazane jako S, [M N]
, gdzie M
jest liczbą wierszy i N
liczbą kolumn. Znak #
jest używany do obręczy.
'O', [1 1]:
###
#O#
###
'HEY', [1 3]:
#####
#YHE#
#####
'HELLO', [4 11]:
#############
# O #
# H #
# LE #
# L #
#############
'ADVNJSGHETILMVXERTYIOJKCVNCSF', [8 12]:
##############
#K V L S #
# A V X H #
#T M C #
# I O N#
# YC #
# G I R SE#
# J F #
#JT D V EN #
##############
'OOOOOOOOOOXXXXX', [13 31]:
#################################
# X #
# O #
# #
# X #
# O #
# X O #
# O #
# X #
# O #
# X #
# O #
# O O O #
# O #
#################################
'ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ', [11 41]
###########################################
# JU#
# Q C M G R T U Y H #
# KI E H M YO #
# V BW I JC #
# SV D P B U #
# A F RF J KP E #
# E N TH Z #
# N BM O Q I AS N WX #
# S O K G L P Q #
#Z L T R L A F DD#
# V Y WX C G XZ #
###########################################
|+-
?Odpowiedzi:
05AB1E ,
2018161514 bajtówPobiera trzy dane wejściowe w kolejności: wysokość, szerokość, łańcuch. Wyjście jako dwuwymiarowa lista znaków.
Używa
8
jako granicy, ale może być dowolną cyfrą.-1 bajt dzięki @Grimy .
Wypróbuj online lub sprawdź wszystkie przypadki testowe . (TIO zawiera
}}J»
w stopce ładny wydruk wyniku; możesz go usunąć, aby wyświetlić rzeczywistą wyjściową listę znaków 2D).Wyjaśnienie:
źródło
*j
! Oto 13 dla starszych lub brzydkie 14 dla nowoczesnych (generuje tablicę znaków 2D).1,1,"O"
, więc myślę, że musi być również 14-bajtowy dla dziedzictwa. Dzięki za -1.APL (Dyalog Unicode) , 25 bajtów SBCS
Wypróbuj online!
-22 dzięki @ngn, -7 dzięki @ngn i @ Adám
Wyjaśnienie:
APL (Dyalog Extended) , 21 bajtów SBCSKąty obręczy są różnymi znakami
Wypróbuj online!
Użycie dfn do wyświetlenia tego pola.
źródło
'#',∘⌽∘⍉⍣4⊢⍴∘(?⍨∘≢⊃¨⊂)↑⍨∘(×/)
Wypróbuj online!{'#',∘⌽∘⍉⍣4⊢⍵⍴⍺\⍨(≢⍺)>?⍨×/⍵}
(lub≥
zamiast>
jeżeli⎕io=1
)'#',∘⌽∘⍉⍣4{⍵⍴⍺\⍨(≢⍺)>?⍨×/⍵}
'#',∘⌽∘⍉⍣4{⍵⍴⊃¨↓∘⍺¨?⍨×/⍵}
Python 3 , 110 bajtów
Wypróbuj online!
Losuje za pomocą
set
zrozumienia i zwraca tablicę znaków 2D.źródło
f'{s:{m*n}}'
część? Ponieważ taka jest składnia sformatowanego łańcucha, który przypadkowo zaczyna się również od znakuf
.Bash + coreutils,
139125 znakówPrzykładowy przebieg:
Wypróbuj online!
Bash + coreutils + pudełka, 97 znaków
Przykładowy przebieg:
Wypróbuj online! (Częściowo, ponieważ
boxes
nie jest zainstalowany w TIO).źródło
J ,
3029 bajtów-1 bajt dzięki Jonaszowi
Wypróbuj online!
źródło
9!:1]6!:9''
naprawia to{.
. Nieznaczne poprawki dla 29'#'|.@|:@,^:4[$*/@[(?~@[{{.)]
: Wypróbuj online!PowerShell ,
16311193 bajtówWypróbuj online!
Pobiera dane wejściowe jako
$w
idth,$h
osiem,$s
tring.Konstruuje ciąg o
#
odpowiedniej$w
idth, ciąg łączy to z pewnym obliczeniem, a następnie ten sam#
ciąg ponownie. Obliczenia zaczynają się od pobrania$s
tring wejściowego i zrobienia .padRight
do idth$w
o$h
osiem długości (tj. Zrób ciąg wystarczająco długi, aby całkowicie zajął prostokątną przestrzeń. Następnie przekształcamy ten ciągt
oCharArray
isort
tak dalejRandom
. To daje nam pomieszaną środkową część. Na koniec dzielimy-replace
je na równe części i$w
otaczamy je kawałkami#
s.-52 dzięki inspiracji AZTECCO
-18 bajtów dzięki mazzy
źródło
-replace
zamiast podziału i łączenia.JavaScript (ES7), 125 bajtów
Zwraca ciąg. Wykorzystuje
0
jako znak ramki.Wypróbuj online!
Skomentował
źródło
APL (Dyalog Extended) , 23 bajty SBCS
Anonimowa ukryta funkcja poprawki. Przyjmuje
[M,N]
jako lewy argument iS
prawy argument.Wypróbuj online!
×/⍛(
…)
Zastosuj następującą funkcję między argumentami, zastępując lewy argument jego produktem:↑
weźM
×N
znaki zS
, dopełnienie spacjami po prawej stronie⊇
zmień kolejność w następującej kolejności:?⍨⍤
przetasowane indeksy od 1 do…⊣
lewy argument (M
×N
)⍴
R eshape że w następujący kształt:⊣
lewy argument (tj.M
wiersze iN
kolumny)'#'
…⍣4
Zastosuj następującą funkcję cztery razy, za każdym razem ze znakiem krzyżyka jako lewym argumentem:∘⍉
transponuj prawy argument∘⌽
dubluj prawy argument,
łącząc kolumnę skrótów z lewą stroną tegoźródło
PHP 7.4,
1079994 znakówDzięki:
join()
(-8 znaków)chunk_split()
„s$end
parametr (-5 znaków)Wypróbuj online!
PHP 7.3,
117112108 znakówDzięki:
join()
(-5 znaków)chunk_split()
„s$end
parametr (-4 znaków)Przykładowy przebieg:
Wypróbuj online!
źródło
fn($s,$r,$c)=>($b=str_repeat(9,$c+2))."\n9".join("9\n9".str_split(str_shuffle(str_pad($s,$r*$c)),$c))."9\n$b";
powinno to działać w PHP 7.4 ( wiki.php.net/rfc/arrow_functions_v2 ) i wydano wersję Canditate ( wiki.php.net/todo/php74 ), więc jest to dostępny „kompilator”, który przyszedł przed tym wyzwaniem i każdy może go użyć.join()
, ale nie udało mi się zmniejszyć rozmiaru. ☹chunk_split
: 94 bajtów Usunąłem również ostatni średnik, ponieważ uważam, że nie jest potrzebny, napisałeś funkcję, więc kod, który przypisze ją do zmiennej, nie powinien się liczyć.MATL ,
2219 bajtówWypróbuj online!
Dzięki @LuisMendo za zapisanie 3 bajtów, więc teraz ma tę samą liczbę bajtów, co odpowiedź @ flawr , ale wystarczająco różni się, by mimo to wysłać . Omówienie agorithm wysokiego poziomu:
źródło
Z}&O
przezZ"
, a także pozwala usunąć ostatecznac
1$O
.Ruby , 121 bajtów
Tworzy miskę, odpytuje indeksy wszystkich spacji w misce, pobiera próbki spacji równych rozmiarowi łańcucha i wypełnia je.
sample
Nie zwraca posortowanej listy, więc nie ma potrzeby tasowania. Wyszukiwanie indeksów do9*m*n
(który prawie na pewno wykracza poza zakres) nadal będzie zawierać wszystkie spacje i jest o 1 bajt krótszy niżr.size
.Wypróbuj online!
źródło
Czerwony ,
120116114112 bajtów-2 bajty dzięki @Kevin Cruijssen!
Wypróbuj online!
źródło
+ 1
i użycieto"""00"0 n
zamiast tego.copy
, dla tej samej liczby bajtów.t
linii jako wiodącego / końcowego elementu przed zapętleniem, aby zaoszczędzić na dwóch luzach,print t
byłoby krótsze? Wątpię, ale ponieważ nie wiem, jak dodać elementy do listy, nie jestem pewien.Perl 6 ,
7467 bajtów-5 bajtów dzięki Jo King
Wypróbuj online!
Wyjaśnienie
źródło
Perl 5
-lF
,9997 bajtów-2 bajty dzięki uprzejmości @NahuelFouilleul
Wypróbuj online!
źródło
($i++%$n==0)
może zostać zmieniony przez!($i++%$n)
k4,
3228 bajtówedycja: -4 dzięki Galenowi Iwanowowi!
nazywany jak
wyjaśnienie:
źródło
#
na końcu każdej linii i transponujesz / odwrócisz 4 razy, coś takiego .Java (JDK) ,
180178 bajtówAni jednego dodatkowego importu:
Wypróbuj online!
Walka o grę w golfa była dość trudna. W szczególności import związany z metodami Collect.shuffle () / Arrays był zbyt duży, aby go zaakceptować, więc musiałem stworzyć własny algorytm tasowania ciągów (prawdopodobnie nie wydajny ani jednolicie rozproszony). Ogromne podziękowania dla Stevena za udowodnienie, że algorytm może wygenerować dowolny zestaw pozycji .
Sformatowane (z wyjaśnieniem):
źródło
.replaceAll("(.{"+n+"})","\n#$1#")
może zostać.replaceAll(".{"+n+"}","\n#$0#")
Węgiel drzewny , 27 bajtów
Wypróbuj online! Link jest do pełnej wersji kodu. Pobiera dane wejściowe w szerokości, wysokości, łańcuchu zamówienia. Wyjaśnienie:
Wprowadź szerokość i wysokość.
Ustaw miskę.
Pętla nad znakami w ciągu.
Skocz do losowej pozycji w misce, aż znajdziesz puste miejsce.
Wydrukuj bieżący znak bez poruszania kursorem.
źródło
Move(:UpLeft)
konieczne? Bez niego działa dobrze, ale może dodałeś go z powodu, o którym nie myślę?Japt
-R
,2118 bajtówSpróbuj
źródło
MATL ,
29 2719 bajtówWypróbuj online!
Dzięki @LuisMendo za -8 bajtów!
Objaśnienie:
p
oblicza liczbę zup-pikseli. NastępnieZ@
tworzy losową permutację wielkości liczby pikseli zupy. Użyjemy tego jako indeksów, doiy~h
których należy ciąg wejściowy z dodaną wystarczającą ilością spacji.w)
zamienia oba i indeksuje jeden z drugim. Następnie przekształcamy1Ge
kształt do pożądanego prostokąta i#
-padamy go za pomocąTT35&Ya
.źródło
T-SQL 2017, 232 bajty
Testowanie tego online jest starszą wersją serwera SQL, która kosztuje inną postać. Zamieściłem krótszą wersję.
Gra w golfa:
Wypróbuj online
Nie golfowany:
źródło
C (clang) ,
169164162160 bajtówWypróbuj online!
-2 wprowadzenie a = o w time () wywołanie // for (srand (time (a = o));; ...
Zapisano 7 Sugestia @ceilingcat do użycia - ~ zmienna i automatyczne przechowywanie dla ciągu o oraz wiele ulepszeń.
Degolf:
źródło
*a=--i;)*a++=i%m?-~i%m<3|i<m|i>m*n?35:32:10;for(;
zamiast--i;)*a++=i%m?-~i%m<3|i<m|i>m*n?35:32:10;for(*a=0;
Ikona ,
136133131118 bajtówWypróbuj online!
źródło
Galaretka , 16 bajtów
Dyadyczny link akceptujący listę liczb całkowitych,
[M, N]
po lewej stronie i listę znakówS
, po prawej stronie, która daje listę list znaków, linii. Używa znaku tyldy~
jako granicy.Wypróbuj online!
Wszystkie możliwe wyniki mają niezerową szansę na uzyskanie, ponieważ tasujemy (
Ẋ
) listę znakówS
wraz z odpowiednią liczbą spacji.Kod
Ṿ€«”~ZƊ⁺
zapisuje bajt, który, jak sądzę, byłby wymagany do dołączenia do znaku nowej linii, który pełne programy wykorzystujące liczbę całkowitą taką jak zero musiałyby zastosować (np.P⁶ẋaẊs⁸Ṫ;€0ZUƊ4¡Y
LubP⁶ẋaẊs⁸Ṫj@€Ø0Z$⁺Y
). Może istnieje sposób, aby zaoszczędzić więcej ...?źródło