Вмістіть слово в сітку алфавіту


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або еквівалент) для відокремлення рядків, тобто список рядків не правильний формат виведення.
  • Це завдання з , тому зробіть свій код якомога коротшим!

Чи дозволені провідні новинки?
Erik the Outgolfer

@EriktheOutgolfer Звичайно, якщо це не зіпсує структуру сітки.
shooqie

Було б добре, якщо нефатальна помилка зупинить програму?
Zacharý

@ Zacharý Хоча я бачу, як це могло б зберегти кілька байтів, я думаю, що це некрасиво і дає непотрібний зайвий вихід. Так ні. EDIT: Якщо ви не зможете змусити програму не фатально вийти через вихідний код або щось, що не надрукує слід стека винятку або щось подібне на stderr.
shooqie

7
Пропонований тестовий випадок: BALLOON(два суміжних символи однакові).
Kevin Cruijssen

Відповіді:


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 байт-друк безпосередньо замість повернення String та перетворення на 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 ні я не можу, не всередині подвійної цитати в eval
edc65

О так, це соромно. Моє ліжко.
Джастін Марінер

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

Якщо це truthy (не порожній рядок), поверніть пробіл ( S), інакше поверніть поточний лист.

·

Об’єднайте результат попереднього рядка з новими рядками та надрукуйте результат.


10 байт для r"[^{Z}]"Sздається трохи смішним, але я не можу знайти кращого способу ...
ETHproductions



@Shaggy Гарне мислення kX!
Джастін Марінер

Насправді, я думаю, ви можете змінити, kX ?S:Zщоб oX ªSзберегти два байти
ETHproductions


3

Желе , 19 байт

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

Спробуйте в Інтернеті!


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

@JonathanAllan Я думаю, що це не вдасться BALLOONчи щось.
Erik the Outgolfer

Ви маєте рацію, так - знадобиться ще один байт із чимось подібним <2\1;¬; Ну добре.
Джонатан Аллан

@JonathanAllan Як завгодно, я реалізую вашу ідею у своїй відповіді ... зроблено.
Erik the 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 , якщо ведучий символ нового рядка дозволено
ASCII-тільки



3

Математика, 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

Гольфскрипт, 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 ć(витяг 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

Власне, ð,означає "надрукувати пробіл та новий рядок".
Erik the Outgolfer

Ти правий. Виправлений код фактично надрукувати новий рядок.
скоттинет

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 байти, замінивши попередню версію K4

2

Powershell, 70 63 байт

-7 байт дякую @Veskah

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

Спробуйте в Інтернеті!

Пояснення:

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

  • Вихідний рядок $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). Цікаво на сьогодні, що, здається, у Hugs є дещо менші правила.
Лайконі

@Laikoni Я вже кілька місяців дивлюсь на Haskell, і це не перестає мене дивувати. Я люблю a=...:aхитрість. Дякую!
Крістіан Лупаску

Я не знаю, чи знаєте ви про це, але я думаю, що це варто згадати. Причина Hugs тут відрізняється тим, що для операторів, визначених користувачем, пріоритет нижчого оператора, ніж у 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

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

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

Спробуйте в Інтернеті!

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

>':x для кожної картки вона більша за попередню?

~ заперечувати

& де (за якими показниками) ми маємо правду

( )_xскоротити xці індекси, повернути список рядків

{ }' для кожного з цих рядків

`c$65+!26

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

x?знайдіть індекс першого появи кожної літери в x, використовуйте 0N(спеціальне значення "null"), якщо його не знайдено

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.