プログラミングのお題スレです。
【出題と回答例】
1 名前:デフォルトの名無しさん
お題:お題本文
2 名前:デフォルトの名無しさん
>>1 使用言語
回答本文
結果がある場合はそれも
【ソースコードが長くなったら】 (オンラインでコードを実行できる)
https://ideone.com/
http://codepad.org/
http://compileonline.com/
http://rextester.com/runcode
https://runnable.com/
https://code.hackerearth.com/
http://melpon.org/wandbox
https://paiza.io/
宿題は宿題スレがあるのでそちらへ。
※前スレ
プログラミングのお題スレ Part21
https://mevius.5ch.net/test/read.cgi/tech/1668333636/
探検
プログラミングのお題スレ Part22
1デフォルトの名無しさん
2023/08/03(木) 13:52:13.20ID:/xW45k0z168デフォルトの名無しさん
2023/11/27(月) 18:30:50.07ID:O6HTjvgJ169156
2023/11/27(月) 20:35:49.92ID:VuTnBSK2 >>156 c
https://ideone.com/K1fD78
・lispのひとの(>>162)をパク…参考にしました
・乱数生成部分は https://c-faq.com/lib/randrange.html からコピペしました
int main() {
int a[9999] = {0}, size = sizeof a / sizeof *a, sum, min, max, r, i, j, k;
srand(time(0));
#define randi(size) ((int)((double)rand() / ((double)RAND_MAX + 1) * (size)))
for (r = size; 0 < r; ) if (!a[randi(size)]++) r--;
for (sum = min = max = a[0], i = 1; i < size; i++) {
sum += a[i];
min = min < a[i] ? min : a[i];
max = a[i] < max ? max : a[i];
}
printf("%d\n%f\n[%d, %d]\n", sum, (double)sum / size, min, max);
for (i = min; i <= max; i++) {
for (k = j = 0; j < size; j++) if (i == a[j]) k++;
printf("%d\t%d\n", i, k);
}
return 0;
}
https://ideone.com/K1fD78
・lispのひとの(>>162)をパク…参考にしました
・乱数生成部分は https://c-faq.com/lib/randrange.html からコピペしました
int main() {
int a[9999] = {0}, size = sizeof a / sizeof *a, sum, min, max, r, i, j, k;
srand(time(0));
#define randi(size) ((int)((double)rand() / ((double)RAND_MAX + 1) * (size)))
for (r = size; 0 < r; ) if (!a[randi(size)]++) r--;
for (sum = min = max = a[0], i = 1; i < size; i++) {
sum += a[i];
min = min < a[i] ? min : a[i];
max = a[i] < max ? max : a[i];
}
printf("%d\n%f\n[%d, %d]\n", sum, (double)sum / size, min, max);
for (i = min; i <= max; i++) {
for (k = j = 0; j < size; j++) if (i == a[j]) k++;
printf("%d\t%d\n", i, k);
}
return 0;
}
17017
2023/11/28(火) 15:35:44.30ID:cIauX08C >>156
今度はC言語
https://paiza.io/projects/c6ALnYb4rksMFGZT03mcCw
1~9999ではなく実際には0~9998でやっているが、表示する必要もないし一々1足したり後で引いたりも馬鹿らしいのでそのままにした。
今度はC言語
https://paiza.io/projects/c6ALnYb4rksMFGZT03mcCw
1~9999ではなく実際には0~9998でやっているが、表示する必要もないし一々1足したり後で引いたりも馬鹿らしいのでそのままにした。
171デフォルトの名無しさん
2023/11/30(木) 06:46:26.20ID:/rzYr39l お題:英字の羅列された文字列が与えられる。この文字列を分析して数字列を出力せよ。数字の表記ルールは、その文字の両隣の文字がASCIIコードにおける奇数だったら1、そうでなければ0.
172デフォルトの名無しさん
2023/11/30(木) 09:19:30.52ID:AZ5oWFgm 前提としてエラー入力はなくて
出力は両隣がある時のみでいいのかな
use itertools::{Itertools, assert_equal};
fn convert(input: &[u8]) -> Vec<u8> {
input
.iter()
.tuple_windows()
.map(|(prev, _curr, next)| (prev & next & 1) + b'0')
.collect()
}
fn main() {
assert_equal(&convert(b"ABC"), b"1");
assert_equal(&convert(b"abcIJKpqrXYZ"), b"1001010000");
}
出力は両隣がある時のみでいいのかな
use itertools::{Itertools, assert_equal};
fn convert(input: &[u8]) -> Vec<u8> {
input
.iter()
.tuple_windows()
.map(|(prev, _curr, next)| (prev & next & 1) + b'0')
.collect()
}
fn main() {
assert_equal(&convert(b"ABC"), b"1");
assert_equal(&convert(b"abcIJKpqrXYZ"), b"1001010000");
}
173デフォルトの名無しさん
2023/11/30(木) 20:13:06.94ID:tzHzM+FM >>171 octave
https://ideone.com/mx954D
function a = f(s)
o = rem([0 uint8(s) 0], 2) == 1;
a = o(1:end-2) & o(3:end);
end
>>171 c
https://ideone.com/VsnqKu
void f(const char *s, int *out, int *len) {
int i;
for (*len = strlen(s), i = 0; i < *len; i++)
out[i] = (i == 0 || i == *len - 1) ? 0 : s[i - 1] & s[i + 1] & 1;
}
https://ideone.com/mx954D
function a = f(s)
o = rem([0 uint8(s) 0], 2) == 1;
a = o(1:end-2) & o(3:end);
end
>>171 c
https://ideone.com/VsnqKu
void f(const char *s, int *out, int *len) {
int i;
for (*len = strlen(s), i = 0; i < *len; i++)
out[i] = (i == 0 || i == *len - 1) ? 0 : s[i - 1] & s[i + 1] & 1;
}
174デフォルトの名無しさん
2023/11/30(木) 20:40:22.09ID:2Igm/ys/17517
2023/12/02(土) 14:30:47.66ID:FLL1Kaqa >>171
Kotlin
https://paiza.io/projects/xZXVc46Ys3qUlGX4DAIxzw
両隣が存在する文字のみを対象に処理をするようにした。なので3文字未満はエラーになる。3文字の場合は2文字目だけを対象にして一つ結果を出す。
Kotlin
https://paiza.io/projects/xZXVc46Ys3qUlGX4DAIxzw
両隣が存在する文字のみを対象に処理をするようにした。なので3文字未満はエラーになる。3文字の場合は2文字目だけを対象にして一つ結果を出す。
176デフォルトの名無しさん
2023/12/04(月) 20:26:07.07ID:LtCaDuZa >>171 Ruby
def solution1( str )
a = 0
str.chars.inject(''){|s,c|
s << ( (5 & (a = 7 & a << 1 | c.ord & 1) == 5)? '1' : '0' )
}[2..-1] || ''
end
solution( '' ) #=> ""
solution( 'AB' ) #=> ""
def solution1( str )
a = 0
str.chars.inject(''){|s,c|
s << ( (5 & (a = 7 & a << 1 | c.ord & 1) == 5)? '1' : '0' )
}[2..-1] || ''
end
solution( '' ) #=> ""
solution( 'AB' ) #=> ""
177デフォルトの名無しさん
2023/12/08(金) 09:07:44.84ID:Fcz3Modv178デフォルトの名無しさん
2023/12/10(日) 17:41:17.00ID:Dj8Ho2Ik179デフォルトの名無しさん
2023/12/13(水) 09:27:48.18ID:NbIWTS6w お題
ビールの空きビンをN本集めると新品のビール1本と交換してもらえる
あなたが新品のビールをP本持っている
そのとき、あなたが飲めるビールはR本である
N, Pを引数としてRを返す関数を定義してください
ビールの空きビンをN本集めると新品のビール1本と交換してもらえる
あなたが新品のビールをP本持っている
そのとき、あなたが飲めるビールはR本である
N, Pを引数としてRを返す関数を定義してください
18017
2023/12/13(水) 15:17:15.28ID:WwinWAeQ18117
2023/12/13(水) 15:19:45.81ID:WwinWAeQ ごめん。これだと1回分しか計算してないね。ということで >>180 はボツ。
18217
2023/12/13(水) 15:47:32.26ID:WwinWAeQ >>179
Kotlin
https://paiza.io/projects/1gGtpt6dxb6-vzoATj_Qkg
作り直した。
もっと簡略化できそうな感じもしたがやってない。何か画期的な計算方法やアルゴリズムに気付いたらまた作る。
Kotlin
https://paiza.io/projects/1gGtpt6dxb6-vzoATj_Qkg
作り直した。
もっと簡略化できそうな感じもしたがやってない。何か画期的な計算方法やアルゴリズムに気付いたらまた作る。
183デフォルトの名無しさん
2023/12/13(水) 18:37:32.11ID:8Qa5an+7 >>179 Ruby
def solution( n, m )
b = r = n
while (k = b.div( m )) != 0
b += k - k * m
r += k
end
r
end
solution( 5, 3 ) #=> 7
def solution( n, m )
b = r = n
while (k = b.div( m )) != 0
b += k - k * m
r += k
end
r
end
solution( 5, 3 ) #=> 7
184デフォルトの名無しさん
2023/12/14(木) 00:01:58.90ID:WyfgSj4g >>179
https://ideone.com/tvmy6F
let f n p =
let rec aux r p q =
if p = 0 then r else aux (r + p) ((p + q) / n) ((p + q) mod n)
in aux 0 p 0
let () = print_int @@ f 3 5
↓
7
https://ideone.com/tvmy6F
let f n p =
let rec aux r p q =
if p = 0 then r else aux (r + p) ((p + q) / n) ((p + q) mod n)
in aux 0 p 0
let () = print_int @@ f 3 5
↓
7
185デフォルトの名無しさん
2023/12/14(木) 00:03:09.36ID:uNhVrYF218617
2023/12/19(火) 15:39:00.18ID:S/sB6wJe187デフォルトの名無しさん
2024/01/16(火) 00:33:05.98ID:n8j0XaXx お題:時刻の文字列が与えられる。その時刻から1秒後の時刻を出力せよ。
例
入力:00:00:00
出力:00:00:01
入力:23:59:59
出力:00:00:00
例
入力:00:00:00
出力:00:00:01
入力:23:59:59
出力:00:00:00
1889
2024/01/16(火) 02:37:52.68ID:SfyAs2IF >>187 Perl5
use Time::Piece;
use Time::Seconds;
for (qw{00:00:00 23:59:59}) {
$t = Time::Piece->strptime($_, '%T') + 1;
print "入力:$_\n出力:", $t->strftime('%T'), "\n";
}
※見易くするためインデントを全角スペースに置換してあります
実行結果
~ $ perl 22_187_1秒後.pl
入力:00:00:00
出力:00:00:01
入力:23:59:59
出力:00:00:00
use Time::Piece;
use Time::Seconds;
for (qw{00:00:00 23:59:59}) {
$t = Time::Piece->strptime($_, '%T') + 1;
print "入力:$_\n出力:", $t->strftime('%T'), "\n";
}
※見易くするためインデントを全角スペースに置換してあります
実行結果
~ $ perl 22_187_1秒後.pl
入力:00:00:00
出力:00:00:01
入力:23:59:59
出力:00:00:00
190デフォルトの名無しさん
2024/01/16(火) 20:31:44.73ID:76+p6SY+ >>187 octave
https://ideone.com/CEGEj8
f = @(s) datestr(addtodate(datenum(s), 1, 'second'), 'HH:MM:SS');
in = ['00:00:00';'23:59:59'], out = f(in)
https://ideone.com/CEGEj8
f = @(s) datestr(addtodate(datenum(s), 1, 'second'), 'HH:MM:SS');
in = ['00:00:00';'23:59:59'], out = f(in)
191デフォルトの名無しさん
2024/01/16(火) 20:54:27.73ID:OiJoE8pV >>187 PowerShell
"00:00:00", "23:59:59" |% {[String]([DateTime]$_).AddSeconds(1).TimeOfDay}
"00:00:00", "23:59:59" |% {[String]([DateTime]$_).AddSeconds(1).TimeOfDay}
192デフォルトの名無しさん
2024/01/16(火) 21:26:50.38ID:76+p6SY+ >>187 ruby
https://ideone.com/y2wgxo
require 'time'
f = -> s {(Time.parse(s) + 1).strftime('%T')}
p ['00:00:00', '23:59:59'].map {|s| [s, f.(s)]}
https://ideone.com/y2wgxo
require 'time'
f = -> s {(Time.parse(s) + 1).strftime('%T')}
p ['00:00:00', '23:59:59'].map {|s| [s, f.(s)]}
193デフォルトの名無しさん
2024/01/16(火) 23:32:13.09ID:+Emu7d1R >>187 js
const decode = (s) => s.split(":").map(Number);
const encode = (nums) => nums.map((v) => String(v).padStart(2, "0")).join(":");
const inct = (s, sec = 1) => {
const a = decode(s);
const ss = [
{ n: a[0], max: 24 },
{ n: a[1], max: 60 },
{ n: a[2], max: 60 },
];
let up = sec;
const b = ss
.reverse()
.map(({ n, max }) => {
n += up;
up = Math.floor(n / max);
return n % max;
})
.reverse();
return encode(b);
};
console.log(inct("00:00:00"));// 00:00:01
console.log(inct("23:59:59"));// 00:00:00
console.log(inct("00:00:00", 100));// 00:01:40
const decode = (s) => s.split(":").map(Number);
const encode = (nums) => nums.map((v) => String(v).padStart(2, "0")).join(":");
const inct = (s, sec = 1) => {
const a = decode(s);
const ss = [
{ n: a[0], max: 24 },
{ n: a[1], max: 60 },
{ n: a[2], max: 60 },
];
let up = sec;
const b = ss
.reverse()
.map(({ n, max }) => {
n += up;
up = Math.floor(n / max);
return n % max;
})
.reverse();
return encode(b);
};
console.log(inct("00:00:00"));// 00:00:01
console.log(inct("23:59:59"));// 00:00:00
console.log(inct("00:00:00", 100));// 00:01:40
194デフォルトの名無しさん
2024/01/17(水) 00:04:27.61ID:g7dwo5vO >>187 ocaml
https://ideone.com/aEsvl6
let sec_of_hms hms =
let at i = int_of_string (String.sub hms i 2) in at 0 * 60 * 60 + at 3 * 60 + at 6
let hms_of_sec sec =
Printf.sprintf "%02d:%02d:%02d" (sec mod 86400 / 3600) (sec mod 3600 / 60) (sec mod 60)
let (<<) f g x = f (g x)
let f = hms_of_sec << (+) 1 << sec_of_hms
https://ideone.com/aEsvl6
let sec_of_hms hms =
let at i = int_of_string (String.sub hms i 2) in at 0 * 60 * 60 + at 3 * 60 + at 6
let hms_of_sec sec =
Printf.sprintf "%02d:%02d:%02d" (sec mod 86400 / 3600) (sec mod 3600 / 60) (sec mod 60)
let (<<) f g x = f (g x)
let f = hms_of_sec << (+) 1 << sec_of_hms
195デフォルトの名無しさん
2024/01/17(水) 01:45:50.10ID:xvgJymQe >>187
Rust (date/timeライブラリ不使用版)
fn next_time(cur: &str) -> String {
let [sec, min, hour] = cur
.rsplitn(3, ':')
.map(|s| s.parse().unwrap())
.zip([60, 60, 24])
.scan(1, |carry, (mut value, limit)| {
value += *carry;
(*carry, value) = if value == limit { (1, 0) } else { (0, value) };
Some(value)
})
.collect::<ArrayVec<_, 3>>()[..] else { unreachable!() };
format!("{hour:02}:{min:02}:{sec:02}")
}
fn main() {
assert_eq!(next_time("00:00:00"), "00:00:01");
assert_eq!(next_time("23:59:59"), "00:00:00");
}
Rust (date/timeライブラリ不使用版)
fn next_time(cur: &str) -> String {
let [sec, min, hour] = cur
.rsplitn(3, ':')
.map(|s| s.parse().unwrap())
.zip([60, 60, 24])
.scan(1, |carry, (mut value, limit)| {
value += *carry;
(*carry, value) = if value == limit { (1, 0) } else { (0, value) };
Some(value)
})
.collect::<ArrayVec<_, 3>>()[..] else { unreachable!() };
format!("{hour:02}:{min:02}:{sec:02}")
}
fn main() {
assert_eq!(next_time("00:00:00"), "00:00:01");
assert_eq!(next_time("23:59:59"), "00:00:00");
}
19617
2024/01/18(木) 03:01:51.54ID:opxINJAy19717
2024/01/19(金) 19:43:44.34ID:hxZRcaHh >>187
Kotlin
今度は Java のライブラリは使わずに時分秒を保持するクラスを自分で作ってそこで秒に足すとか文字列にするとかやるようにした。
https://paiza.io/projects/7YcPDBTxVFt9EVczvBJ8gQ
Kotlin
今度は Java のライブラリは使わずに時分秒を保持するクラスを自分で作ってそこで秒に足すとか文字列にするとかやるようにした。
https://paiza.io/projects/7YcPDBTxVFt9EVczvBJ8gQ
198デフォルトの名無しさん
2024/01/20(土) 23:08:19.98ID:PCaU0wMN >>187 dart 2.3.0
https://ideone.com/khq9gr
void main() {
var sec_of_hms = (hms) => hms.split(':').fold(0, (acc, s) => acc * 60 + int.parse(s));
var hms_of_sec = (sec) => [sec % 86400 ~/ 3600, sec % 3600 ~/ 60, sec % 60].map((x) => x.toString().padLeft(2, '0')).join(':');
var f = (hms) => hms_of_sec(sec_of_hms(hms) + 1);
print(f('00:00:00'));
print(f('23:59:59'));
}
https://ideone.com/khq9gr
void main() {
var sec_of_hms = (hms) => hms.split(':').fold(0, (acc, s) => acc * 60 + int.parse(s));
var hms_of_sec = (sec) => [sec % 86400 ~/ 3600, sec % 3600 ~/ 60, sec % 60].map((x) => x.toString().padLeft(2, '0')).join(':');
var f = (hms) => hms_of_sec(sec_of_hms(hms) + 1);
print(f('00:00:00'));
print(f('23:59:59'));
}
199デフォルトの名無しさん
2024/01/21(日) 17:06:46.39ID:BpmEGVkv200デフォルトの名無しさん
2024/01/21(日) 21:15:52.66ID:BWkvMixc >>187 c
https://ideone.com/wRIYl2
int hmstosec(const char *hms) {
int h, m, s;
return sscanf(hms, "%d:%d:%d", &h, &m, &s) == 3 ? h * 3600 + m * 60 + s : 0;
}
char *sectohms(char *buff, int sec) {
sprintf(buff, "%02d:%02d:%02d", sec % 86400 / 3600, sec % 3600 / 60, sec % 60);
return buff;
}
char *f(char *buff, const char *hms) {
return sectohms(buff, hmstosec(hms) + 1);
}
>>187 c
https://ideone.com/3gj90n
int hmstosec(const char *hms) {
#define _(i) ((hms[i] - '0') * 10 + (hms[i + 1] - '0'))
return _(0) * 3600 + _(3) * 60 + _(6);
#undef _
}
char *sectohms(char *buff, int sec) {
#define _(i, value) buff[i] = '0' + (value) / 10, buff[i + 1] = '0' + (value) % 10
return _(0, sec % 86400 / 3600), buff[2] = ':', _(3, sec % 3600 / 60), buff[5] = ':', _(6, sec % 60), buff[8] = '\0', buff;
#undef _
}
char *f(char *buff, const char *hms) {
return sectohms(buff, hmstosec(hms) + 1);
}
https://ideone.com/wRIYl2
int hmstosec(const char *hms) {
int h, m, s;
return sscanf(hms, "%d:%d:%d", &h, &m, &s) == 3 ? h * 3600 + m * 60 + s : 0;
}
char *sectohms(char *buff, int sec) {
sprintf(buff, "%02d:%02d:%02d", sec % 86400 / 3600, sec % 3600 / 60, sec % 60);
return buff;
}
char *f(char *buff, const char *hms) {
return sectohms(buff, hmstosec(hms) + 1);
}
>>187 c
https://ideone.com/3gj90n
int hmstosec(const char *hms) {
#define _(i) ((hms[i] - '0') * 10 + (hms[i + 1] - '0'))
return _(0) * 3600 + _(3) * 60 + _(6);
#undef _
}
char *sectohms(char *buff, int sec) {
#define _(i, value) buff[i] = '0' + (value) / 10, buff[i + 1] = '0' + (value) % 10
return _(0, sec % 86400 / 3600), buff[2] = ':', _(3, sec % 3600 / 60), buff[5] = ':', _(6, sec % 60), buff[8] = '\0', buff;
#undef _
}
char *f(char *buff, const char *hms) {
return sectohms(buff, hmstosec(hms) + 1);
}
201デフォルトの名無しさん
2024/01/22(月) 15:47:46.18ID:PT6/fzaV202デフォルトの名無しさん
2024/01/23(火) 20:39:51.43ID:8rvcqFQo >>187 gawk
https://ideone.com/zBy22y
BEGIN {FS=":"}
{print strftime("%T", mktime(sprintf("2024 01 23 %s %s %s", $1, $2, $3)) + 1);}
>>187 sqlite
https://ideone.com/fjEdMz
select time('00:00:00', '+1 second');
select time('23:59:59', '+1 second');
>>187 bash
https://ideone.com/pYf8vL
while read hms; do
date '+%T' --date="+1 seconds $hms"
done
https://ideone.com/zBy22y
BEGIN {FS=":"}
{print strftime("%T", mktime(sprintf("2024 01 23 %s %s %s", $1, $2, $3)) + 1);}
>>187 sqlite
https://ideone.com/fjEdMz
select time('00:00:00', '+1 second');
select time('23:59:59', '+1 second');
>>187 bash
https://ideone.com/pYf8vL
while read hms; do
date '+%T' --date="+1 seconds $hms"
done
203デフォルトの名無しさん
2024/01/23(火) 22:56:23.02ID:8rvcqFQo >>187 pascal
https://ideone.com/sprmCC
program ideone;
Uses sysutils, dateutils;
function f(hms : string) : string;
begin
f := TimeToStr(IncSecond(StrToTime(hms), 1))
end;
begin
writeln(f('00:00:00'));
writeln(f('23:59:59'));
end.
https://ideone.com/sprmCC
program ideone;
Uses sysutils, dateutils;
function f(hms : string) : string;
begin
f := TimeToStr(IncSecond(StrToTime(hms), 1))
end;
begin
writeln(f('00:00:00'));
writeln(f('23:59:59'));
end.
204デフォルトの名無しさん
2024/01/23(火) 23:54:34.15ID:39Fs96AV >>187を時間ライブラリ無しで作成できている言語は現時点で
193のJavaScript
194のOCaml
195のRust
197のKotlin
198のDart
199のC++
200のC
201のLisp
以上
193のJavaScript
194のOCaml
195のRust
197のKotlin
198のDart
199のC++
200のC
201のLisp
以上
20517
2024/01/24(水) 00:08:17.22ID:n4ooUyFj >>187
Perl
bashのコマンドラインから長い長いワンライナーで。
$ perl -ne 'if(/(\d+):(\d+):(\d+)/){$h=$1;$m=$2;$s=$3;printf"入力:%02d:%02d:%02d\n",$h,$m,$s;$s++;if($s>=60){$m++;$s=0;if($m>=60){$h++;$m=0;if($h>=24){$h=0}}}printf"出力:%02d:%02d:%02d\n",$h,$m,$s}'
1:2:3
入力:01:02:03
出力:01:02:04
0:0:0
入力:00:00:00
出力:00:00:01
23:59:59
入力:23:59:59
出力:00:00:00
$
Perl
bashのコマンドラインから長い長いワンライナーで。
$ perl -ne 'if(/(\d+):(\d+):(\d+)/){$h=$1;$m=$2;$s=$3;printf"入力:%02d:%02d:%02d\n",$h,$m,$s;$s++;if($s>=60){$m++;$s=0;if($m>=60){$h++;$m=0;if($h>=24){$h=0}}}printf"出力:%02d:%02d:%02d\n",$h,$m,$s}'
1:2:3
入力:01:02:03
出力:01:02:04
0:0:0
入力:00:00:00
出力:00:00:01
23:59:59
入力:23:59:59
出力:00:00:00
$
206デフォルトの名無しさん
2024/02/02(金) 06:41:15.23ID:CC6U77IS お題
入力データをグループ分けして出力せよ
入力データの、= の左右は同じグループである。
出力する順番は、入力データの出現順とする
UnionFind を使えば良いかも
入力データ
["a1=a2", "b1=b2", "b3=b2", "c1=c2", "e1=e2",
"a3=a4", "c3=c4", "e1=e3", "a2=a4", "c3=c1",
"b3=a4", "c2=d1", "a4=a5", "d2=c1", "b4=b3", "d3=c3"]
出力
[["a1", "a2", "b1", "b2", "b3", "a3", "a4", "a5", "b4"],
["c1", "c2", "c3", "c4", "d1", "d2", "d3"],
["e1", "e2", "e3"]]
Ruby で、UnionFind を自作してみた。
下はユニットテストです
https://paiza.io/projects/e6nk1EOu3utyWpV3iuWAFQ?language=ruby
https://paiza.io/projects/kjeVtTKeDwEnWVrBU5_nbg?language=ruby
入力データをグループ分けして出力せよ
入力データの、= の左右は同じグループである。
出力する順番は、入力データの出現順とする
UnionFind を使えば良いかも
入力データ
["a1=a2", "b1=b2", "b3=b2", "c1=c2", "e1=e2",
"a3=a4", "c3=c4", "e1=e3", "a2=a4", "c3=c1",
"b3=a4", "c2=d1", "a4=a5", "d2=c1", "b4=b3", "d3=c3"]
出力
[["a1", "a2", "b1", "b2", "b3", "a3", "a4", "a5", "b4"],
["c1", "c2", "c3", "c4", "d1", "d2", "d3"],
["e1", "e2", "e3"]]
Ruby で、UnionFind を自作してみた。
下はユニットテストです
https://paiza.io/projects/e6nk1EOu3utyWpV3iuWAFQ?language=ruby
https://paiza.io/projects/kjeVtTKeDwEnWVrBU5_nbg?language=ruby
207デフォルトの名無しさん
2024/02/02(金) 10:50:23.49ID:fEMhv+T7 >>206
Rust
fn foo<'a, 'b>(input: &'b [&'a str]) -> Vec<Vec<&'a str>> {
struct Data<'a> { name: &'a str, rep: usize, coll: Option<Vec<usize>>, }
let mut data = Vec::<Data>::new();
let mut map = HashMap::<&str, usize>::new();
for s in input {
let (index0, index1) = s.splitn(2, '=')
.map(|s| match map.get(s) {
Some(&index) => data[index].rep,
None => {
let index = data.len();
map.insert(s, index);
data.push(Data { name: s, rep: index, coll: Some(vec![index]), });
index
},
})
.sorted().tuple_windows().next().unwrap();
if index0 != index1 {
let coll0 = data[index0].coll.take().unwrap();
let coll1 = data[index1].coll.take().unwrap();
coll1.iter().for_each(|&index| data[index].rep = index0);
data[index0].coll = Some(itertools::merge(coll0, coll1).collect());
}
}
data.iter().map(|data| &data.coll).flatten()
.map(|coll| coll.iter().map(|&index| data[index].name).collect()).collect()
}
Rust
fn foo<'a, 'b>(input: &'b [&'a str]) -> Vec<Vec<&'a str>> {
struct Data<'a> { name: &'a str, rep: usize, coll: Option<Vec<usize>>, }
let mut data = Vec::<Data>::new();
let mut map = HashMap::<&str, usize>::new();
for s in input {
let (index0, index1) = s.splitn(2, '=')
.map(|s| match map.get(s) {
Some(&index) => data[index].rep,
None => {
let index = data.len();
map.insert(s, index);
data.push(Data { name: s, rep: index, coll: Some(vec![index]), });
index
},
})
.sorted().tuple_windows().next().unwrap();
if index0 != index1 {
let coll0 = data[index0].coll.take().unwrap();
let coll1 = data[index1].coll.take().unwrap();
coll1.iter().for_each(|&index| data[index].rep = index0);
data[index0].coll = Some(itertools::merge(coll0, coll1).collect());
}
}
data.iter().map(|data| &data.coll).flatten()
.map(|coll| coll.iter().map(|&index| data[index].name).collect()).collect()
}
208デフォルトの名無しさん
2024/02/02(金) 10:53:02.58ID:fEMhv+T7 >>207の動作確認用追加分
use std::collections::HashMap;
use itertools::Itertools;
fn main() {
let input = [
"a1=a2", "b1=b2", "b3=b2", "c1=c2", "e1=e2",
"a3=a4", "c3=c4", "e1=e3", "a2=a4", "c3=c1",
"b3=a4", "c2=d1", "a4=a5", "d2=c1", "b4=b3", "d3=c3"
];
let output = [
vec!["a1", "a2", "b1", "b2", "b3", "a3", "a4", "a5", "b4"],
vec!["c1", "c2", "c3", "c4", "d1", "d2", "d3"],
vec!["e1", "e2", "e3"]
];
assert_eq!(foo(&input), output);
}
use std::collections::HashMap;
use itertools::Itertools;
fn main() {
let input = [
"a1=a2", "b1=b2", "b3=b2", "c1=c2", "e1=e2",
"a3=a4", "c3=c4", "e1=e3", "a2=a4", "c3=c1",
"b3=a4", "c2=d1", "a4=a5", "d2=c1", "b4=b3", "d3=c3"
];
let output = [
vec!["a1", "a2", "b1", "b2", "b3", "a3", "a4", "a5", "b4"],
vec!["c1", "c2", "c3", "c4", "d1", "d2", "d3"],
vec!["e1", "e2", "e3"]
];
assert_eq!(foo(&input), output);
}
209デフォルトの名無しさん
2024/02/02(金) 22:48:33.27ID:UezRkqGy >>206 ruby
https://ideone.com/eF5lww
f = -> a {
w = a.map {|s| s.split('=')}.flatten.uniq.map.with_index.to_h
a.each_with_object([]) {|s, acc|
x, xa, y, ya = s.split('=').map {|k| [k, acc.find {|b| b.include? k}]}.flatten(1)
if xa && ya then xa.concat (acc.delete ya) << x << y
elsif xa then xa << x << y
elsif ya then ya << x << y
else acc << [x, y]
end
}.map {|a| a.uniq.sort_by {|s| w[s]}}.sort_by {|a| w[a[0]]}
}
https://ideone.com/eF5lww
f = -> a {
w = a.map {|s| s.split('=')}.flatten.uniq.map.with_index.to_h
a.each_with_object([]) {|s, acc|
x, xa, y, ya = s.split('=').map {|k| [k, acc.find {|b| b.include? k}]}.flatten(1)
if xa && ya then xa.concat (acc.delete ya) << x << y
elsif xa then xa << x << y
elsif ya then ya << x << y
else acc << [x, y]
end
}.map {|a| a.uniq.sort_by {|s| w[s]}}.sort_by {|a| w[a[0]]}
}
210デフォルトの名無しさん
2024/02/02(金) 22:51:42.74ID:UezRkqGy >>206 rust
https://ideone.com/MEZMPO
fn f<'a>(a: &[&'a str]) -> Vec<Vec<&'a str>> { // '
let h = a.iter().map(|&s| s.split('=')).flatten().rev().enumerate().map(|(p, s)| (s, p)).collect::<HashMap<_, _>>();
let mut acc = Vec::<Vec<&str>>::new();
for xy in a.iter().map(|s| s.split('=').collect::<Vec<_>>()) {
match (acc.iter().position(|b| b.contains(&xy[0])), acc.iter().position(|b| b.contains(&xy[1]))) {
(Some(xi), Some(yi)) => {
let ys = acc[yi].clone();
acc[xi].extend(ys);
acc[xi].extend(xy);
acc.remove(yi);
},
(Some(xi), None) => acc[xi].extend(xy),
(None, Some(yi)) => acc[yi].extend(xy),
_ => acc.push(xy),
}
}
for b in acc.iter_mut() {
b.sort_by(|c, d| h.get(d).cmp(&h.get(c)));
b.dedup();
}
acc.sort_by(|c, d| h.get(d[0]).cmp(&h.get(c[0])));
acc
}
https://ideone.com/MEZMPO
fn f<'a>(a: &[&'a str]) -> Vec<Vec<&'a str>> { // '
let h = a.iter().map(|&s| s.split('=')).flatten().rev().enumerate().map(|(p, s)| (s, p)).collect::<HashMap<_, _>>();
let mut acc = Vec::<Vec<&str>>::new();
for xy in a.iter().map(|s| s.split('=').collect::<Vec<_>>()) {
match (acc.iter().position(|b| b.contains(&xy[0])), acc.iter().position(|b| b.contains(&xy[1]))) {
(Some(xi), Some(yi)) => {
let ys = acc[yi].clone();
acc[xi].extend(ys);
acc[xi].extend(xy);
acc.remove(yi);
},
(Some(xi), None) => acc[xi].extend(xy),
(None, Some(yi)) => acc[yi].extend(xy),
_ => acc.push(xy),
}
}
for b in acc.iter_mut() {
b.sort_by(|c, d| h.get(d).cmp(&h.get(c)));
b.dedup();
}
acc.sort_by(|c, d| h.get(d[0]).cmp(&h.get(c[0])));
acc
}
211デフォルトの名無しさん
2024/02/02(金) 23:24:19.60ID:UezRkqGy >>206 ruby
https://ideone.com/daI0QL
・若干の修正
f = -> a {
w = a.map {|s| s.split('=')}.flatten.uniq.map.with_index.to_h
a.each_with_object([]) {|s, acc|
x, xa, y, ya = s.split('=').map {|k| [k, acc.find {|b| b.include? k}]}.flatten(1)
if xa && ya then xa.concat (acc.delete ya)
elsif xa then xa << y
elsif ya then ya << x
else acc << [x, y]
end
}.map {|a| a.sort_by {|s| w[s]}}.sort_by {|a| w[a[0]]}
}
https://ideone.com/daI0QL
・若干の修正
f = -> a {
w = a.map {|s| s.split('=')}.flatten.uniq.map.with_index.to_h
a.each_with_object([]) {|s, acc|
x, xa, y, ya = s.split('=').map {|k| [k, acc.find {|b| b.include? k}]}.flatten(1)
if xa && ya then xa.concat (acc.delete ya)
elsif xa then xa << y
elsif ya then ya << x
else acc << [x, y]
end
}.map {|a| a.sort_by {|s| w[s]}}.sort_by {|a| w[a[0]]}
}
212デフォルトの名無しさん
2024/02/02(金) 23:24:45.86ID:UezRkqGy >>206 rust
https://ideone.com/dO4xea
・若干の修正
fn f<'a>(a: &[&'a str]) -> Vec<Vec<&'a str>> { // '
let h = a.iter().map(|&s| s.split('=')).flatten().rev().enumerate().map(|(p, s)| (s, p)).collect::<HashMap<_, _>>();
let mut acc = Vec::<Vec<&str>>::new();
for xy in a.iter().map(|s| s.split('=').collect::<Vec<_>>()) {
match (acc.iter().position(|b| b.contains(&xy[0])), acc.iter().position(|b| b.contains(&xy[1]))) {
(Some(xi), Some(yi)) => {
let ys = acc[yi].clone();
acc[xi].extend(ys);
acc.remove(yi);
},
(Some(xi), None) => acc[xi].push(xy[1]),
(None, Some(yi)) => acc[yi].push(xy[0]),
_ => acc.push(xy),
}
}
acc.iter_mut().for_each(|b| b.sort_by(|c, d| h.get(d).cmp(&h.get(c))));
acc.sort_by(|c, d| h.get(d[0]).cmp(&h.get(c[0])));
acc
}
https://ideone.com/dO4xea
・若干の修正
fn f<'a>(a: &[&'a str]) -> Vec<Vec<&'a str>> { // '
let h = a.iter().map(|&s| s.split('=')).flatten().rev().enumerate().map(|(p, s)| (s, p)).collect::<HashMap<_, _>>();
let mut acc = Vec::<Vec<&str>>::new();
for xy in a.iter().map(|s| s.split('=').collect::<Vec<_>>()) {
match (acc.iter().position(|b| b.contains(&xy[0])), acc.iter().position(|b| b.contains(&xy[1]))) {
(Some(xi), Some(yi)) => {
let ys = acc[yi].clone();
acc[xi].extend(ys);
acc.remove(yi);
},
(Some(xi), None) => acc[xi].push(xy[1]),
(None, Some(yi)) => acc[yi].push(xy[0]),
_ => acc.push(xy),
}
}
acc.iter_mut().for_each(|b| b.sort_by(|c, d| h.get(d).cmp(&h.get(c))));
acc.sort_by(|c, d| h.get(d[0]).cmp(&h.get(c[0])));
acc
}
213デフォルトの名無しさん
2024/02/02(金) 23:58:11.98ID:Uk0I9chw214デフォルトの名無しさん
2024/02/03(土) 02:58:35.44ID:bEsWZIv5215デフォルトの名無しさん
2024/02/03(土) 10:26:51.46ID:kmOXhk/V2169
2024/02/04(日) 16:39:59.23ID:jTY6zdRX >>208 Perl5
use feature qw{:5.16 signatures};
no warnings qw(experimental::signatures);
@s = qw[a1=a2 b1=b2 b3=b2 c1=c2 e1=e2 a3=a4 c3=c4 e1=e3 a2=a4 c3=c1 b3=a4 c2=d1 a4=a5 d2=c1 b4=b3 d3=c3];
for (map{[sort /(\w+)=(\w+)/]} @s) {
($l, $r) = @$_;
$g{$r} //= $g{$l} //= $g{$r} // $l;
$h{$g{$r}} = $g{$l} if $g{$l} ne $g{$r};
}
$h{$k} = sub($e){$h{$e} ? __SUB__->($h{$e}) : $e}->($v) while ($k, $v) = each %h;
$g{$_} = $h{$g{$_}} // $g{$_} for keys %g;
push @{$r{$v}}, $k while ($k, $v) = each %g;
say "@$_" for values %r;
※見易くするためインデントを全角スペースに置換してあります
実行結果
$ perl 22_206_grouping.pl
b3 a3 a5 b4 a4 a1 b1 a2 b2
c1 d1 d3 c3 c2 d2 c4
e3 e1 e2
use feature qw{:5.16 signatures};
no warnings qw(experimental::signatures);
@s = qw[a1=a2 b1=b2 b3=b2 c1=c2 e1=e2 a3=a4 c3=c4 e1=e3 a2=a4 c3=c1 b3=a4 c2=d1 a4=a5 d2=c1 b4=b3 d3=c3];
for (map{[sort /(\w+)=(\w+)/]} @s) {
($l, $r) = @$_;
$g{$r} //= $g{$l} //= $g{$r} // $l;
$h{$g{$r}} = $g{$l} if $g{$l} ne $g{$r};
}
$h{$k} = sub($e){$h{$e} ? __SUB__->($h{$e}) : $e}->($v) while ($k, $v) = each %h;
$g{$_} = $h{$g{$_}} // $g{$_} for keys %g;
push @{$r{$v}}, $k while ($k, $v) = each %g;
say "@$_" for values %r;
※見易くするためインデントを全角スペースに置換してあります
実行結果
$ perl 22_206_grouping.pl
b3 a3 a5 b4 a4 a1 b1 a2 b2
c1 d1 d3 c3 c2 d2 c4
e3 e1 e2
218デフォルトの名無しさん
2024/02/04(日) 18:32:39.04ID:fS5H2fbQ >>206
>>215をPowerShellに移植
$in =
"a1=a2", "b1=b2", "b3=b2", "c1=c2", "e1=e2", "a3=a4", "c3=c4", "e1=e3",
"a2=a4", "c3=c1", "b3=a4", "c2=d1", "a4=a5", "d2=c1", "b4=b3", "d3=c3"
$in -split "=" |% {$h = @{}; $n = 0} {if (!$h[$_]) {$h[$_] = $n++}}
$eq = $in |% {, $h[$_ -split "="]}
$g = 1..$n
do {
$changed = $false
$eq |% {
$i, $j = $_
switch ($g[$i] - $g[$j]) {
{$_ -gt 0} {$g[$i] = $g[$j]; $changed = $true}
{$_ -lt 0} {$g[$j] = $g[$i]; $changed = $true}
}
}
} while ($changed)
$h.keys | sort {$h[$_]} | group {$g[$h[$_]]} |% {"[$($_.group -join ", ")]"}
-- 実行結果 --
[a1, a2, b1, b2, b3, a3, a4, a5, b4]
[c1, c2, c3, c4, d1, d2, d3]
[e1, e2, e3]
>>215をPowerShellに移植
$in =
"a1=a2", "b1=b2", "b3=b2", "c1=c2", "e1=e2", "a3=a4", "c3=c4", "e1=e3",
"a2=a4", "c3=c1", "b3=a4", "c2=d1", "a4=a5", "d2=c1", "b4=b3", "d3=c3"
$in -split "=" |% {$h = @{}; $n = 0} {if (!$h[$_]) {$h[$_] = $n++}}
$eq = $in |% {, $h[$_ -split "="]}
$g = 1..$n
do {
$changed = $false
$eq |% {
$i, $j = $_
switch ($g[$i] - $g[$j]) {
{$_ -gt 0} {$g[$i] = $g[$j]; $changed = $true}
{$_ -lt 0} {$g[$j] = $g[$i]; $changed = $true}
}
}
} while ($changed)
$h.keys | sort {$h[$_]} | group {$g[$h[$_]]} |% {"[$($_.group -join ", ")]"}
-- 実行結果 --
[a1, a2, b1, b2, b3, a3, a4, a5, b4]
[c1, c2, c3, c4, d1, d2, d3]
[e1, e2, e3]
219デフォルトの名無しさん
2024/02/04(日) 19:02:37.59ID:fS5H2fbQ >>218の5行目の if (!$h[$_]) を if ($h[$_] -eq $null) に訂正
220デフォルトの名無しさん
2024/02/04(日) 19:43:39.57ID:NiYs7EK6221211
2024/02/04(日) 23:55:45.21ID:ytAuzkvH22217
2024/02/05(月) 02:54:15.12ID:8tY/Vubv >>206
Kotlin
入力データを標準入力から入力したり、クラス作ってその中でまとめる等、色々やって長くなった。
https://paiza.io/projects/zdysD5ygRDFVbY2gAGCwOw
Kotlin
入力データを標準入力から入力したり、クラス作ってその中でまとめる等、色々やって長くなった。
https://paiza.io/projects/zdysD5ygRDFVbY2gAGCwOw
223221
2024/02/05(月) 20:08:21.07ID:tt/WRhkt >>206 ruby
https://ideone.com/j2xPyB
・>>221から若干のアレンジ
・SortedSet単位でのみいじるようにした
f = -> a {
g = -> a {a.combination(2) {|x, y| break g.(a.tap {x.merge y; a.delete y}) if x.intersect? y}}
h = a.map {|s| s.split('=')}.flatten.uniq.map.with_index.to_h
a = a.map {|s| s.split('=').map {|k| h[k]}.to_set SortedSet}
g.(a).map {|set| set.map &h.invert.method(:[])}
}
https://ideone.com/j2xPyB
・>>221から若干のアレンジ
・SortedSet単位でのみいじるようにした
f = -> a {
g = -> a {a.combination(2) {|x, y| break g.(a.tap {x.merge y; a.delete y}) if x.intersect? y}}
h = a.map {|s| s.split('=')}.flatten.uniq.map.with_index.to_h
a = a.map {|s| s.split('=').map {|k| h[k]}.to_set SortedSet}
g.(a).map {|set| set.map &h.invert.method(:[])}
}
224デフォルトの名無しさん
2024/02/05(月) 23:26:45.85ID:YjqgZClx225223
2024/02/05(月) 23:51:15.55ID:tt/WRhkt >>206 rust
https://ideone.com/Ma1WGV
・>>223の移植
・色々迷いアリ
.map(|k| *h.get(k).unwrap())のところは当初
.map(|k| h.get(k).map(|&i| i)).flatten()などとしていたが
正解がわからないので迷った挙げ句に短く書けるほうを採用
・これに限らずrustは不慣れなので色々珍妙なことをしている可能性アリ
https://ideone.com/Ma1WGV
・>>223の移植
・色々迷いアリ
.map(|k| *h.get(k).unwrap())のところは当初
.map(|k| h.get(k).map(|&i| i)).flatten()などとしていたが
正解がわからないので迷った挙げ句に短く書けるほうを採用
・これに限らずrustは不慣れなので色々珍妙なことをしている可能性アリ
226225
2024/02/06(火) 22:07:13.88ID:6T/Xuns0 >>206 rust
https://ideone.com/m5INyJ
・>>225から若干の修正
・不必要なループ回数を訂正
・二重forを一重に(でもかえって煩雑に)
・まだまだ迷いアリ
.map(|k| *h.get(k).unwrap())は結局
.flat_map(|k| h.get(k)).cloned()に置き換え
こっちのほうが個人的にはスッキリ感アリ
>>206 rust
https://ideone.com/hT5zGF
・上記のmutナシ版
・パフォーマンス的な観点もナシ
https://ideone.com/m5INyJ
・>>225から若干の修正
・不必要なループ回数を訂正
・二重forを一重に(でもかえって煩雑に)
・まだまだ迷いアリ
.map(|k| *h.get(k).unwrap())は結局
.flat_map(|k| h.get(k)).cloned()に置き換え
こっちのほうが個人的にはスッキリ感アリ
>>206 rust
https://ideone.com/hT5zGF
・上記のmutナシ版
・パフォーマンス的な観点もナシ
227デフォルトの名無しさん
2024/02/06(火) 22:17:05.66ID:ICpsP2hv228デフォルトの名無しさん
2024/02/09(金) 20:11:03.28ID:xlZlW34G229226
2024/02/09(金) 22:33:42.16ID:JDB9tF7l >>226
すべてruby移植版rust
DでもE見た目派生まとめ
mutあり版
https://ideone.com/m5INyJ // for if return
https://ideone.com/R8wcOJ // match find
https://ideone.com/ifI5EX // if let find
mutなし版
https://ideone.com/hT5zGF // for if return
https://ideone.com/1PNKbR // match find
https://ideone.com/btKWb1 // if let find
集合同士の組み合わせに重なりが一個もなかったときに
最後に返す a がポツーンと片隅に居るのが落ち着かなかったので
match/if letで書き直してみたがそれはそれで難があり?
条件部分が奥に入ってしまったのがなんかイヤだったり?
一行目が長くなりすぎる、という理由で二行に分けたり?
やっぱ元のfor if returnのリズムのほうが眼球に入りやすい?
すべてruby移植版rust
DでもE見た目派生まとめ
mutあり版
https://ideone.com/m5INyJ // for if return
https://ideone.com/R8wcOJ // match find
https://ideone.com/ifI5EX // if let find
mutなし版
https://ideone.com/hT5zGF // for if return
https://ideone.com/1PNKbR // match find
https://ideone.com/btKWb1 // if let find
集合同士の組み合わせに重なりが一個もなかったときに
最後に返す a がポツーンと片隅に居るのが落ち着かなかったので
match/if letで書き直してみたがそれはそれで難があり?
条件部分が奥に入ってしまったのがなんかイヤだったり?
一行目が長くなりすぎる、という理由で二行に分けたり?
やっぱ元のfor if returnのリズムのほうが眼球に入りやすい?
230デフォルトの名無しさん
2024/02/10(土) 22:10:46.31ID:HaBtyH/G231デフォルトの名無しさん
2024/02/11(日) 15:34:27.52ID:3wEOIMb0232デフォルトの名無しさん
2024/02/11(日) 20:38:42.50ID:v64KP9lJ >>206
>>230をDで書くと
https://ideone.com/9oenyq
になるが、switch case 0, 1, 2の場合も3の場合と同じ処理にすると、効率は落ちるもののかなり短くできる。
https://ideone.com/ILLUdy
>>230をDで書くと
https://ideone.com/9oenyq
になるが、switch case 0, 1, 2の場合も3の場合と同じ処理にすると、効率は落ちるもののかなり短くできる。
https://ideone.com/ILLUdy
233223
2024/02/12(月) 23:45:12.86ID:ix8w7wd+ >>206 octave
https://ideone.com/VtqJcV
・組み合わせつくって集合のペアごとに調べることをやめた
・集合間で重複する要素に着目して集合を減らすようにした
>>223
g.(a).map {|set| set.map &h.invert.method(:[])}じゃなくて単に
g.(a).map {|set| h.keys.values_at *set}で良かった
https://ideone.com/VtqJcV
・組み合わせつくって集合のペアごとに調べることをやめた
・集合間で重複する要素に着目して集合を減らすようにした
>>223
g.(a).map {|set| set.map &h.invert.method(:[])}じゃなくて単に
g.(a).map {|set| h.keys.values_at *set}で良かった
234デフォルトの名無しさん
2024/02/14(水) 09:32:06.19ID:JjlrBdlD お題:数値が入力されるのでその数値に最も近い回分数を出力せよ
回分数とは回分になっている数(負数含まず)のことである
最も近い回分数が2つある場合は2つとも出力せよ
入力 0
出力 0
入力 17
出力 22
入力 100
出力 99
出力 101
回分数とは回分になっている数(負数含まず)のことである
最も近い回分数が2つある場合は2つとも出力せよ
入力 0
出力 0
入力 17
出力 22
入力 100
出力 99
出力 101
235デフォルトの名無しさん
2024/02/14(水) 15:20:24.32ID:VoM/Kva2236デフォルトの名無しさん
2024/02/14(水) 21:10:48.99ID:/8p4lTpf237デフォルトの名無しさん
2024/02/14(水) 23:21:42.28ID:iTsk+dOj238デフォルトの名無しさん
2024/02/15(木) 21:30:35.17ID:MveN6p4/ >>234
Rust
fn foo(n: usize) -> (usize, Option<usize>) {
let n2b = |n: usize| { let mut o = Some(n); iter::from_fn(|| { let n = o.take()?; o = (n >= 10).then(|| n / 10); Some((n % 10) as i8) }).collect::<Vec<i8>>() };
let b2n = |b: &[i8]| b.iter().rev().fold(0_usize, |n, b| n * 10 + *b as usize);
let pal = |b: &mut [i8]| { let len = b.len() / 2; let (l, u) = b.split_at_mut(len); iter::zip(l, u.iter().rev()).for_each(|(l, u)| *l = *u); };
let inc = |b: &mut [i8]| { let len = b.len() / 2; let mut c = 1; b[len..].iter_mut().for_each(|b| { *b += c; if *b > 9 { *b = 0; c = 1; } else { c = 0; }}); };
let dec = |b: &mut [i8]| { let len = b.len() / 2; let mut c = 1; b[len..].iter_mut().for_each(|b| { *b -= c; if *b < 0 { *b = 9; c = 1; } else { c = 0; }}); };
let fix = |b: &mut [i8]| { if b.last() == Some(&0) { if b.len() & 1 == 0 { b[(b.len() - 1) / 2] = 9; } true } else { false } };
let mut b = n2b(n);
pal(&mut b);
let n1 = b2n(&b);
match n.cmp(&n1) {
Ordering::Equal => return (n, None),
Ordering::Greater => inc(&mut b),
Ordering::Less => dec(&mut b),
}
if fix(&mut b) { b.pop(); }
pal(&mut b);
let n2 = b2n(&b);
match n.abs_diff(n1).cmp(&n.abs_diff(n2)) {
Ordering::Less => (n1, None),
Ordering::Greater => (n2, None),
Ordering::Equal => (n1, Some(n2)),
}
}
Rust
fn foo(n: usize) -> (usize, Option<usize>) {
let n2b = |n: usize| { let mut o = Some(n); iter::from_fn(|| { let n = o.take()?; o = (n >= 10).then(|| n / 10); Some((n % 10) as i8) }).collect::<Vec<i8>>() };
let b2n = |b: &[i8]| b.iter().rev().fold(0_usize, |n, b| n * 10 + *b as usize);
let pal = |b: &mut [i8]| { let len = b.len() / 2; let (l, u) = b.split_at_mut(len); iter::zip(l, u.iter().rev()).for_each(|(l, u)| *l = *u); };
let inc = |b: &mut [i8]| { let len = b.len() / 2; let mut c = 1; b[len..].iter_mut().for_each(|b| { *b += c; if *b > 9 { *b = 0; c = 1; } else { c = 0; }}); };
let dec = |b: &mut [i8]| { let len = b.len() / 2; let mut c = 1; b[len..].iter_mut().for_each(|b| { *b -= c; if *b < 0 { *b = 9; c = 1; } else { c = 0; }}); };
let fix = |b: &mut [i8]| { if b.last() == Some(&0) { if b.len() & 1 == 0 { b[(b.len() - 1) / 2] = 9; } true } else { false } };
let mut b = n2b(n);
pal(&mut b);
let n1 = b2n(&b);
match n.cmp(&n1) {
Ordering::Equal => return (n, None),
Ordering::Greater => inc(&mut b),
Ordering::Less => dec(&mut b),
}
if fix(&mut b) { b.pop(); }
pal(&mut b);
let n2 = b2n(&b);
match n.abs_diff(n1).cmp(&n.abs_diff(n2)) {
Ordering::Less => (n1, None),
Ordering::Greater => (n2, None),
Ordering::Equal => (n1, Some(n2)),
}
}
239デフォルトの名無しさん
2024/02/15(木) 22:00:50.95ID:fu0tHwRa >>234
>>237は入力が1〜9のとき出力が正しくなかった。function内の1行目に if ($n -le 9) {return $n} を
挿入すると修正される。
Rでは添字の開始値は1で添字0では空のデータが返るので、入力が1〜9のときの場合分けは不要。
[]演算子と+演算子を文字列でも使えるように再定義した。
https://ideone.com/PP5swB
Dでは添字範囲指定は半開区間なので、入力が1〜9のときの場合分けは不要。
https://ideone.com/hvNBia
>>237は入力が1〜9のとき出力が正しくなかった。function内の1行目に if ($n -le 9) {return $n} を
挿入すると修正される。
Rでは添字の開始値は1で添字0では空のデータが返るので、入力が1〜9のときの場合分けは不要。
[]演算子と+演算子を文字列でも使えるように再定義した。
https://ideone.com/PP5swB
Dでは添字範囲指定は半開区間なので、入力が1〜9のときの場合分けは不要。
https://ideone.com/hvNBia
240デフォルトの名無しさん
2024/02/15(木) 23:18:01.58ID:IMdr4idU2419
2024/02/16(金) 02:56:10.41ID:7jtCAGu+ >>234 Perl5
for $n (0,17,100,123459321) {
my %a;
for (0..$n) {
$i = $n - $_;
$a{$i} = $i if 0 <= $i and $i =~ /^((\d)(?1)\2|\d?)$/;
$j = $n + $_;
$a{$j} = $j if $j =~ /^((\d)(?1)\2|\d?)$/;
last if keys %a;
}
@a = keys %a;
print "$n -> @a\n";
}
※見やすくするためインデントを全角スペースに置換してあります。
実行結果
$ perl 22_234_palindromic_number.pl
0 -> 0
17 -> 22
100 -> 99 101
123459321 -> 123464321 123454321
for $n (0,17,100,123459321) {
my %a;
for (0..$n) {
$i = $n - $_;
$a{$i} = $i if 0 <= $i and $i =~ /^((\d)(?1)\2|\d?)$/;
$j = $n + $_;
$a{$j} = $j if $j =~ /^((\d)(?1)\2|\d?)$/;
last if keys %a;
}
@a = keys %a;
print "$n -> @a\n";
}
※見やすくするためインデントを全角スペースに置換してあります。
実行結果
$ perl 22_234_palindromic_number.pl
0 -> 0
17 -> 22
100 -> 99 101
123459321 -> 123464321 123454321
2429
2024/02/16(金) 03:13:10.80ID:7jtCAGu+ >>241
last if keys %a;
}
@a = keys %a;
は
last if @a = keys %a;
}
とコンパクトに書けるんだった、まぁいいや
last if keys %a;
}
@a = keys %a;
は
last if @a = keys %a;
}
とコンパクトに書けるんだった、まぁいいや
2439
2024/02/16(金) 14:47:55.29ID:TIAwaOOw >>234 Perl5、小さい方の検索は0で止まるので負の値を避ける必要はなかった、書き直し。
$r = qr/^((\d)(?1)\2|\d?)$/;
for $n (0,17,100,123459321) {
my %a;
for (0..$n) {
$a{$n - $_} = 1 if ($n - $_) =~ $r;
$a{$n + $_} = 1 if ($n + $_) =~ $r;
last if @a = keys %a;
}
print "$n -> @a\n";
}
$r = qr/^((\d)(?1)\2|\d?)$/;
for $n (0,17,100,123459321) {
my %a;
for (0..$n) {
$a{$n - $_} = 1 if ($n - $_) =~ $r;
$a{$n + $_} = 1 if ($n + $_) =~ $r;
last if @a = keys %a;
}
print "$n -> @a\n";
}
244デフォルトの名無しさん
2024/02/16(金) 21:57:03.19ID:cLyPSkE524517
2024/02/16(金) 23:58:17.22ID:C4FuIAno >>234
Kotlin
何か画期的なアルゴリズムを使ったわけではなく、むしろほとんど何も考えずただ作られただけのプログラム。
https://paiza.io/projects/S5qsLnHz_pZD3um9jYRg_Q
Kotlin
何か画期的なアルゴリズムを使ったわけではなく、むしろほとんど何も考えずただ作られただけのプログラム。
https://paiza.io/projects/S5qsLnHz_pZD3um9jYRg_Q
2469
2024/02/17(土) 02:10:36.54ID:K8P5qDCx >>234 Python3
def f(k):
s = str(k)
return s == s[::-1]
for n in [0, 17, 100, 123459321]:
l = set()
for i in range(n + 1):
if f(n - i): l.add(n - i)
if f(n + i): l.add(n + i)
if l:
print(n, l)
break
※見易くするためインデントは全角空白に置換してあります
実行結果
$ python3 22_234_palindromic_number..py
0 {0}
17 {22}
100 {99, 101}
123459321 {123454321, 123464321}
def f(k):
s = str(k)
return s == s[::-1]
for n in [0, 17, 100, 123459321]:
l = set()
for i in range(n + 1):
if f(n - i): l.add(n - i)
if f(n + i): l.add(n + i)
if l:
print(n, l)
break
※見易くするためインデントは全角空白に置換してあります
実行結果
$ python3 22_234_palindromic_number..py
0 {0}
17 {22}
100 {99, 101}
123459321 {123454321, 123464321}
247デフォルトの名無しさん
2024/02/17(土) 18:14:20.87ID:nUY+CX2J248デフォルトの名無しさん
2024/02/17(土) 19:03:53.65ID:eWGoJOTY249デフォルトの名無しさん
2024/02/17(土) 20:00:17.98ID:k6cg1rdP250デフォルトの名無しさん
2024/02/17(土) 20:51:00.88ID:nUY+CX2J251デフォルトの名無しさん
2024/02/17(土) 21:45:58.19ID:nUY+CX2J252デフォルトの名無しさん
2024/02/18(日) 17:05:41.93ID:z028saCP253デフォルトの名無しさん
2024/02/18(日) 18:14:23.24ID:puttXdr1254デフォルトの名無しさん
2024/02/18(日) 18:14:51.62ID:puttXdr1255デフォルトの名無しさん
2024/02/18(日) 18:15:27.81ID:puttXdr1256デフォルトの名無しさん
2024/02/18(日) 18:16:03.57ID:puttXdr1257デフォルトの名無しさん
2024/02/18(日) 18:26:09.28ID:ovKjFpQ6 >>253-256 アスペで不合格w
258デフォルトの名無しさん
2024/02/18(日) 18:34:19.30ID:rWy6ZYAH >>234 ruby
https://ideone.com/N0w91j
f = -> n {
(0..n).lazy.map {|i| [n - i, n + i].select {|x| x.to_s.reverse.to_i == x}}.find(&:any?).uniq
}
>>252
(`・ω・´)ゞ
誤:a - 1, a + 1
正:a - 1, b + 1
https://ideone.com/N0w91j
f = -> n {
(0..n).lazy.map {|i| [n - i, n + i].select {|x| x.to_s.reverse.to_i == x}}.find(&:any?).uniq
}
>>252
(`・ω・´)ゞ
誤:a - 1, a + 1
正:a - 1, b + 1
259デフォルトの名無しさん
2024/02/18(日) 19:41:35.69ID:rWy6ZYAH >>234 dart
https://ideone.com/e23wRv
void main() {
var rev = (n) => int.parse(n.toString().split('').reversed.join());
var f = (n) => Iterable.generate(n + 1).map((i) => [n - i, n + i].where((x) => x == rev(x))).firstWhere((a) => a.isNotEmpty).toSet().toList();
print([0, 17, 100].map((n) => [n, f(n)]));
}
https://ideone.com/e23wRv
void main() {
var rev = (n) => int.parse(n.toString().split('').reversed.join());
var f = (n) => Iterable.generate(n + 1).map((i) => [n - i, n + i].where((x) => x == rev(x))).firstWhere((a) => a.isNotEmpty).toSet().toList();
print([0, 17, 100].map((n) => [n, f(n)]));
}
260デフォルトの名無しさん
2024/02/20(火) 08:46:37.56ID:8US2zplP26117
2024/02/20(火) 10:47:13.25ID:YmH8jdAc >>254
しらみ潰しって、どんなテストしたの?
しらみ潰しって、どんなテストしたの?
262デフォルトの名無しさん
2024/02/20(火) 12:59:46.62ID:qzcGLGiS しらみ潰しとは例えば1から順番に見つかるまで全てを試していく最悪な方法を指す
今回の場合だと与えた数から順番に見つかるまで±1を続けて全てを試していって探すプログラムが該当する
今回の場合だと与えた数から順番に見つかるまで±1を続けて全てを試していって探すプログラムが該当する
2639
2024/02/20(火) 17:18:07.59ID:X5uoFLgg 「どんなテストしたの?」
って質問だよ
って質問だよ
265デフォルトの名無しさん
2024/02/20(火) 22:00:55.76ID:e+y9lgSN266デフォルトの名無しさん
2024/02/21(水) 13:54:29.89ID:ve9Dz9D8 >>264
私は解答は提出していないが、ざっくりと自分が思いついた方法
まず、以下のような操作を考える
A. 1234という入力に対して1234321を返す
B. 1234という入力に対して12344321を返す
ここで、xという入力に対してA,Bが返す数をA(x),B(x)と表すことにする
次に、与えられた数の桁数で場合分け
(1)与えられた数字の桁数が奇数の場合
例として5桁の数字を考える
N=a*10000+b*1000+c*100+d*10+e*1 (a~eは1桁の自然数, aは0でない)
が与えられたとき、
M=a*100+b*10+c*1
とすると、N=10000の場合を除いて、Nに最も近い回文数は
A(M), A(M+1), A(M-1)
の3つの候補に絞られる(厳密にはA(M)とNとの大小比較からA(M±1)の何れかは明らかに候補にならないので2つを考えれば良い)
N=10000の場合は9999と10001が答え
(2)与えられた数の桁数が偶数の場合
例として6桁の数を考える
(1)と同様に
N=a*100000+b*10000+c*1000+d*100+e*10+f*1
に対して
M=a*100+b*10+c*1
とすると、N=100000の場合を除いて
B(M), B(M+1), B(M-1)
のどれかがNに最も近い回文数(厳密には以下略)
N=100000の場合は99999と100001が答え
十分大きな数に対しては虱潰しに回文判定していくより速く求まる
私は解答は提出していないが、ざっくりと自分が思いついた方法
まず、以下のような操作を考える
A. 1234という入力に対して1234321を返す
B. 1234という入力に対して12344321を返す
ここで、xという入力に対してA,Bが返す数をA(x),B(x)と表すことにする
次に、与えられた数の桁数で場合分け
(1)与えられた数字の桁数が奇数の場合
例として5桁の数字を考える
N=a*10000+b*1000+c*100+d*10+e*1 (a~eは1桁の自然数, aは0でない)
が与えられたとき、
M=a*100+b*10+c*1
とすると、N=10000の場合を除いて、Nに最も近い回文数は
A(M), A(M+1), A(M-1)
の3つの候補に絞られる(厳密にはA(M)とNとの大小比較からA(M±1)の何れかは明らかに候補にならないので2つを考えれば良い)
N=10000の場合は9999と10001が答え
(2)与えられた数の桁数が偶数の場合
例として6桁の数を考える
(1)と同様に
N=a*100000+b*10000+c*1000+d*100+e*10+f*1
に対して
M=a*100+b*10+c*1
とすると、N=100000の場合を除いて
B(M), B(M+1), B(M-1)
のどれかがNに最も近い回文数(厳密には以下略)
N=100000の場合は99999と100001が答え
十分大きな数に対しては虱潰しに回文判定していくより速く求まる
267デフォルトの名無しさん
2024/02/21(水) 16:02:55.06ID:Sko4Sglv268259
2024/02/21(水) 23:06:20.13ID:DX/jvS2mレスを投稿する
ニュース
- 高市首相答弁を“引き出した”立民・岡田克也氏が改めて説明「なぜ慎重な答弁をされなかったのか。非常に残念に思っている」 ★9 [ぐれ★]
- 【国際】ロシアはすでに戦争準備段階――ポーランド軍トップが警告 [ぐれ★]
- 【野球】大谷翔平、佐々木朗希、山本由伸らがWBC辞退なら広がる不協和音… 『過去イチ盛り上がらない大会』になる可能性も★2 [冬月記者★]
- 【国際】ロシアはすでに戦争準備段階――ポーランド軍トップが警告 ★2 [ぐれ★]
- 【news23】小川彩佳アナ「ここまでの広がりになるということを、高市総理はどれだけ想像できていたんでしょうね」 日中問題特集で [冬月記者★]
- 「町中華」の“息切れ倒産”が増加 ブームにも支えられ職人技で踏ん張ってきたが… 大手チェーンは値上げでも絶好調 [ぐれ★]
- ㊗157円 [194819832]
- 【高市売り】円安、止まらず!凄い勢いで暴落中。157円へ [219241683]
- PC初心者でWindows使ってるけど、作業効率一番高いOSって何よ?カスタマイズ豊富なの [916950698]
- B型のハゲが一番ヤバイ
- 【疑問】国政選挙義務投票制議論ってなんで無いの?
- 昭和時代に時計につけてたカレンダーみたいなキーキャップが発売。FILCO [737440712]
