Вставить слово в алфавитную сетку


55

Вдохновленный мемом, который я видел ранее сегодня.

Описание задачи

Рассмотрим бесконечную алфавитную сетку:

ABCDEFGHIJKLMNOPQRSTUVWXYZ
ABCDEFGHIJKLMNOPQRSTUVWXYZ
ABCDEFGHIJKLMNOPQRSTUVWXYZ
ABCDEFGHIJKLMNOPQRSTUVWXYZ
ABCDEFGHIJKLMNOPQRSTUVWXYZ
...

Возьмите слово ( CODEGOLFв этом примере) и сделайте его подпоследовательностью сетки, заменив неиспользуемые буквы пробелом и удалив буквы в конце бесконечной сетки:

  C           O           
   DE G       O           
           L              
     F

Примеры

STACKEXCHANGE

                  ST      
A C       K               
    E                  X  
  C    H                  
A            N            
      G                   
    E

ZYXWVUTSRQPONMLKJIHGFEDCBA

                         Z
                        Y 
                       X  
                      W   
                     V    
                    U     
                   T      
                  S       
                 R        
                Q         
               P          
              O           
             N            
            M             
           L              
          K               
         J                
        I                 
       H                  
      G                   
     F                    
    E                     
   D                      
  C                       
 B                        
A

F

     F

ANTIDISESTABLISHMENTARIANISM

A            N     T      
        I                 
   D    I         S       
    E             ST      
AB         L              
        I         S       
       H    M             
    E        N     T      
A                R        
        I                 
A            N            
        I         S       
            M

Примечания

  • Конечные пробелы разрешены.
  • Вам не нужно дополнять последнюю строку пробелами. Например, если ввод ABC, вы можете вывести только ABCбез 23 пробелов.
  • Вы можете предположить, что ввод будет соответствовать [A-Z]+регулярному выражению.
  • В качестве альтернативы вы можете использовать строчные буквы, в этом случае выходные данные будут совпадать [a-z]+.
  • Вы должны использовать символ новой строки ( \n, \r\nили эквивалент) для отдельных линий, то есть список строк не правильный формат вывода.
  • Это задача , поэтому сделайте ваш код как можно короче!

Разрешены ли ведущие символы новой строки?
Эрик Outgolfer

@EriktheOutgolfer Конечно, пока это не портит сетку.
Shooqie

Было бы хорошо, если бы не фатальная ошибка остановила программу?
Захари

@ Zacharý Хотя я вижу, как это может сэкономить несколько байтов, я думаю, что это некрасиво и выдает нежелательный, лишний вывод. Так что нет. РЕДАКТИРОВАТЬ: Если вы не можете заставить свою программу без фатального завершения завершить работу через код завершения или что-то, что не будет выводить трассировку стека исключений или что-то подобное stderr.
Shooqie

7
Предлагаемый контрольный пример: BALLOON(два одинаковых соседних символа).
Кевин Круйссен,

Ответы:


10

Шелуха , 15 байт

TṪS`?' €…"AZ"ġ>

Попробуйте онлайн!

объяснение

TṪS`?' €…"AZ"ġ>  Implicit input, e.g. "HELLO"
             ġ>  Split into strictly increasing substrings: x = ["H","EL","LO"]
        …"AZ"    The uppercase alphabet (technically, the string "AZ" rangified).
 Ṫ               Outer product of the alphabet and x
  S`?' €         using this function:
                   Arguments: character, say c = 'L', and string, say s = "EL".
       €           1-based index of c in s, or 0 if not found: 2
  S`?'             If this is truthy, then c, else a space: 'L'
                 This gives, for each letter c of the alphabet,
                 a string of the same length as x,
                 containing c for those substrings that contain c,
                 and a space for others.
T                Transpose, implicitly print separated by newlines.

7

Java 10, 161 159 152 байта

s->{var x="";int p=0;for(var c:s)x+=p<(p=c)?c:";"+c;for(var y:x.split(";"))System.out.println("ABCDEFGHIJKLMNOPQRSTUVWXYZ".replaceAll("[^"+y+"]"," "));}

-2 байта благодаря @Nevay .
-7-байтовая печать напрямую вместо возврата строки и преобразования в Java 10.

Объяснение: "

Попробуй это здесь.

s->{                      // Method with String parameter and no return-type
  var x="";               //  Temp-String
  int p=0;                //  Previous character (as integer), starting at 0
  for(var c:s)            //  Loop (1) over the characters of the input
    x+=p<(p=c)?           //   If the current character is later in the alphabet
                          //   (replace previous `p` with current `c` afterwards)
        c                 //    Append the current character to Temp-String `x`
       :                  //   Else:
        ";"+c;            //    Append a delimiter ";" + this character to Temp-String `x`
  for(var y:x.split(";")) //  Loop (2) over the String-parts
    System.out.println(   //   Print, with trailing new-line:
     "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
                          //    Take the alphabet,
        .replaceAll("[^"+y+"]"," "));}
                          //    and replace all letters not in the String-part with a space

Первая часть метода разбивает входное слово на части с разделителем.
Например: CODEGOLFCO;DEGO;L;Fили BALLOONB;AL;LO;O;N.

Вторая часть проходит по этим частям и использует регулярное выражение [^...]для замены всего, что не соответствует пробелу.
Например, .replaceAll("[^CO]"," ")оставляет C, и O, и заменяет все остальное пробелом.


1
Не будет ли это B;AL;LO;O;N?
NieDzejkob

1
-2 байт: for(char c:s)x+=p<(p=c)?c:";"+c;.
Неваи,




4

JavaScript (ES6), 79

Редактировать Как принято ведущий символ новой строки, я могу сохранить 2 байта

s=>eval("for(o='',v=i=0;c=s.charCodeAt(i);v%=27)o+=v++?c-63-v?' ':s[i++]:`\n`")

Еще на 1 байт я могу принять строчные или прописные данные:

s=>eval("for(o='',v=i=0;c=s[i];v%=27)o+=v++?parseInt(c,36)-8-v?' ':s[i++]:`\n`")

Меньше гольфа

s=>{
  var i,o,c,v
  for(o = '', v = 1, i = 0; c = s.charCodeAt(i); v %= 27)
    o += v++ ? c-63-v ? ' ' : s[i++] : '\n'
  return o
}  

Контрольная работа

f=s=>eval("for(o='',v=i=0;c=s.charCodeAt(i);v%=27)o+=v++?c-63-v?' ':s[i++]:`\n`")

function update() {
  var i=I.value
  i=i.replace(/[^A-Z]/gi,'').toUpperCase()
  O.textContent=f(i)
}

update()
<input id=I value='BALLOON' oninput='update()' >
<pre id=O></pre>


Вы можете заменить \nбуквальным переводом строки внутри обратных кавычек на -1 байт.
Джастин Маринер

@JustinMariner нет, я не могу, не в двойных
кавычках

Ах да, это позор. Виноват.
Джастин Маринер

4

MATL , 24 23 байта

''jt8+t1)wdh26X\Ys(26e!

Используются строчные буквы.

Попробуйте это в MATL Online!

объяснение

''     % Push empty string
jt     % Push input string. Duplicate
8+     % Add 8 to each char (ASCII code). This transforms 'a' 105,
       % 'b' into 106, which modulo 26 correspond to 1, 2 etc
t1)    % Duplicate. Get first entry
wd     % Swap. COnsecutive differences.
h      % Concatenate horizontally
26X\   % 1-based modulo 26. This gives a result from 1 to 26
Ys     % Cumulative sum
(      % Write values (converted into chars) at specified positions
       % of the initially empty string
26e    % Reshape into a 26-row char matrix, padding with char 0
!      % Transpose. Implicitly display. Char 0 is shown as space

4

Japt , 18 16 байтов

-2 байта благодаря @Shaggy

;ò¨ £B®kX ?S:Z
·

Только ввод заглавных букв.

Попробуйте онлайн!

объяснение

;

Переключитесь на альтернативные переменные, где Bпрописные буквы.

ò¨

Разделите входную строку между символами, где первый больше или равен ( ¨) второго.

£

Сопоставьте каждый раздел с помощью функции, где Xнаходится текущий раздел.

Отобразите каждый символ в верхнем регистре алфавита следующим образом, Zуказав текущую букву.

kX

Удалить все буквы в текущем разделе из текущей буквы. Если текущая буква содержится в текущем разделе, это приводит к пустой строке.

?S:Z

Если это правда (не пустая строка), верните пробел ( S), в противном случае верните текущую букву.

·

Соедините результат предыдущей строки с новыми строками и напечатайте результат.


10 байт r"[^{Z}]"Sкажется немного смешным, но я не могу найти лучшего способа ...
ETHproductions



@ Шэгги Хорошо думать с kX!
Джастин Маринер

На самом деле я думаю, что вы можете перейти kX ?S:Zна oX ªSсохранение двух байтов
ETHproductions


3

Желе , 19 байт

<2\¬0;œṗfȯ⁶$¥€@€ØAY

Попробуйте онлайн!


OI<1®;-> >2\0;чтобы сохранить один байт (на самом деле я тоже сделал >2\0;œṗµØAf€ȯ€⁶µ€Yдля 18, что мне лично легче разобрать)
Джонатан Аллан

@JonathanAllan Я думаю, что ничего не получится BALLOON.
Эрик Outgolfer

Вы правы, да - поэтому потребуется еще один байт с чем-то вроде <2\1;¬; Ну что ж.
Джонатан Аллан

@JonathanAllan В любом случае, я воплощу вашу идею в своем ответе ... готово.
Эрик Outgolfer

3

C (gcc), 91 63 байта

-28 благодаря ASCII-только

_;f(char*s){for(_=64;*s;)putchar(++_>90?_=64,10:*s^_?32:*s++);}

Попробуйте онлайн!


Предыдущая:

i,j;f(char*s){while(s[i]){for(j=65;j<91;j++)s[i]==j?putchar(s[i++]):printf(" ");puts("");}}

Да, есть более короткое решение, но я заметил после того, как написал это ... Попробуйте онлайн!


82 байта , 80, если разрешен
символ



3

Mathematica, 101 байт

StringRiffle[
  Alphabet[]/.#->" "&/@
   (Except[#|##,_String]&@@@
     Split[Characters@#,#==1&@*Order]),"
",""]&

Splitввод в строго увеличивающиеся последовательности букв, сравнивая соседние буквы с Order. Если Order[x,y] == 1, то xпредшествует yв алфавите и, следовательно, может появляться в той же строке.

Для каждой последовательности букв создайте шаблон для сопоставления строк Exceptдля этих букв; #|##это сокращение для Alternatives. Замените буквы Alphabet, соответствующие шаблону, пробелами.


Иллюстрация промежуточных шагов:

"codegolf";
Split[Characters@#,#==1&@*Order]  &@%
Except[#|##,_String]&@@@         #&@%
Alphabet[]/.#->" "&/@               %
{{"c", "o"}, {"d", "e", "g", "o"}, {"l"}, {"f"}}

{Except["c" | "c" | "o", _String], 
 Except["d" | "d" | "e" | "g" | "o", _String], 
 Except["l" | "l", _String],
 Except["f" | "f", _String]}

{{" "," ","c"," "," "," "," "," "," "," "," "," "," "," ","o"," "," "," "," "," "," "," "," "," "," "," "},
 {" "," "," ","d","e"," ","g"," "," "," "," "," "," "," ","o"," "," "," "," "," "," "," "," "," "," "," "},
 {" "," "," "," "," "," "," "," "," "," "," ","l"," "," "," "," "," "," "," "," "," "," "," "," "," "," "},
 {" "," "," "," "," ","f"," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "}}

2

Golfscript, 22 21 байт

Попробуйте онлайн!

-1 байт благодаря тщательному окончательному переопределению nвстроенного.

{.n>{}{'
'\}if:n}%:n;

Пояснение (с немного другой версией):

{.n>{}{"\n"\}if:n}%:n; # Full program
{                }%    # Go through every character in the string
 .n>         if        # If ASCII code is greater than previous...
                       # (n means newline by default, so 1st char guaranteed to fit)
    {}                 # Do nothing
      {"\n"\}          # Else, put newline before character
               :n      # Redefine n as the last used character
                   :n; # The stack contents are printed at end of execution
                       # Literally followed by the variable n, usually newline
                       # So because n is by now an ASCII code...
                       # ...redefine n as the new string, and empty the stack

2

Сетчатка , 80 байт

^
;¶
{`;.*
¶;ABCDEFGHIJKLMNOPQRSTUVWXYZ
¶¶
¶
)+`;(.*)(.)(.*¶)\2
$.1$* $2;$3
;.*

Попробуйте онлайн!

Всегда есть ровно одна ведущая новая строка. Код несколько неуклюже добавляет слово к алфавиту вместе с маркером (точка с запятой). Затем он перемещает маркер до первой буквы слова, изменяя все остальные буквы, которые он пропускает в пробелы. Также удаляет первую букву слова. Это повторяется до тех пор, пока первая буква слова больше не будет после маркера. Затем он очищает этот маркер и остальную часть алфавита и снова заменяет его новой строкой, а алфавит - маркером. Он повторяет это до тех пор, пока входное слово не станет пустым, затем очищает последний алфавит и маркер, оставляя желаемый результат.


2

05AB1E , 18 байт

ćIgµ¶?AvDyÊið?ë¼?ć

Попробуйте онлайн!

Возникла проблема с 05AB1E ć(extract 1), оставив пустую строку / список в стеке после извлечения последнего элемента. Это решение было бы на 1-2 байта короче, если бы не это.

ćIgµ¶?AvDyÊið?ë¼?ć  Implicit input 
ć                   Extract the 1st char from the string
 Igµ                While counter != length of the string
    ¶?              Print a newline
      Av            For each letter of the lowercased alphabet
        DyÊ         Is the examined character different from the current letter?
           ið?      If true, then print a space

              ë¼?ć  Else increment the counter, print the letter and push
                    the next character of the string on the stack

На самом деле, ð,означает «напечатать пробел и перевод строки».
Эрик Outgolfer

Вы правы. Исправлен код, который фактически печатал новую строку.
scottinet

2

Сетчатка , 130 126 байтов

$
¶A
{-2=`
$'
}T`RL`_o`.$
+`(?<=(.)*)((.).*¶(?<-1>.)*(?(1)(?!)).+\3.*$)
 $2
(?<=(.)*)((.).*¶(?<-1>.)*(?<-1>\3.*$))
¶$2
}`¶.*$

Попробуйте онлайн! Изменить: 4 байта сохранены с помощью генератора алфавита @ MartinEnder. Объяснение:

$
¶A
{-2=`
$'
}T`RL`_o`.$

Добавить алфавит

+`(?<=(.)*)((.).*¶(?<-1>.)*(?(1)(?!)).+\3.*$)
 $2

Совместите как можно больше букв с их положением в алфавите.

(?<=(.)*)((.).*¶(?<-1>.)*(?<-1>\3.*$))
¶$2

Начните новую строку перед первой буквой, которую невозможно выровнять.

}`¶.*$

Удалите алфавит, но затем повторяйте все до тех пор, пока не будут смещены буквы.


Кажется, это печатает только одну строку, а не выравнивает буквы на последующих строках.
Джастин Маринер,

@JustinMariner Мой плохой, я сделал опечатку в моем последнем гольфе и не смог проверить это должным образом.
Нил

2

q / kdb + , 48 45 байт

Решение:

-1{@[26#" ";.Q.A?x;:;x]}@/:(0,(&)(<=':)x)_x:;

Попробуйте онлайн!

Примечание. Ссылка на порт K (oK) этого решения, поскольку для q / kdb + нет TIO.

Примеры:

q)-1{@[26#" ";.Q.A?x;:;x]}@/:(0,(&)(<=':)x)_x:"STACKEXCHANGE";
                  ST
A C       K
    E                  X
  C    H
A            N
      G
    E

q)-1{@[26#" ";.Q.A?x;:;x]}@/:(0,(&)(<=':)x)_x:"BALLOON";
 B
A          L
           L  O
              O
             N

Объяснение:

Q интерпретируется справа налево. Решение делится на две части. Сначала разбейте строку, где следующий символ меньше или равен текущему:

"STACKEXCHANGE" -> "ST","ACK","EX","CH","AN","G","E"

Затем возьмите строку из 26 пробелов и примените к ней входные данные по индексам, где этот ввод присутствует в алфавите, и напечатайте в stdout.

"__________________________" -> __________________ST______

Сломать:

-1{@[26#" ";.Q.A?x;:;x]}each(0,where (<=':)x) cut x:; / ungolfed solution
-1                                                  ; / print to stdout, swallow return value
                                                  x:  / store input as variable x
                                              cut     / cut slices x at these indices
                            (               )         / do this together
                                     (<=':)x          / is current char less-or-equal (<=) than each previous (':)?
                               where                  / indices where this is true
                             0,                       / prepended with 0
                        each                          / take each item and apply function to it
  {                    }                              / lambda function with x as implicit input
   @[      ;      ; ; ]                               / apply[variable;indices;function;arguments]
     26#" "                                           / 26 take " " is "      "...
            .Q.A?x                                    / lookup x in the uppercase alphabet, returns indice(s)
                   :                                  / assignment
                     x                                / the input to apply to these indices

Примечания:

  • -3 байта путем замены prev на версию K4

2

Powershell, 70 63 байта

-7 байт спасибо @Veskah

$args|%{if($_-le$p){$x;rv x}
$x=("$x"|% *ht($_-65))+($p=$_)}
$x

Попробуйте онлайн!

Объяснение:

Для каждого символа в аргументе splatted:

  • Выведите строку $xи очистите $xзначение ( rvэто псевдоним для Remove-Variable ), если код текущего символа меньше или эквивалентен ( -le) коду предыдущего символа.
  • Добавить пробелы и текущий символ в $x, сохранить его в $x. Также он обновляет предыдущее значение символа.

Выход последний $x.


1
63 байта с использованием сплаттинга . Пытался использовать, |% *htчтобы сохранить несколько байтов, но похоже, что он безубыточен.
Веска



1

JavaScript (ES6), 87 байт

f=([...s])=>s[0]?(g=i=>i>35?`
`+f(s):(i-parseInt(s[0],36)?" ":s.shift())+g(i+1))(10):""

Принимает ввод прописных или строчных букв. Выходные данные соответствуют регистру ввода.

тесты


1

Haskell, 81 74 73 байта

q@(w:y)!(x:z)|w==x=x:y!z|1<2=min ' 'x:q!z
x!_=x
a=['A'..'Z']++'\n':a
(!a)

Сохранено 1 байт благодаря Laikoni !

Попробуйте онлайн.

Haskell Hugs оптимизации

  1. Интерпретатор Hugs позволяет мне сохранить еще один байт, выполнив (!cycle$['A'..'Z']++"\n")вместо:, (!cycle(['A'..'Z']++"\n"))но GHC не нравится первый . (Это уже устарело; Лайкони уже переписал эту строку таким образом, что сэкономил 1 байт.)

  2. По-видимому, Hugs также не требует скобок вокруг сопоставителя шаблонов списка, поэтому я мог бы сохранить еще два байта, идущих от: q@(w:y)!(x:z)до q@(w:y)!x:z.


Вы можете сохранить байт с помощью a=['A'..'Z']++'\n':a;(!a). Интересно, что у Хагса, кажется, есть более слабые правила.
Лайкони

@Laikoni Я уже несколько месяцев смотрю на Хаскелл, и он не перестает меня удивлять. Я люблю a=...:aтрюк. Спасибо!
Кристиан Лупаску

Я не знаю, знаете ли вы об этом, но думаю, стоит упомянуть. Причина, по которой Хьюгс здесь отличается, заключается в том, что операторы, определяемые пользователем, имеют меньший приоритет, чем в ghc.
Пшеничный волшебник

@WheatWizard Я не знал. Это имеет смысл, учитывая ошибку, которую я получил в GHC.
Кристиан Лупаску



1

Древесный уголь , 15 байт

Fθ«J⌕αι⁺ⅉ‹⌕αιⅈι

Попробуйте онлайн! Ссылка на подробную версию кода. Объяснение:

 θ              Input string
F «             Loop over characters
     α     α    Uppercase letters predefined variable
      ι     ι   Current character
    ⌕     ⌕     Find index
             ⅈ  Current X co-ordinate
         ‹      Compare
        ⅉ       Current Y co-ordinate
       ⁺        Sum
   J            Jump to aboslute position
              ι Print current character


1

K (нгн / к) , 29 28 байт

{{x@x?`c$65+!26}'(&~>':x)_x}

Попробуйте онлайн!

{ } функция с аргументом x

>':x для каждого символа он больше предыдущего?

~ NEGATE

& где (по каким показателям) мы имеем

( )_xвырезать xпо этим индексам, вернуть список строк

{ }' для каждой из этих строк

`c$65+!26

английский алфавит

x?найти индекс первого вхождения каждой буквы в x, используйте 0N(специальное «нулевое» значение), если не найдено

x@индекс xс этим; индексируя с 0Nвозвратами " ", поэтому мы получаем строку длиной 26, в которой буквы от xнаходятся в своих алфавитных позициях, а все остальное - пробелы


1

R , 129 117 байт

function(s){z={}
y=diff(x<-utf8ToInt(s)-64)
z[diffinv(y+26*(y<0))+x[1]]=LETTERS[x]
z[is.na(z)]=" "
write(z,1,26,,"")}

Попробуйте онлайн!

Объяснение (без присмотра):

function(s){
 z <- c()                  # initialize an empty vector
 x <- utf8ToInt(s)-64      # map to char code, map to range 1:26
 y <- diff(x)              # successive differences of x
 idx <- cumsum(c(          # indices into z: cumulative sum of:
    x[1],                  # first element of x
    ifelse(y<=0,y+26,y)))  # vectorized if: maps non-positive values to themselves + 26, positives to themselves
 z[idx] <- LETTERS[x]      # put letters at indices
 z[is.na(z)] <- " "        # replace NA with space
 write(z,"",26,,"")        # write z as a matrix to STDOUT ("") with 26 columns and empty separator.

1

R , 95 байт

Просто бегите по алфавиту в верхнем регистре, перемещая счетчик на 1, если вы встречаете букву в позиции счетчика слова и печатаете букву, в противном случае - пробел.

function(s)while(F>""){for(l in LETTERS)cat("if"((F=substr(s,T,T))==l,{T=T+1;l}," "));cat("
")}

Попробуйте онлайн!


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.