Nós parecem não obter cansado de desafios alfabeto-relacionados ...
A receita
Dado
- uma sequência de letras
S
e - dois inteiros positivos
M
,N
,
produza uma sopa de letrinhas com as letras de S
ocupar posições aleatórias em uma tigela retangular de tamanho M
× N
, emoldurada por um caractere não alfabético e sem espaço para representar a borda da tigela.
As posições não usadas por letras devem ser exibidas como espaços. Veja os exemplos abaixo .
Regras adicionais
- O tamanho
M
×N
refere-se ao interior da tigela. O tamanho incluindo o aro éM+2
×N+2
. - Cada personagem de
S
deve aparecer uma vez na tigela, em uma posição diferente ; isto é, um personagem não pode substituir outro. S
pode conter duplicatas . Por exemplo, seS
for a sequência'abcc'
, a sopa deve conter uma
, umb
e doisc
(todos em posições diferentes).- As entradas irão satisfazer as restrições
M >= 1
,N >= 1
,1 <= length(S) <= M*N
. - A borda da tigela pode ser qualquer caractere não alfabético e não espacial , consistente entre as execuções do programa e os valores de entrada.
- As posições das letras na tigela são aleatórias, portanto o resultado pode variar sempre que o programa for executado com as mesmas entradas.
- Dada a entrada, todo conjunto possível de posições de letras deve ter uma probabilidade diferente de zero . Como isso não pode ser verificado em algumas realizações do programa, explique como o seu código cumpre isso.
- Espaço em branco à esquerda ou à direita ao redor da borda são permitidos.
S
conterão apenas letras maiúsculas. Se desejar, você pode escolher apenas letras minúsculas .- Entrada e saída são flexíveis, como de costume. Por exemplo, a saída pode ser uma sequência com novas linhas, uma matriz de caracteres 2D ou uma lista de linhas.
- Programas ou funções são permitidos, em qualquer linguagem de programação . As brechas padrão são proibidas.
- O código mais curto em bytes vence.
Exemplos
As entradas são mostradas como S, [M N]
, onde M
é o número de linhas e o N
número de colunas. O personagem #
é usado para a borda.
'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 #
###########################################
|+-
?Respostas:
05AB1E ,
2018161514 bytesToma três entradas na ordem: altura, largura, sequência. Saída como uma lista 2D de caracteres.
Usa
8
como borda, mas pode ter qualquer dígito.-1 byte graças a @Grimy .
Experimente online ou verifique todos os casos de teste . (O TIO contém
}}J»
no rodapé para imprimir bem o resultado; fique à vontade para removê-lo para ver a lista 2D de caracteres de saída real.)Explicação:
fonte
*j
! Aqui estão 13 para legados ou 14 feios para modernos (gera uma matriz de caracteres 2D).1,1,"O"
, então eu acho que tem que ser o 14-byter para o legado também. Obrigado por -1 embora.APL (Dyalog Unicode) , SBCS de 25 bytes
Experimente online!
-22 graças a @ngn, -7 graças a @ngn e @ Adám
Explicação:
APL (Dyalog Extended) , SBCS de 21 bytesOs ângulos da jante são caracteres diferentes
Experimente online!
Usando o dfn para exibir a caixa.
fonte
'#',∘⌽∘⍉⍣4⊢⍴∘(?⍨∘≢⊃¨⊂)↑⍨∘(×/)
Experimente online!{'#',∘⌽∘⍉⍣4⊢⍵⍴⍺\⍨(≢⍺)>?⍨×/⍵}
(ou em≥
vez de>
se⎕io=1
)'#',∘⌽∘⍉⍣4{⍵⍴⍺\⍨(≢⍺)>?⍨×/⍵}
'#',∘⌽∘⍉⍣4{⍵⍴⊃¨↓∘⍺¨?⍨×/⍵}
Python 3 , 110 bytes
Experimente online!
Aleatoriza usando uma
set
compreensão e retorna uma matriz de caracteres 2D.fonte
f'{s:{m*n}}'
peça? Porque essa é a sintaxe de uma string formatada, que por coincidência também começa com umf
.Bash + coreutils,
139125 caracteresExemplo de execução:
Experimente online!
Bash + coreutils + boxes, 97 caracteres
Exemplo de execução:
Experimente online! (Parcialmente, como
boxes
não está instalado no TIO.)fonte
J ,
3029 bytes-1 byte graças a Jonah
Experimente online!
fonte
9!:1]6!:9''
corrige isso{.
. Pequenos ajustes para 29'#'|.@|:@,^:4[$*/@[(?~@[{{.)]
: Experimente online!PowerShell ,
16311193 bytesExperimente online!
$w
Aceita entrada como id,$h
oito,$s
tring.Constrói uma sequência do idth
#
apropriado$w
, junta-se à mesma com alguma computação e, em seguida, a mesma#
sequência novamente. O cálculo começa com a entrada da seqüência de caracteres$s
e a execução de um .padRight
até o oitavo comprimento$w
por$h
oito (ou seja, faça uma string longa o suficiente para ocupar completamente o espaço retangular. Depois convertemos a stringt
oCharArray
esort
ela tambémRandom
. a parte do meio confusa, enfim, dividimos-replace
em pedaços iguais e$w
cercamos esses pedaços com#
s.-52 graças à inspiração do AZTECCO
-18 bytes graças ao mazzy
fonte
-replace
invés de se separar e se juntar.JavaScript (ES7), 125 bytes
Retorna uma string. Usa
0
como o caractere do quadro.Experimente online!
Comentado
fonte
APL (Dyalog Extended) , SBCS de 23 bytes
Função de infixo tácito anônimo. Toma
[M,N]
como argumento à esquerda eS
como argumento à direita.Experimente online!
×/⍛(
…)
Aplique a seguinte função entre os argumentos, substituindo o argumento esquerdo por seu produto:↑
pegueM
×N
caracteresS
, preenchendo espaços à direita⊇
reordene isso na seguinte ordem:?⍨⍤
os índices embaralhados de 1 a…⊣
o argumento esquerdo (M
×N
)⍴
r esforme isso para a seguinte forma:⊣
o argumento da esquerda (ou seja,M
linhas eN
colunas)'#'
…⍣4
Aplique a seguinte função quatro vezes, cada vez com o caractere hash como argumento esquerdo:∘⍉
transponha o argumento direito∘⌽
espelhe o argumento direito,
concatenar uma coluna de hashes para o lado esquerdo desse argumentofonte
PHP 7.4,
1079994 caracteresGraças a:
join()
(-8 caracteres)chunk_split()
o$end
parâmetro (-5 caracteres)Experimente online!
PHP 7.3,
117112108 caracteresGraças a:
join()
(-5 caracteres)chunk_split()
o$end
parâmetro (-4 caracteres)Exemplo de execução:
Experimente online!
fonte
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";
deve funcionar no PHP 7.4 ( wiki.php.net/rfc/arrow_functions_v2 ), e um release de lançamento foi lançado ( wiki.php.net/todo/php74 ), portanto, é um "compilador" disponível que veio antes desse desafio, e qualquer um pode usá-lo.join()
, mas não reduzi o tamanho. ☹chunk_split
: 94 bytes Também removi o último ponto-e-vírgula porque acredito que não é necessário; você escreveu uma função; portanto, o código que vai atribuí-lo a uma variável não deve contar.MATL ,
2219 bytesExperimente online!
Obrigado @LuisMendo por salvar 3 bytes, agora ele tem o mesmo número de bytes que a resposta de @ flawr , mas suficientemente diferente para postar de qualquer maneira. Visão geral do agoritmo de alto nível:
fonte
Z}&O
porZ"
, e que também permite que você remova a finalc
1$O
.Ruby , 121 bytes
Cria a tigela, consulta os índices de todos os espaços dentro da tigela, mostra um número de espaços iguais ao tamanho da string e os preenche.
sample
Não retorna uma lista classificada, portanto, não é necessário embaralhar. A pesquisa de índices até9*m*n
(que quase certamente sai do intervalo) ainda terá todos os espaços e é 1 byte menor quer.size
.Experimente online!
fonte
Vermelho ,
120116114112 bytes-2 bytes graças a @Kevin Cruijssen!
Experimente online!
fonte
+ 1
e usandoto"""00"0 n
.copy
, pela mesma contagem de bytes.t
linha como item inicial / final antes de fazer o loop para economizar os dois soltosprint t
seria mais curto? Duvido, mas como não sei como adicionar itens a uma lista, não tenho certeza.Perl 6 ,
7467 bytes-5 bytes graças a Jo King
Experimente online!
Explicação
fonte
Perl 5
-lF
,9997 bytes-2 bytes de cortesia de @NahuelFouilleul
Experimente online!
fonte
($i++%$n==0)
poderia ser alterado por!($i++%$n)
k4,
3228 bytesedit: -4 graças a Galen Ivanov!
chamado como
explicação:
fonte
#
no final de cada linha e transpor / reverter 4 vezes, algo como isto .Java (JDK) ,
180178 bytesNem uma única importação extra:
Experimente online!
Foi uma grande luta para conseguir isso. Em particular, as importações envolvidas com os métodos Collections.shuffle () / Arrays eram demais para serem aceitas; portanto, tive que criar meu próprio algoritmo de embaralhamento de String (provavelmente nem eficiente nem distribuído uniformemente). Agradecimentos enormes a Steven por provar que qualquer conjunto de posições pode ser gerado partir do algoritmo.
Formatado (com explicação):
fonte
.replaceAll("(.{"+n+"})","\n#$1#")
pode se tornar.replaceAll(".{"+n+"}","\n#$0#")
Carvão , 27 bytes
Experimente online! Link é a versão detalhada do código. Recebe entrada na ordem largura, altura, string. Explicação:
Insira a largura e a altura.
Enquadre a tigela.
Faça um loop sobre os caracteres na sequência.
Pule para uma posição aleatória na tigela até encontrar um lugar vazio.
Imprima o caractere atual sem mover o cursor.
fonte
Move(:UpLeft)
necessário? Funciona bem sem ele, mas talvez você o tenha adicionado por um motivo em que não penso?Japonês
-R
,2118 bytesTente
fonte
MATL ,
29 2719 bytesExperimente online!
Obrigado @LuisMendo por -8 bytes!
Explicação:
p
calcula o número de pixels de sopa. Em seguida,Z@
produz uma permutação aleatória do tamanho do número de pixels da sopa. Usaremos isso como índices aosiy~h
quais é a string de entrada com espaço suficiente adicionado.w)
troca os dois e indexa um pelo outro. Em seguida, reformulamos1Ge
a forma no retângulo desejado e#
pressionamos-a usandoTT35&Ya
.fonte
T-SQL 2017, 232 bytes
Testar esse online é uma versão mais antiga do sql-server que custa outro caractere. Eu postei a versão mais curta.
Golfe:
Experimente online
Ungolfed:
fonte
C (clang) ,
169164162160 bytesExperimente online!
-2 colocando a = o em time () chamada // for (srand (time (a = o)); ...
Salvo 7 sugestão de @ceilingcat para usar - ~ armazenamento variável e automático para a sequência o, além de muitas melhorias.
Degolf:
fonte
*a=--i;)*a++=i%m?-~i%m<3|i<m|i>m*n?35:32:10;for(;
vez de--i;)*a++=i%m?-~i%m<3|i<m|i>m*n?35:32:10;for(*a=0;
Ícone ,
136133131118 bytesExperimente online!
fonte
Gelatina , 16 bytes
Um link diádico que aceita uma lista de números inteiros,
[M, N]
à esquerda e uma lista de caracteres,S
à direita, que produz uma lista de listas de caracteres, as linhas. Usa o caractere til,,~
como a borda.Experimente online!
Todas as saídas possíveis têm uma chance diferente de zero de ser gerada, uma vez que embaralhamos (
Ẋ
) uma lista dos caracteresS
juntamente com o número apropriado de espaços.O código
Ṿ€«”~ZƊ⁺
salva o byte que eu imagino que seria necessário associar a novas linhas que programas completos usando um número inteiro como zero precisariam empregar (por exemplo,P⁶ẋaẊs⁸Ṫ;€0ZUƊ4¡Y
ouP⁶ẋaẊs⁸Ṫj@€Ø0Z$⁺Y
). Talvez haja uma maneira de economizar mais ...?fonte