Codegolf — Обратные Положительные Пробежки

  • Автор темы Kdr
  • Обновлено
  • 22, Oct 2024
  • #1

Вход

Ваши входные данные представляют собой список однозначных чисел в любом разумном формате, включая строку цифр.

Ввод не будет пустым.

Выход

Ваш вывод должен быть входным списком, но с обратным изменением каждой максимальной серии ненулевых цифр.

Пример

 
 
 
 
 
 
 <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/Sites/codegolf/all.css?v=617d0685f6f3">
<div id="answer-list">

<h2>Leaderboard</h2>

<table class="answer-list">

<thead>

<tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr>

</thead>

<tbody id="answers">

</tbody>

</table>
</div>
<div id="language-list">

<h2>Winners by Language</h2>

<table class="language-list">

<thead>

<tr><td>Language</td><td>User</td><td>Score</td></tr>

</thead>

<tbody id="languages">

</tbody>

</table>
</div>
<table style="display: none">

<tbody id="answer-template">

<tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td><a href="{{LINK}}">{{SIZE}}</a></td></tr>

</tbody>
</table>
<table style="display: none">

<tbody id="language-template">

<tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td><a href="{{LINK}}">{{SIZE}}</a></td></tr>

</tbody>
</table> 

Рассмотрим ввод

body { text-align: left !important} #answer-list { padding: 10px; width: 290px; float: left; } #language-list { padding: 10px; width: 290px; float: left; } table thead { font-weight: bold; } table td { padding: 5px; }

где ненулевые прогоны отмечены стрелками.

Обращая каждое из этих прогонов, мы получаем результат

Правила и подсчет очков Вы можете написать полную программу или функцию.

Выигрывает наименьшее количество байтов, а стандартные лазейки запрещены.

/* Configuration */ var QUESTION_ID = 78510; // Obtain this from the url // It will be like https://XYZ.stackexchange.com/questions/QUESTION_ID/... on any question page var ANSWER_FILTER = "!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe"; var COMMENT_FILTER = "!)Q2B_A2kjfAiU78X(md6BoYk"; var OVERRIDE_USER = 32014; // This should be the user ID of the challenge author. /* App */ var answers = [], answers_hash, answer_ids, answer_page = 1, more_answers = true, comment_page; function answersUrl(index) { return "https://api.stackexchange.com/2.2/questions/" + QUESTION_ID + "/answers?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + ANSWER_FILTER; } function commentUrl(index, answers) { return "https://api.stackexchange.com/2.2/answers/" + answers.join(';') + "/comments?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + COMMENT_FILTER; } function getAnswers() { jQuery.ajax({ url: answersUrl(answer_page++), method: "get", dataType: "jsonp", crossDomain: true, success: function (data) { answers.push.apply(answers, data.items); answers_hash = []; answer_ids = []; data.items.forEach(function(a) { a.comments = []; var id = +a.share_link.match(/\d+/); answer_ids.push(id); answers_hash[id] = a; }); if (!data.has_more) more_answers = false; comment_page = 1; getComments(); } }); } function getComments() { jQuery.ajax({ url: commentUrl(comment_page++, answer_ids), method: "get", dataType: "jsonp", crossDomain: true, success: function (data) { data.items.forEach(function(c) { if (c.owner.user_id === OVERRIDE_USER) answers_hash[c.post_id].comments.push(c); }); if (data.has_more) getComments(); else if (more_answers) getAnswers(); else process(); } }); } getAnswers(); var SCORE_REG = /<h\d>\s*([^\n,]*[^\s,]),.*?(-?\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/; var OVERRIDE_REG = /^Override\s*header:\s*/i; function getAuthorName(a) { return a.owner.display_name; } function process() { var valid = []; answers.forEach(function(a) { var body = a.body; a.comments.forEach(function(c) { if(OVERRIDE_REG.test(c.body)) body = '<h1>' + c.body.replace(OVERRIDE_REG, '') + '</h1>'; }); var match = body.match(SCORE_REG); if (match) valid.push({ user: getAuthorName(a), size: +match[2], language: match[1], link: a.share_link, }); }); valid.sort(function (a, b) { var aB = a.size, bB = b.size; return aB - bB }); var languages = {}; var place = 1; var lastSize = null; var lastPlace = 1; valid.forEach(function (a) { if (a.size != lastSize) lastPlace = place; lastSize = a.size; ++place; var answer = jQuery("#answer-template").html(); answer = answer.replace("{{PLACE}}", lastPlace + ".") .replace("{{NAME}}", a.user) .replace("{{LANGUAGE}}", a.language) .replace("{{SIZE}}", a.size) .replace("{{LINK}}", a.link); answer = jQuery(answer); jQuery("#answers").append(answer); var lang = a.language; if (! /<a/.test(lang)) lang = '<i>' + lang + '</i>'; lang = jQuery(lang).text().toLowerCase(); languages[lang] = languages[lang] || {lang: a.language, user: a.user, size: a.size, link: a.link, uniq: lang}; }); var langs = []; for (var lang in languages) if (languages.hasOwnProperty(lang)) langs.push(languages[lang]); langs.sort(function (a, b) { if (a.uniq > b.uniq) return 1; if (a.uniq < b.uniq) return -1; return 0; }); for (var i = 0; i < langs.length; ++i) { var language = jQuery("#language-template").html(); var lang = langs[i]; language = language.replace("{{LANGUAGE}}", lang.lang) .replace("{{NAME}}", lang.user) .replace("{{SIZE}}", lang.size) .replace("{{LINK}}", lang.link); language = jQuery(language); jQuery("#languages").append(language); } }

Этот вызов

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

<s>57</s>

Тестовые случаи ## Language, N bytes will appear as 57.

4 -> 4 00 -> 00 123 -> 321 0010 -> 0010 12000345 -> 21000543 18161604 -> 61618104 95883007414830 -> 38859003841470 010230456078912 -> 010320654021987 357509902003550 -> 575309902005530 2492882377675046 -> 5767732882942064 03026302053000357099 -> 03036202035000753099 38859003841470 95883007414830 <---> <---->

Таблица лидеров

Kdr


Рег
25 Apr, 2007

Тем
69

Постов
182

Баллов
547
  • 26, Oct 2024
  • #2

Пиф, 8

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 using System;
using System.Collections.Generic;

namespace Namespace {

class Program {

static void Main( String[] args ) {

List<String> ls = new List<String>() {

"4",

"00",

"123",

"0010",

"12000345",

"18161604",

"95883007414830",

"010230456078912",

"357509902003550",

"2492882377675046",

"03026302053000357099"

};

foreach (String s in ls) {

String f = m( s );

Console.WriteLine( String.Format( "{0,30}", s.Replace( "0", "0 " ) ) );

Console.WriteLine( String.Format( "{0,30}", f.Replace( "0", "0 " ) ) );

Console.WriteLine( "" );

}

Console.ReadLine();

}

static String m( String s ) {

for (Int32 i = 0, p = i; i < s.Length; i++) {

if (s[ i ] == '0') {

p = i + 1;

} else {

s = s.Insert( p, s[ i ].ToString() ).Remove( i + 1, 1 );

}

}

return s;

}

}
}
 

Разделить по нулям, перевернуть и снова соединить по нулям.

Тестовый набор

 

AssoriAdurell52


Рег
25 Oct, 2024

Тем
73

Постов
206

Баллов
611
  • 26, Oct 2024
  • #3

ИПОС, 5 байт

String m( String s ) { // i = Index on the String // p = Pointer of the last '0' found for (int i = 0, p = i; i < s.Length; i++) { if (s[ i ] == '0') { // Move the 'p' pointer to the index after this '0' p = i + 1; } else { // Insert the Char at the Index location to the Pointer location // and remove the one at the Index Location + 1, // since the String was incremented by one char due to the 'Insert()'. s = s.Insert( p, s[ i ].ToString() ) .Remove( i + 1, 1 ); } } return s; }

String m(String s){for(int i=0,p=i;i<s.Length;i++){if(s[i]=='0'){p=i+1;}else{s=s.Insert(p,s[i].ToString()).Remove(i+1,1);}}return s;} splits the input string on zeroes, applies the command string j(string input) { string[] a = input.Split('0'); foreach (string s in a) { if (s!="") input=input.Replace(s, new string(s.ToCharArray().Reverse().ToArray())); } return input; } (обратно) к каждой подстроке и объединяет результат обратно по нулям.

 

Elvie


Рег
06 Mar, 2008

Тем
62

Постов
197

Баллов
527
  • 26, Oct 2024
  • #4

сетчатка, 15 байт

string j(string i){foreach(var s in i.Split('0'))if(s!="")i=i.Replace(s,new string(s.ToCharArray().Reverse().ToArray()));return i;}

Попробуйте онлайн! (Немного изменено для одновременного запуска всех тестовых случаев.)

Объяснение

k"a%sa"%'0@s♂R'0j#pXdX k"a%sa"% surround input with "a" characters '0@s split on 0 ♂R reverse each piece '0j join on 0 #pXdX listify, remove first and last element (the "a"s)

Разделить ввод вокруг a s that is, put each (possibly empty) run of non-zero digits on its own line.

a

Это переворачивает каждую строку:

  • Применение сцены к каждой строке индивидуально с помощью k"a%sa"%'0@s♂R'0j#pXdX .
  • Сопоставление каждого персонажа индивидуально с {$_=pop;y/0/ /;map$i.=reverse,split/\b/;$i=~y/ /0/r} .
  • Сортируем его по результату подстановки ( 0 ) with the empty string (the empty second line). I.e. it doesn't sort at all, since all sort values are identical.
  • Затем меняет порядок отсортированных символов.

Окончательно:

"0"/

Превратите перевод строки обратно в |' s.

 

Tubessesecaps


Рег
24 Jun, 2015

Тем
73

Постов
178

Баллов
583
  • 26, Oct 2024
  • #5

05AB1E, 6 байт

Код:

0

Объяснение:

"0"\

Использование CP-1252 кодировка. Попробуйте онлайн!.

 

ThudgeFedgise2


Рег
20 Jan, 2024

Тем
69

Постов
182

Баллов
567
  • 26, Oct 2024
  • #6

Юлия, 30 байт

"0"/|'"0"\

Это анонимная функция, которая принимает строку и возвращает строку. Чтобы вызвать его, присвойте его переменной.

function provides the ability to replace matches of a regular expression with the result of a function applied to each match. In this case we can get nonzeros using и замените эти прогоны результатом ¬ function applied to the matched text.

Проверьте все тестовые примеры онлайн!

 

OroginalSonor


Рег
03 Dec, 2011

Тем
62

Постов
177

Баллов
497
  • 26, Oct 2024
  • #7

сетчатка, 25 24

ġ

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

Сэкономлен 1 байт благодаря Мартину!

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

Видеть Решение Мартина за умелое использование построчного режима для получения более короткой программы!

 

Tearvenda


Рег
22 Mar, 2020

Тем
89

Постов
215

Баллов
670
  • 26, Oct 2024
  • #8

Йольф, 8 байт

ṁ↔ġ¬

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

Объяснение

f(s,p,r) char*s,*p,*r; // K&R style to avoid repeating `char` { // x(^)x(==) expands to... // Find the next zero digit for(p = s; *s && '0' ^ *s; ++s) ; // Print that run backwards for(r = s; r-- > p; putchar(*r)) ; // Find the next non-zero digit for(p = s; *s && '0' == *s; ++s) ; // Print that run backwards (no difference, it's all zeros) for(r = s; r-- > p; putchar(*r)) ; // If there's more string, recurse *s && f(s); }

Если присмотреться, объяснение кода выглядит как лямбда.

Эквивалентный 8-байтовый ответ:

f

То же самое, но используется #define x(o)for(p=s;*s&&'0'o*s;++s);for(r=s;r-->p;putchar(*r)); f(s,p,r)char*s,*p,*r;{x(^)x(==)*s&&f(s);} (string mirror lambda) instead.

 

Edd


Рег
12 Apr, 2006

Тем
69

Постов
197

Баллов
582
  • 26, Oct 2024
  • #9

Рубин, 29 байт

[1-9] ||answer||

Питон, 58 50 байт

printf

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

 

Assensio


Рег
18 Nov, 2016

Тем
61

Постов
160

Баллов
505
  • 26, Oct 2024
  • #10

Математика, 30 байт

echo -n

например perl -pe 's/[^0]+/reverse$&/eg' <<<21000543 = s/[^0]+/reverse$&/eg

 

Stenttheply8


Рег
26 Jun, 2008

Тем
77

Постов
207

Баллов
612
  • 26, Oct 2024
  • #11

PowerShell v2+, 45 байт

-p

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

Объяснение

Пример того, как это работает: предположим, SELECT LISTAGG(REVERSE(COLUMN_VALUE||''))WITHIN GROUP(ORDER BY rownum)FROM XMLTABLE(('"'||REPLACE(:1,'0','","0","')||'"')); was the input import java.util.*;static void r(String s){StringJoiner x= new StringJoiner("0");for(String a:s.split("0",s.length())){x.add(new StringBuilder(a).reverse());}System.out.print(x);} . После let f x=x="";x.Split '0'|>Array.map(fun s->System.String(s|>Seq.toArray|>Array.rev))|>String.concat "0" on ["","0","12","0","","0","3","0",""] , конвейер будет содержать массив split(oneOf"0") "0120030" . The first loop with 0 имеет текущий элемент split equal to "0321005400876090" , который затем неявно преобразуется в строку, а затем инвертируется с помощью (reverse=<<).split(oneOf"0") $ "0123004500678090" indexing. That makes it import Data.Lists (reverse=<<).split(oneOf"0") как массив символов. Петля pos? puts that back into a string #(flatten(map reverse(partition-by pos? %))) и оставляет его на конвейере. Следующая (последняя) итерация цикла меняет входные данные на 0}:@;@(<@|.;.1)@,] . So now our pipeline is a=>a.map((n,i)=>n?a[z-i+[...a,0].indexOf(0,i)]:(z=i,0),z=-1) , s=>s.replace(/[^0]+/g,r=>[...r].reverse().join``) . That's encapsulated in parens \0c - input().split("0") m_ - map(reversed, ^) \0J - "0".join(^) поэтому он преобразуется в массив и повторно \0cm_\0J ed back together with zeros to produce the resultant output string r%(h:t)|h<1=r++h:[]%t|1>0=(h:r)%t r%_=r ([]%) r%l|0:t<-l=r++0:[]%t|h:t<-l=(h:r)%t r%_=r ([]%) . Это остается в конвейере, а вывод на консоль неявный.

Если в исходном вводе есть последующие нули, массив будет заполнен нулевыми элементами, поэтому на выходе будет правильное количество нулей. Например, r turns into 0 и все продолжается, как указано выше.

 

Duncan


Рег
26 Jan, 2007

Тем
73

Постов
177

Баллов
562
  • 26, Oct 2024
  • #13

Фактор, 35 байт

Победа над Pyfon и Clojure, ура!

r%(0:t)=r++0:[]%t r%(h:t)=(h:r)%t r%_=r ([]%)

Эта анонимная функция является буквальным переводом этот ответ Python.

Это довольно просто: просто разбейте строку на нули, переверните каждый элемент результирующего массива и соедините все элементы (включая строки нулевой длины) с помощью "00210" .

Вот пример его работы во всех тестовых случаях:

{ "" "" "21" "" }

{ "" "" "12" "" } -> "00120" -> IN: scratchpad auto-use { "4" "00" "123" "0010" "12000345" "18161604" "95883007414830" "010230456078912" "357509902003550" "2492882377675046" "03026302053000357099" } [ "0" split [ reverse ] map "0" join ] map . { "4" "00" "321" "0010" "21000543" "61618104" "38859003841470" "010320654021987" "575309902005530" "5767732882942064" "03036202035000753099" } -> "0"

 

Kraftor322


Рег
04 Nov, 2014

Тем
89

Постов
200

Баллов
685
  • 26, Oct 2024
  • #14

Хаскель, 45 байт

[ "0"split [ reverse ] map "0"join ]

Рекурсивно накапливает перевернутый фрагмент в ṣ0Uj0 , prepending it when a (123,,45) достигается. Когда оставшаяся строка пуста, она также разряжается. 1230045-split0 .

Первые два повторяют какой-то код, но более короткого способа их объединения (45 и 47 байт) я не нашел:

"321054" ||answer||

Пайк, 8 байт

-join

Объяснение:

()

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

 

Александр Журба


Рег
28 Oct, 2020

Тем
65

Постов
187

Баллов
542
  • 26, Oct 2024
  • #15

JavaScript (ES6), 50 49 байт

Строковая версия:

"54"

Сэкономил байт благодаря @Kevin Lau!

Версия массива (60 байт):

"321" ||answer||

Дж, 20 18 байт

"54"

Спасибо Згарбу за помощь в этом! Принимает список, разделенный пробелами, в качестве правого аргумента.

-2 байта спасибо Згарбу!

 

ZYoma


Рег
29 Oct, 2019

Тем
83

Постов
203

Баллов
618
  • 26, Oct 2024
  • #16

Clojure/ClojureScript, 44 символа

"321"

То же решение, что и другие, но более подробное из-за длинных имен функций. Из-за этого не собирался публиковать это, но это лучше некоторых других ответов, так почему бы и нет?

Работает с любым типом последовательности. В ClojureScript это также работает со строками, поскольку строки обрабатываются как списки символов, которые на самом деле представляют собой просто строки длиной 1, которые приводятся к числам для таких вещей, как -join .

 

RudNick


Рег
26 Nov, 2003

Тем
61

Постов
206

Баллов
521
  • 26, Oct 2024
  • #17

Хаскель, 46 байт

('3','2','1')

Пример использования: [] -> 123 .

К сожалению, $_ function requires the expensive import. Split the input list at every |%{...} , например (123,45) -> 0 , перевернуть каждый фрагмент и объединить его в одну строку.

 

SvanXFs


Рег
15 Oct, 2007

Тем
67

Постов
215

Баллов
570
  • 26, Oct 2024
  • #18

F#, 103 байта

-split ||answer||

Java, 179 байт (с импортом)

$args

Принимает строковый ввод, разделяет символы на ноль, а затем добавляет их обратно, вызывая метод add класса StringJoiner.

 

Uramurga


Рег
10 Mar, 2011

Тем
70

Постов
192

Баллов
552
  • 26, Oct 2024
  • #19

Oracle SQL 11.2, 131 123 байта

Злоупотребление функциями XML.

123045 ||answer||

Перл, 22 байта

В том числе +1 за ($args-split0|%{-join$_[$_.length..0]})-join0 option:

{3, 2, 1, 0, 0, 9, 5, 0}

Это довольно тривиальная замена — извините, что так скучно. Обратите внимание, что если ваш ввод заканчивается новой строкой (например, используя Join@@Reverse/@#~SplitBy~Sign&[{1,2,3,0,0,5,9,0}] in Bash), it will catch the newline with the digits - use Join@@Reverse/@#~SplitBy~Sign& или lambda x:"0".join([n[::-1] for n in x.split("0")]) to avoid that. Alternatively, for a cost of one additional byte, change the character class to ->x{x.gsub /[^0]*/,&:reverse} , и вы можете предоставить множество входных данных, по одному на строку.

 

Bulychev.r


Рег
08 Nov, 2019

Тем
60

Постов
183

Баллов
493
  • 26, Oct 2024
  • #21

Bruiprori23


Рег
25 Oct, 2024

Тем
70

Постов
182

Баллов
562
  • 26, Oct 2024
  • #22

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

s->replace(s,r"[^0]+",reverse)

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

Подобно многим другим подходам; принимает (неявный) ввод в виде строки цифр:

  • 0¡ # Split on zeros €R # For each item in the array, reverse it 0ý # Join by zeros split input on 0¡€R0ý с
  • 0 reverse each chunk
  • ¶ 0 join with $ с
 

Toresoore


Рег
25 Apr, 2006

Тем
73

Постов
213

Баллов
598
  • 26, Oct 2024
  • #23

Перл 5, 52 байта

Подпрограмма:

. ||answer||

На самом деле 22 байта

%

Это на самом деле заставило меня заметить, что в команде разделения есть ошибка — она не сохраняет пустые разделения. В качестве обходного пути я окружаю входную строку значком O%^$`. s before doing the split, reverse, and join, then remove the 0 s в конце. На вход принимается строка, на выходе — список односимвольных строк.

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

Объяснение:

S`0 ||answer||

С#, 131 байт ##

решение ошибочное!

S`0 O%^$`. ¶ 0

без гольфа:

r ||answer||

С#, 133 байта


играл в гольф

%

Негольфед

'0!r%

Полный код

j0_Mcz\0
 

Olga.berezka7575


Рег
02 Dec, 2019

Тем
84

Постов
213

Баллов
643
Тем
403,760
Комментарии
400,028
Опыт
2,418,908

Интересно