Намалюйте алфавіт пилки


42

Простий сьогодні. Напишіть найкоротшу програму, яка малює «алфавіт пилограми» з заданим натуральним числом для висоти. Ви повинні написати назву своєї мови програмування, коли ви прийшли до літери, з якої вона починається.

Наприклад, якщо ваша мова є Python, а введенням є 1вихід, слід:

ABCDEFGHIJKLMNOPythonQRSTUVWXYZ

Якщо вхід є, 2вихід повинен бути:

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

Якщо вхід є, 4вихід повинен бути:

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

Примітки

  • A завжди починається внизу зліва.
  • Введення даних може здійснюватися через stdin або виклик функції або подібне. Вихід у stdout.
  • Введення вище 26не потрібно працювати.
  • Немає пробілів.

9
Чи дозволені мови програмування з однією літерою? (C, J, K та ін.)
isaacg

@isaacg Звичайно. Я думаю, що в них може бути простіше.
Захоплення Кальвіна

1
Чи можна очікувати, що вхід просто буде зберігатися в змінній?
Мартін Ендер

@ MartinBüttner Так, це добре.
Захоплення Кальвіна

13
Дорога, це не пилоподібна хвиля, це хвиля трикутника: P
qwr

Відповіді:


14

якщо n тримає висоту:

C + коди втечі: 81

x;main(y){for(y=n--;x<26;x++)printf("\033[%d;%dH%c",n?x/n&1?y++:y--:y,x+1,x+65);}

С: 110

x;char a[702]={[0 ...701]=32};main(y){for(y=--n;x<26;a[x*27-1]=10)a[27*(n?x/n&1?y++:y--:y)+x]=x+++65;puts(a);}

5
Я визнаю поразку. Що на землі. : D
Мартін Ендер

Чи можу я попросити інструкцій щодо складання? ccвидає помилку "<bebe.c: 1: 17: помилка: 'n' незадекларовано (перше використання в цій функції)".
manatwork

2
ну це гірше, ніж виглядає. по-перше, другий містить пробіли, по-друге, вони обидва покладаються на те, що nце глобальна змінна, встановлена ​​на вибір на ваш вибір (як раніше запитував Мартін).
bebe

О, тож я маю забезпечити російською мовою будь-яким способом. Лол. Досі вражений.
манатство

19

С, 134

n,m,c,p;
main(r){
for(scanf("%d",&n),m=--n?n*2:1;n+r--;puts(""))
for(c=-1,p=1;c++<25;)
p+=(c-n-r)%m*((c-n+r)%m)?1:1-printf("%*c",p,c+65);
}

Компілюється на gcc з кількома попередженнями. Нові рядки не включаються до числа символів.

122 символи, якщо вхід уже збережено в n.

Завдяки user2992539 , Толоси і edc65 для поліпшення.


3
Ви можете використовувати puts("")замість printf("\n").
Сомній

2
Збережіть 4 символи, p-=(c-n+r)%m*((c-n-r)%m)?0:printf("%*c",p,c+65);а неif((c-...

1
Вибачте за попередній (видалений) коментар. Я помилився. Граючи зі знаками та зловживаючи тим фактом, що перший аргумент основного - 1, якщо немає параметрів: 134n,m,c,p; main(r){ for(scanf("%d",&n),m=--n?n*2:1;n+r--;puts("")) for(c=-1,p=1;c++<25;) p+=(c-n-r)%m*((c-n+r)%m)?1:1-printf("%*c",p,c+65); }
edc65

13

TI-BASIC - 148 байт (необроблений текст), 186 байт (графіка)

У відповідь на ОП чудовий TI-83 (і новіший) поставляється з розміром 16 x 8 (просто використовуючи стандартний великий текст) або розміром 94 x 62 пікселів (що з невеликим текстом коштує приблизно 10 рядків ).

Тепер у цьому є невелика проблема (до якої я б хотів уточнити). Перекладач не може "ігнорувати" розміри розмірів; Іншими словами, якщо ми намагатимемося встановити висоту пилообразних зубів на 20, це призведе до помилки, що заважає повному виконанню коду. Я міг би написати код, який у безмежному середовищі дав би правильний вихід, за винятком того, що він не працюватиме на машині.

З урахуванням цього, я представляю вам (запущені) версії програм. Всі вони залежать від встановлення змінної Nна потрібну висоту в рядках перед запуском:

  • Підхід із сирого тексту

    :ClrHome
    :"ABCDEFGHIJKLMNOPQRSTI-BASICUVWXYZ"→Str1
    :8→R
    :For(C,1,16
    :If N=1
    :Then
    :0→F
    :Else
    :If R<2 or 10-R>N
    :1→F
    :If R>7
    :-1→F
    :End
    :If C≠20
    :Then
    :Output(R,C,sub(Str1,C,1
    :Else
    :Output(R,C,sub(Str1,C,8
    :C+7→C
    :End
    :R+F→R
    :End
    

    Для того , щоб зробити цю роботу незалежно від терміналу, зміни For(C,1,16до For(C,1,33і видалити верхню межу перевірки ( R<2 or). Ось вихід із 5→N:

    введіть тут опис зображення

  • Графічний підхід (це також може знадобитися AxisOffдля наочності)

    :ClrDraw
    :N*6→N
    :"ABCDEFGHIJKLMNOPQRSTI-BASICUVWXYZ"→Str1
    :57→R
    :For(C,1,56
    :If N=6
    :Then
    :0→F
    :Else
    :If R<7 or 64-R>N
    :6→F
    :If R>51
    :-6→F
    :End
    :If C≠20
    :Then
    :If C>50
    :Then
    :Text(R,C,sub(Str1,C-23,1
    :Else
    :Text(R,C,sub(Str1,C,1
    :End
    :Else
    :Text(R,C,sub(Str1,C,8
    :C+30→C
    :End
    :R+F→R
    :End
    

    Цей працює добре, з двома незначними химерностями. Висота все ще є проблемою, хоча ширина - ні. Однак я не розміщував букви, тому в деяких випадках (коли лист починає підніматися або зменшуватися від пиляного зуба), листи можуть бути відрізані їх наступниками. Щоб змусити його працювати незалежно від терміналу, зніміть верхню межу ( R<7 or). Далі слід графік:

    введіть тут опис зображення


Тепер я маю
перенести

Швидкий коментар: Замість цього 0→Fви можете зробити те, Delvar Fщо заощаджує 1 байт один раз в маркері. Крім того, я впевнений, що ви можете розставити висновок / текст до кінця завдяки вбудованому булевому умові тесту для координати, а для C+7→Cзапису - у короткому, якщо (ні тоді / інше / кінець)
Adriweb

11

Pure Bash (без Coreutils), 181 байт

m=$1
for l in A Bash {C..Z};{
((m))||s=++
((m>$1-2))&&s=--
for((m=$1==1?1:m,m$s,i=0;i<$1;i++));{
((i-m))&&a[i]+=${l//?/ }||a[i]+=$l
}
}
shopt -s extglob
printf %s\\n "${a[@]%%+( )}"

Вихід:

Потрібно cat -Eлише довести, що немає нових рядків.

$ ./sawtooth.sh 1 | cat -E
ABashCDEFGHIJKLMNOPQRSTUVWXYZ$
$ ./sawtooth.sh 5 | cat -E
       E       M       U$
      D F     L N     T V$
     C   G   K   O   S   W$
 Bash     H J     P R     X Z$
A          I       Q       Y$
$ 

10

JavaScript (ES6) 231 244

Редагувати виправлення помилок, деяке переупорядкування та інший спосіб управління висотою == 1
Більше того, змінено на функцію, оскільки це дозволено ОП, тому немає запиту () для введення

Жодних змін у загальному алгоритмі, який, ймовірно, НЕ найкращий для цього завдання

F=h=>{for(p=s=[i=z=b=t=''];++p<h;)i=1,z=b=' ',s[p]=t;for(p=--h,k=64;++k<91;)s[p]+=t+String.fromCharCode(k),k-74||(s=s.map((x,q)=>x+(p-q?'         ':'avascript'))),p-=i,p<0|p>h?(i=-i,p-=i+i,t=z,b=t+t):t+=b;console.log(s.join('\n'))}

Пояснив

F=h=>{
  // row in s for output must be initialized to ''. In the same step I make other initializations
  for(p=s=[i=z=b=t='']; ++p < h;) // initialize for height 1, all increment and spacing can be null
    i=1,z=b=' ',s[p]=t; // the for body is entered only if height > 1, initializing spacing and increment to the right values
  for(p=--h,k=64;++k<91;)
    s[p]+=t+String.fromCharCode(k),
    k-74||(s=s.map((x,q)=>x+(p-q?'         ':'avascript'))), // if 'J' modify each line of output adding the name or spacing
    p-=i,p<0|p>h?(i=-i,p-=i+i,t=z,b=t+t):t+=b; // index bouncing
  console.log(s.join('\n'))
}

Приклади

1

ABCDEFGHIJavascriptKLMNOPQRSTUVWXYZ

3 піднімаючись

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

4 зверху

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

7 йде вниз

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

9

JAVA (393)

Як завжди чудова мова для гольфу:

public class P{public static void main(String[]a){int h=Integer.valueOf(a[0]);String x="ABCDEFGHIJKLMNOPQRSTUVWXYZ";String[]l=new String[h];Arrays.fill(l,"");int i=h-1;int d=-1;for(char c:x.toCharArray()){for(int n=0;n<l.length;n++){String k=(n==i)?(c=='J')?"Java":c+"":(c=='J')?"    ":" ";l[n]+=k;}if(i==0&&d==-1)d=1;if(i==h-1&&d==1)d=-1;if(h>1)i+=d;}for(String s:l){System.out.println(s);}}}

2
На жаль, ви забули імпорт java.util.Arrays;. :-(
Джастін

Але ви можете імпортувати свій код: усуньте String x="ABC...Z";та замініть for(char c...заголовок циклу for (char c=65;++c<91;){, я люблю символи на Java =)
flawr

Крім того , ви можете замінити c=='J'з c==74, зберігає ще два байта в цілому.
flawr

2
Я впевнений, що ви можете зробити ще краще, якщо згорнути, якщо ви використовуєте деякі XOR для тих, якщо заяви, але ось моя вдосконалена версія: (325) public class p{public static void main(String[]a){int h=Integer.valueOf(a[0]),i=h-1,d=-1,n;String[]l=new String[h];for(n=0;n<h;l[n++]="");for(char c=64;++c<91;){for(n=0;n<h;n++){String k=n==i?c==74?"Java":c+"":c==74?" ":" ";l[n]+=k;}if(i==0&d==-1)d=1;if(i==h-1&d==1)d=-1;i+=h>1?d:0;}for(String s:l)System.out.println(s);}}@Quincunx: більше немає потреби в import.util.Arrays; =)
недолік

9

Рубін, 112 байт

o="#{' '*29}
"*h
26.times{|i|o[(h-i%(h<2?1:2*h-2)-1).abs*30+i+(i>17?3:0)]=(i+65).chr}
puts o.gsub('R   ','Ruby')

Очікує, що вхід буде збережено h.

Повідомте мене, чи потрібно це уточнення.


Дуже незначний, але ви можете видалити простір після %.
Захоплення Кальвіна

@ Calvin'sHobbies Ha, я не довіряв моєму синтаксису, що виділяється там: D. Виправить це пізніше.
Мартін Ендер

Ви можете замінити puts o...на $><<o....
Йорданія

6

J: 75 байт

NB. without IO |:26([:u:65+i.@[)`(($(,|.@}.@}:)@i.)<"1@,.i.@[)`(' '$~,~)}5
2(1!:2)~|.26([:u:65+i.@[)`(($(,|.@}.@}:)@i.)<"1@,.i.@[)`(' '$~,~)}".1!:1[1

Використання чудового сполучення Змінити . Як завжди, ІО некрасивий і незграбний, не вникаючи в деталі. Основне рішення займає 3 дієслова (такий собі дієслова, що має іменник (ака. Функція)):

  • а) генерація алфавіту
  • б) генерування показників
  • в) генерування матриці для внесення змін

    x (a bc}) y

a) - це досить тривіальний пошук у таблиці ascii

в) ще більш банально

б) є ​​цікавим. Мораль полягає в тому, що горизонтальні показники повинні починатися від 0, переходячи до y-1, і назад вниз, повторюючи це 26 разів. Напр. для у == 4:

0 1 2 3 2 1 0 1 2 3 2 1 ...

Реалізація цього дає б):

($(,|.@}.@}:)@i.) <"1@,. i.@[)       NB. is equivalent too
(tine0 tine1 tine2)                  NB. a fork with tines defined as
tine0 =: 
  hook0 =: hook0_0 hook0_1           NB. a dyadic hook: x (g h) y -: x g h y
     hook0_0 =: $                    NB. reshape
     hook0_1 =: (hook1_0 hook1_1)@i. NB. do hook1 after making 0-y
       hook1_0=: ,                   NB. append to self
       hook1_1=: |.@}.@}:            NB. rotated version of y after beheading and curtailing
tine2 =: i.@[                  NB. generate 0-x
tine1 =: <"1@,.                NB. glue together coordinates.

І о, корисний факт: J звуть ... "J".


Чи варто використовувати поправки? Мені здається, простіше сказати щось на зразок 3 :'|:(26$1+(i.1=y),}:|i:<:y)|.@{."+u:65+i.26'Потворної частини в цьому рішенні - це 8 символів просто до висоти 1, але це, ймовірно, може бути трохи скорочено.
b_jonas

Дякую за пропозицію! Ваше дійсно набагато коротше, і зміни, ймовірно, є надмірними. Оскільки це так різне, можливо, ви хочете опублікувати це як рішення самостійно?
jpjacobs

Спеціалізація каже, що "немає пробілів", і моє рішення робить друковані пробіли.
b_jonas

5

R (204)

f=function(x) {
  m=matrix(" ",x,26)
  i=x
  d=ifelse(x==1,0,-1)
  for (j in 1:26) {
    m[i,j]=LETTERS[j]
    if (!((i+d) %in% 1:x)) d=-d
    i=i+d
  }
  for (i in 1:x) cat(m[i,],"\n",sep="")
}

Результат

> f(1)
ABCDEFGHIJKLMNOPQRSTUVWXYZ
> f(2)
 B D F H J L N P R T V X Z
A C E G I K M O Q S U W Y 
> f(3)
  C   G   K   O   S   W   
 B D F H J L N P R T V X Z
A   E   I   M   Q   U   Y 
> f(7)
      G           S       
     F H         R T      
    E   I       Q   U     
   D     J     P     V    
  C       K   O       W   
 B         L N         X Z
A           M           Y 

Я бачу, що ви там робили! Дуже розумний ...
Кролтан

1
+1 Охайно! Ви можете позбутися пробілів навколо ваших forвисловлювань, хоча ( for(i in 1:x)cat(...наприклад) або навколо %in%.
планнапус

3

Javascript - 248 224 235

z=~~prompt(),y="ABCDEFGHIJKLMNOPQRSTUVWXYZ".split("");y[9]="Javascript";for(w=[],v=0;v<z;v++)w[v]="\n";v--;for(i=0;i<26;i++){for(j=0;j<z;j++)w[j]+=j-v?i-9?" ":"          ":y[i];~~(i/(z-1))%2?v++:v--;}if(z==1)w=y;console.log(w.join(""))

Ось посилання на jsfiddle, де ви можете його протестувати.
редагувати: Створив консольний журнал для однобічного шрифту та видалив коми, якщо введення == 1.


Пропозиції: 1: parseInt та Math.floor можуть бути змінені за допомогою цілочисельної операції примушування, як |0або ~~. 2: коротше будувати масив w безпосередньо, без split. for(w=[],v=0;v<z;v++)w[v]="\n";
edc65

... і немає вихідного оператора (console.log або будь-якого іншого, що ви використовуєте у своїй скрипці, це частина підрахунку знаків)
edc65

@ edc65 Дякую за поради. Ви мали рацію, що тут я забув вихід, тому я додав попередження, але моно-шрифту немає, тому він виглядає досить хаотично.
izlin

@izlin Замість (i==9?" ":" ")вас можна використовувати (i^9?" ":" "), що зберігає персонаж.
rev

1
ДОПОМОГА! хтось може пояснити? (Чому там двічі <code> v = 0 </code>?)
недолік

3

Perl 119

$s.=/26/?++$r&&$/:$m-1&&$r-abs$_%(2*$m-2)+1-$m?$"x(1+3*/15/):/15/?Perl:(A..Z)[$_]for(0..26)x($m=<>);print$s=~s/\s+$//rg

Ця програма бере вхід STDINі друкує результат на STDOUT.

І бонус - версія, яка суперечить правилам, оскільки вона друкує пробіли, але додає певну взаємодію:

#!/usr/bin/perl -p
$r=0;$_=join'',map{/26/?++$r&&$/:$m-1&&$r-abs$_%(2*$m-2)+1-$m?$"x(1+3*/15/):/15/?Perl:(A..Z)[$_]}(0..26)x($m=$_)

... і кілька тестів нижче:

1
ABCDEFGHIJKLMNOPerlQRSTUVWXYZ
2
 B D F H J L N Perl R T V X Z
A C E G I K M O    Q S U W Y
4
   D     J     Perl     V
  C E   I K   O    Q   U W
 B   F H   L N      R T   X Z
A     G     M        S     Y
6
     F         Perl         Z
    E G       O    Q       Y
   D   H     N      R     X
  C     I   M        S   W
 B       J L          T V
A         K            U

3

J, 67 57 61 символів

echo@dtb"1@|.@|:@(26&,$(u:65+i.26)#~1 j.26$(0#~1=]),<:#-&0 2)

Використовувати як функцію:

   echo@dtb"1@|.@|:@(26&,$(u:65+i.26)#~1 j.26$(0#~1=]),<:#-&0 2)
   D     J     P     V
  C E   I K   O Q   U W
 B   F H   L N   R T   X Z
A     G     M     S     Y

Пояснення: це рішення використовує інший підхід, ніж інший J-рішення. Замість того, щоб генерувати пилоподібну хвилю 0 1 2 3 2 1 0 1 ... , я подивився на інтервал між послідовними літерами. Наприклад, при п = 4 , якщо ви йдете від А вгору, щільно прилягати до другій колонці і досягти B, то ви знайдете чотири пробілу між A і B. Ця схема розтягування між буквами дуже регулярно: для п = 4 візерунок 4 4 4 2 2 2 4 4 4 ... .

Тож ідея спочатку побудувати сплющений (і транспонований) масив, а потім переформувати його та перевернути, щоб він виглядав правильно. Вихідна процедура проста (як мінімум, J, щонайменше): dtb - "видалити проміжні пробіли" і "1каже "діяти в кожному рядку". dtb та echo забезпечуються стандартною бібліотекою.

Завдяки Zsbán Ambrus за допомогу в гольфі .


3

MetaPost (207)

numeric h,d,y;h=5;d=-1;y=1;u=5mm;pair p;string s;for x=1upto26:p:=(x,y)*u;s:=char(x+64);if x=13:s:="MetaPost";elseif x>13:p:=(x+2,y)*u;fi;label.rt(s,p);if(y=h)or(y=1):d:=d*-1;fi;if h=1:d:=0;fi;y:=y+d;endfor;

введіть тут опис зображення

Ви можете спробувати тут.


2

Баш (213) (223)

read i
p=0
d=1
printf '\n%.0s' `seq $i`
for l in {A..Z}
do (($p==$i-1))&&((p=$p*-1))
(($i==1))&&p=0
(($p!=0))&&echo -en "\033[s\033[${p#-}A"
[[ "$l" == "B" ]]&&l="Bash"
echo -en $l"\033[s\033[${p#-}B"
((p++))
done

Незначні налаштування, і ми знизимось до 213.

У оригіналі була незначна помилка. Випробувано та підтверджено, що працює над версією 4.2.37.

Дякуємо @manatwork за вказівку на помилку та деякі поради.


Я відредагував вашу публікацію, додавши до неї підсвічування синтаксису, але тепер я бачу, що вона неправильно виділила частину вашого коду як коментар, тому я повернула її назад. Я щойно сказав це на випадок, коли вам було цікаво, чому я відкотив це назад :)
ProgramFOX

@ProgramFOX Це добре. Спасибі все одно!
Okw

Я думаю, що десь є незначні помилки, оскільки вихід повільно зменшується. (Принаймні, в Bash 4.3.) Деякі незначні вдосконалення щодо зменшення розміру до 194 символів: опустіть сигіл при арифметичному оцінюванні, не намагайтеся подвоїти цитати всередині подвійного котирування рядка: pastebin.com/zKa3zdwR
manatwork

Чи можете ви використовувати нові рядки замість деяких ;справедливих, щоб зробити її трохи зручнішою для читання? Це не вплине на ваш рахунок у гольфі
Digital Trauma

2

Haskell - 432 байт (на жаль ...)

Це виявилося набагато важче, ніж я очікував досягти чисто, звідси і здоровий байт. Я впевнений, що я (або хтось) міг би зробити краще, але я витратив на це занадто багато часу, як це є. Версія для гольфу така:

import Data.Matrix
import Data.Vector(toList)
r=repeat
s h=y h$l(take 26(case h of 1->r 1;_->concat$r$[h,h-1..1]++[2..h-1]))['A'..'Z']$matrix h 32(const ' ')<|>matrix h 1(const '\n')
l _[]m=m
l(x:i)(r:e)m=l i e$u m(let z=26-length i in if z<9 then z else z+6)x r
l _ _ m=m
u m c r h=case h of 'H'->t c r"Haskell"m;_->setElem h(r,c)m
t _ _[]m=m
t c r(x:i)m=t(c+1)r i$setElem x(r,c)m
y h m=concat[toList$getRow x m|x<-[1..h]]

Для запуску, завантажте код в ghciі виконати , putStr $ s Intде Intваша бажана висота. Ви також можете додати

import System.Environment
main :: IO ()
main = fmap (s . read . head) getArgs >>= putStr

під imports у текстовому файлі, компілюйте його ghcта передайте висоту як аргумент командного рядка. Негольована версія:

import System.Environment
import Data.Matrix
import Data.Vector (toList)

main :: IO ()
main = fmap (sawtooth . read . head) getArgs >>= putStr

type M = Matrix Char

sawtooth :: Int -> String
sawtooth height = let mat     = matrix height 32 (const ' ') <|> matrix height 1 (const '\n')
                      numbers = take 26 (case height of 1 -> repeat 1
                                                        _ -> concat $ repeat $ [height,height-1..1]++[2..height-1])
                      chars   = ['A'..'Z']
                  in toString height $ makeMatrix numbers chars mat

makeMatrix :: [Int] -> String -> M -> M
makeMatrix []     []     mat = mat
makeMatrix (x:xs) (s:ss) mat = makeMatrix xs ss $ updateMatrix
                                                    mat (let z = 26 - length xs in if z < 9 then z else z + 6) x s
makeMatrix _      _      mat = mat

updateMatrix :: M -> Int -> Int -> Char -> M
updateMatrix mat col row char = case char of 'H' -> insertHaskell col row "Haskell" mat
                                             _   -> setElem char (row, col) mat

insertHaskell :: Int -> Int -> String -> M -> M
insertHaskell _   _   []     mat = mat
insertHaskell col row (x:xs) mat = insertHaskell (col+1) row xs $ setElem x (row, col) mat

toString ::Int -> M -> String
toString height mat = concat [ toList $ getRow x mat | x <- [1..height] ]

Я вважаю, що ви можете замінити constна pure(використовуючи екземпляр Applicative для функцій), щоб зберегти кілька байт.
Esolanging Fruit

2

C # / LINQ:

using System;
using System.Linq;

namespace SawtoothAlphabet
{
    class Program
    {
        static void Main(string[] args)
        {
            int N = Int32.Parse(args[0]);   // eg 4
            Console.WriteLine(
                String.Join(Environment.NewLine, Enumerable.Range(0, N).Select(line =>
                    String.Concat(Enumerable.Range(0, 26).Select(i =>
                        line == Math.Abs(i % (2 * (N - 1)) - (N - 1))
                            ? (i == 2) ? "C#" : Char.ConvertFromUtf32(i + 'A')
                            : (i == 2) ? "  " : " ")
            ).TrimEnd())));
        }
    }
}

Коротке пояснення: Enumerable.Range(0, N).Select(...)змушує генерувати рядок для кожного рядка, який врешті-решт об'єднується в один рядок String.Join(Environment.NewLine, ...). Для кожного рядка, з якого ми переходимо всі 26 символів Enumerable.Range(0, 26).Select(...), тест на початку лямбда-виразу визначає, чи потрібно генерувати символ чи пробіл під час i==2перевірки на "C" та перетворює його в "C #" або два пробіли залежно від рядка . У String.Concat(...)звернених в результаті IEnumerable<char>для кожного рядка в рядок перед його передачею , TrimEnd(...)щоб акуратно стирають будь замикають прогалини.


1

PHP (216) (205)

Нова версія:

$b=array_fill(65,26,' ');$b[80]='   ';$b=array_fill(0,$i,$b);for($j=--$i,$x=64;++$x<91;$i||$j=0){$b[$j][$x]=chr($x);$x==80&&$b[$j][$x]='PHP';$j+=($d=$j<($d?$i:1))*2-1;}echo join("\n",array_map('join',$b));

Стара версія:

$b=array_fill(0,$i,array_fill(0,28,' '));for($j=--$i,$x=-1;++$x<28;$i||$j=0){$q=&$b[$j];$q[$x]=chr($x-($x&16)/8+65);$x==15&&($q[++$x]='H')*$q[++$x]='P';$j+=($d=$j<($d?$i:1))*2-1;}echo join("\n",array_map('join',$b));

очікує, що змінна $ i буде висотою.


1

C, 214 169 байт, без пробілів

Дякуємо @ edc65 та @tolos за їх корисні пропозиції.

#define C ((c-i+n-65)%z&&(c+i+n-67)%z)
n,i,m,c,z;main(){scanf("%d",&n);z=n<2?1:2*n-2;for(;i++<n;){for(m=c=64;c++<90;)m=C?m:c;for(c=64;c++<m;)putchar(C?32:c);puts("");}}

3
Це програний бій, але я наполягаю: #include <stdio.h> у багатьох випадках не потрібен, будь то gcc або будь-який інший компілятор. Це все-таки стандарт і дійсний C.
edc65

2
@ edc65: Залежить від того, що ви вважаєте "дійсним C". Це KA і C C для AFAIK, але ANSI / ISO C вимагає, щоб різноманітні функції (які включають scanfі printf) надавали прототипи, інакше ви отримаєте не визначене поведінку. #include <stdio.h>це, звичайно, найкоротший спосіб дати прототип як scanfі, і printf.
celtschk

@celtschk дійсних K&R мені достатньо для коду в гольф. І "у багатьох випадках" (коли використовується лише ставка для прикладу) є дійсним C89. Що я хочу наголосити - це не дивна поведінка gcc. (Думає про замітку про різноманітні функції, все одно)
edc65

1
Глобали набирають тип int та ініціалізуються до нуля. Можна також скинути intдекларацію за основний, якщо ви нічого не повертаєте. Може впасти додаткові дужки, замінити ' 'з 32і if(!C)m=cз ternarny заяву, і , як я тільки що дізнався (вище) замінити printf("\n")з puts("")для 18 знаків:n,i,m,c,z;main(){;scanf("%d",&n);z=n<2?1:2*n-2;for(;i<n;i++){for(m=c=65;c<91;c++)m=C?m:c;for(c=65;c<=m;c++)printf("%c",C?32:c);puts("");}}

1

Javascript ( 204 185 150)

h=m=4;d=h>1?-1:0;o=[];for(a=0;a<35;a++){for(r=h;r;r--)o[r]=(o[r]||"")+(r==m?"ABCDEFGHIJavascriptKLMNOPQRSTUVWXYZ"[a]:" ");if(a<9||a>17){m+=d;if(m<2||m==h)d=-d}}console.log(o.join("\n"))

EDIT

Збережено 13 байт, не будуючи масив та .join ("\ n"). Обов’язкове гортання петлі. Потім за допомогою кодування C син зробив код занадто розумним, щоб зберегти ще 12 байт.

Ось читабельна версія, що показує зміни логіки.

for (row = height; row; row--) {
    rowOfNextActiveLetter = 1;
    direction = height > 1 ? -1 : 0;
    output = "";
    for (a = 0; a < 35; a++) {
        output += (row == rowOfNextActiveLetter ? "ABCDEFGHIJavascriptKLMNOPQRSTUVWXYZ"[a] : "");
        if (a < 9 || a > 17) {
            rowOfNextActiveLetter -= direction;
            if (rowOfNextActiveLetter < 2 || rowOfNextActiveLetter == height)direction = -direction
        }
    }
    console.log(output)
}

Гольф (161):

for(r=h;r;r--){m=1;d=h>1?-1:0;o="";for(a=0;a<35;a++){o+=(r==m?"ABCDEFGHIJavascriptKLMNOPQRSTUVWXYZ"[a]:" ");if(a<9||a>17){m-=d;if(m<2||m==h)d=-d}}console.log(o)}

Гольф і заблукали (149):

for(r=h;r;r--,console.log(o))for(m=1,d=h>1?1:0,o="",a=0;a<35;)if(o+=r==m?"ABCDEFGHIJavascriptKLMNOPQRSTUVWXYZ"[a]:" ",a<9|a++>17)d=(m+=d)<2|m==h?-d:d

Мені це подобається, навіть якщо я не розумію його повною мірою. Але все одно ви можете вирізати 9 символів, видаляючи substr і використовуючи прямий індекс .substr(a,1)=>[a]
edc65

Можна додатково звузити його, скориставшись побітними операторами та об'єднавши ітератори для 182: h=m=4;d=1<h?-1:0;o=[];for(a=0;35>a;a++){for(r=h;r;r--)o[r]=(o[r]||"")+(r==m?"ABCDEFGHIJavascriptKLMNOPQRSTUVWXYZ"[a]:" ");if(9>a|17<a)if(m+=d,2>m||m==h)d=-d}console.log(o.join("\n"))
WallyWest


1

К, 60 байт

`0:'{+{x!y}.'+(26#{(!x),|1_!x-1}x;(((x-1)#" "),)'`c$65+!26)}

Досить прямо, і, схоже, я щойно вирішив J-рішення. :)

Спочатку створіть алфавіт:

  `c$65+!26
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"

І пилоподібна хвиля відповідної довжини:

  26#{(!x),|1_!x-1}5
0 1 2 3 4 3 2 1 0 1 2 3 4 3 2 1 0 1 2 3 4 3 2 1 0 1

Прокладіть кожну букву алфавіту з пробілами:

  (((5-1)#" "),)'"ABC"
("    A"
 "    B"
 "    C")

З'єднайте алфавіт та квадратну хвилю разом та обертайте кожен рядок:

  +(0 1 2;("  A";"  B";"  C"))
((0
  "  A")
 (1
  "  B")
 (2
  "  C"))

  {x!y}.'+(0 1 2;("  A";"  B";"  C"))
("  A"
 " B "
 "C  ")

А транспозиція цього - наша відповідь:

  +{x!y}.'+(0 1 2;("  A";"  B";"  C"))
("  C"
 " B "
 "A  ")

Спробуйте тут, в ОК .


0

С: 142 139 символів

Страшно довго, я очікую, що зможу трохи скоротити:

char a[26][27],i,j,p,d;main(n){for(scanf("%d",&n);i<26;d^=!p^p+2>n,p+=d-(d^n>1),i++)for(j=n;j--;a[j][i]=p^j?32:i+65);while(n)puts(a[--n]);}

Трохи легше читати:

char a[26][27], i, j, p, d;
main(n) {
    for (
        scanf("%d", &n);
        i < 26;
        d ^= !p ^ p + 2 > n,
        p += d - (d ^ n > 1),
        i++
    )
        for (
            j = n;
            j--;
            a[j][i] = p ^ j
                ? 32
                : i + 65
        );

    while (n)
        puts(a[--n]);
}

Редагувати: я пропустив правило "немає пробілів", але я повернусь.


0

Scala, 246 байт

def f(h:Int)={val a=Seq.fill(h)(Array.fill(32)(' '));var(r,x,d)=(h-1,0,if(h==1)0 else-1);def p(c:Char){a(r)(x)=c;x+=1};for(c<-'A'to'Z'){p(c);if(c==83)"cala"foreach p;r+=d;if(r==0|r==h-1)d*= -1};for(z<-a)println(new String(z)replaceAll(" +$",""))}

переформатував і прокоментував:

def f(h: Int) = {
  val a = Seq.fill(h)(Array.fill(32)(' '));
  // r - row; x - x coordinate, column; d - direction
  var (r, x, d) = (h - 1, 0, if(h==1) 0 else -1); 
  def p(c: Char) { // p for "put the character"
    a(r)(x) = c;
    x += 1
  };
  for(c <- 'A' to 'Z') { 
    p(c);
    if(c == 83)      // 83 == 'S'
      "cala" foreach p;
    r += d;
    if(r == 0 | r == h - 1)     // | is shorter than || 
      d *= -1
  };
  for(z <- a)
    println(new String(z) replaceAll (" +$", ""))  // trimming trailing whitespace
}

Результати:

scala> f(4)
   D     J     P         V
  C E   I K   O Q       U W
 B   F H   L N   R     T   X Z
A     G     M     Scala     Y

scala> f(5)
    E       M           U
   D F     L N         T V
  C   G   K   O   Scala   W
 B     H J     P R         X Z
A       I       Q           Y

scala> f(1)
ABCDEFGHIJKLMNOPQRScalaTUVWXYZ

0

Пітон - 137

Вхід для зберігання в ieg i=8

l=[""]*h;k=j=0;y=h-1;exec'l[y]+=" "*(j-len(l[y]))+chr(k+65)+"ython"*(k==15);j=len(l[y]);y-=1^k/(h-(h>2))%2*-2;k+=1;'*26;print"\n".join(l)

0

Ракетка

Ось чиста функціональна версія: пропозиції скоротити її вітаються.

(define (sawtooth n)
  (define (ST i d m lns)
    (if (null? m) 
        lns
        (let* ([v (first m)]
               [spc (make-string (string-length v) #\space)]
               [I (+ i d)])
          (ST I
              (if (or (zero? I) (= (sub1 n) I)) (* d -1) d)
              (rest m)
              (for/list ([ln lns] [j n])
                       (~a ln (if (= i j) v spc)))))))
  (displayln
   (string-join 
    (ST (sub1 n)
        (if (= n 1) 0 -1) 
        (string-split "A B C D E F G H I J K L M N O P Q Racket S T U V W X Y Z")
        (make-list n "\n")))))

Вихідні дані

> (sawtooth 1)
ABCDEFGHIJKLMNOPQRacketSTUVWXYZ

> (sawtooth 2)
 B D F H J L N P Racket T V X Z 
A C E G I K M O Q      S U W Y 

> (sawtooth 8)
       H                  V     
      G I                U W    
     F   J              T   X   
    E     K            S     Y  
   D       L     Racket       Z 
  C         M   Q               
 B           N P                
A             O  
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.